From 197de5380a9c84cb8ff7ced04cfcb09bc9fa5aa7 Mon Sep 17 00:00:00 2001 From: Dennis Eckerskorn Date: Wed, 11 Dec 2024 13:09:10 +0100 Subject: [PATCH] Implemented radio player --- src/main.py | 2 - src/resources/internet-radio.com.playlist.m3u | 1 + src/services/Radio_Player.py | 38 +++++++++++ .../__pycache__/Radio_Player.cpython-313.pyc | Bin 0 -> 2782 bytes .../__pycache__/scrapper.cpython-313.pyc | Bin 7828 -> 7535 bytes .../system_monitor.cpython-313.pyc | Bin 5049 -> 5631 bytes .../threads_manager.cpython-313.pyc | Bin 9582 -> 10253 bytes src/services/threads_manager.py | 12 +++- .../centered_window.cpython-313.pyc | Bin 13139 -> 17051 bytes src/ui/centered_window.py | 60 +++++++++++++++++- 10 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 src/resources/internet-radio.com.playlist.m3u create mode 100644 src/services/Radio_Player.py create mode 100644 src/services/__pycache__/Radio_Player.cpython-313.pyc diff --git a/src/main.py b/src/main.py index 68495be..2e8efb1 100644 --- a/src/main.py +++ b/src/main.py @@ -9,5 +9,3 @@ def main(): if __name__ == "__main__": main() - - #self.tasks["scrapper"].start(self.scrapper.start_scraping) \ No newline at end of file diff --git a/src/resources/internet-radio.com.playlist.m3u b/src/resources/internet-radio.com.playlist.m3u new file mode 100644 index 0000000..7f48395 --- /dev/null +++ b/src/resources/internet-radio.com.playlist.m3u @@ -0,0 +1 @@ +http://uk2.internet-radio.com:8024/ diff --git a/src/services/Radio_Player.py b/src/services/Radio_Player.py new file mode 100644 index 0000000..428b769 --- /dev/null +++ b/src/services/Radio_Player.py @@ -0,0 +1,38 @@ +import vlc +import time +from services.threaden_task import ThreadenTask + +class RadioPlayer: + def __init__(self): + self.player = vlc.MediaPlayer() + self.thread_task = ThreadenTask() + self.running = False + + def play(self, url): + """Reproduce la emisora de radio desde la URL proporcionada.""" + try: + if self.running: + self.stop() + self.thread_task.start(self.play_radio, url) + self.running = True + except Exception as e: + print(f"Error al reproducir la emisora: {e}") + + def play_radio(self, url): + """Método interno para manejar la reproducción de la radio.""" + try: + self.player.set_media(vlc.Media(url)) + self.player.play() + while self.thread_task.running: + time.sleep(0.1) + except Exception as e: + print(f"Error en la reproducción de la radio: {e}") + + def stop(self): + """Detiene la reproducción de la emisora de radio.""" + try: + self.thread_task.stop() + self.player.stop() + self.running = False + except Exception as e: + print(f"Error al detener la reproducción: {e}") \ No newline at end of file diff --git a/src/services/__pycache__/Radio_Player.cpython-313.pyc b/src/services/__pycache__/Radio_Player.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2bbd35ba4aafa2b2f8779a4a0101fae2335ef09 GIT binary patch literal 2782 zcmb7`U1$_n6oBvS>?Hd$=4XvDb*-7K6uVNkEm0byF>az#8WZfUDU>V>)7_ix*v-uL z&a6}sDnd&N6{#5P&x`#5>sz2N_N5SoJ|`I1Fs4uKi_iy2D7E&b=iK?pW|Ka6*}Ze_ zJ?EaebLKne&ialWF#_$MkKZj1N`(B51HXkmVf_#Yb0kml!Wd!hRbT>)Lt~-0L?$Yv zhonee+(Yu=!y$JS3zvno^cV*dX~B`tz0astqQ*JR`k?5VxV_*F)?Wc(juZ%bW}&>m z#C&KEVPW*kqiXwwoi(_H*|_S5#hgHf^LpX zLGQMlw?}`B*AzMI4JSz@&`-7cHVs-oE)Wl}#oO{$Ch5?`>2!-DUZ@nE_&6=;n!7cp zrOLO+a5qle=Alq+h=kM1YKEa3We8E&qLpb2A3$;5EDjbXEy}FINeX(a@J@czEYY*f zJWq?ZRT!^TY&~18=4jO{Sgcq8+Y5S;S_K{v)xB?~deMofs&44EsybZ_!OHlvEpR)l z54tO4wfluz<_+^<_kr2)=ke9#fp3n_hLRWMF_#&g1(h2yh_^K z!`}|ik1optE6Lv3lh@8XU2X4KCqi^^RqkBuIyC?G{ODq0pe`R-l8^lRLtkdZ*%9;qwv8vY-t?I4;8z{w%hO)W(L4e!2H}r0e0(QrQCpqCD#|d^9f?;|mIRrngqI?=K0_fpDimCHqi#2LNZcm= z8HT{=ZpPnDCDd7;K<6ewRsia+k9{^)m;09Fz907ANq?9AarFDlviy3W!JJr@_pKzl z>xtA-B2`Zugx@OUP3%VO%l@0~PeihFccboM;^5Oi++@iLJX?<5%iil>ObplM6HD?5 zo-J9yOP7&dBS~^U85R#!pIDuH(JT)gq9a9z8tNso zvn=o5LQGO=teZoegg5R9^VVYGXk9+GBp>4>3_Y`u%d1C^lV4(4MO=uqWs^`kC6Lo% z!`3m*6X_@(^@cV>;i!+P>I@uC6_jOF{jjE0JWac*PV3CFE4o1qQ&m|zEOv7WZ{|Ma zE>(ro#@36fX4_1EuVzzARqqnki6&Ud7?Q_36f8`+Psv(HlwMqmMWn&Cu85Qs{_1L# zhTJu1m6muOGX-R)+y7w6xL-rm;NL_13(0kU5X?4i=tPdWPjsB&cOq7DeyYF$BM6U3 V>=B9oMqd3p+$RjJ5$O2J{{R8}GXnqs literal 0 HcmV?d00001 diff --git a/src/services/__pycache__/scrapper.cpython-313.pyc b/src/services/__pycache__/scrapper.cpython-313.pyc index a37199b14e4816ce7678981f4abffd49547cd288..6c9e88baaacc0eaf766eeaf281ab66e42967797c 100644 GIT binary patch delta 1965 zcmZ8hZA@EL7(S=>qqpCMeo;!>%hzaOurk&G8w?qReK~a0noZQEg9~FqThDDxbSB%> zM3>F6d0eLc0X5Mq{+S^$@rO=j=nwzUgbges!NmAek*^kHFktA0HiZd~V(=Xhtyo#!%g8L}-v>Tg;+3jEkO(Mm13`hQ^DJ zfH5>6(1g%n*v#hXb>WD>MTK^bc8fmxsZdP=qMhTSBJC0@J(?}d+O5n%iJlSt_1PNW z?H!lZA(BX^$C9J+%L!RgGqWGcN>Wx%D?{0#vDukqQ$PJcEUyf5c`=h9qe>>v!=mQJ z;e;}gN(MEg9*D?xdPi*V1|{NRPclH>0?F|#8IO;U)I>ZxMt#~d?zdp)99lJ4COalO z?iowwOWPKV?Muc|I;FkrxdaMaLxYcW_>U$u%gB_ENPU$T4lFsheMa6b3Z~eS}lY3M{f7Dgg zy;2iVGD>nxNe-uEWn4~^)R3a4)8Mo0d^sSFKLrDD$;2iozGR>QJElA;2 z$+#$$=cMvQXlQ~^MVRx^Jm zKwct>nocEECC{s=Y?}1baM+>eo|6vZ9rz%wOc7tOw$*|%t>Df>AbrfYV$_HLnjeKhTGYX&&hV(&PG zKoZCB5bTU{F`R|UNmmc@KvJ*)_U%VTZwNlx<no-M^!Q)3!E-7}4{r=)g|8^Y`jsQbHJy^DCCN^+k z60puD1GL-ySeLeNDS3V@qfF%W=>$=dg<(n9m5>?+CmGZNs9J#H4avnTYNlVh<=ro` zye)qCea=;Xvw7ZCKko`(;g@W#s~t;r_iA+=-Btd!^oJi= zY!4sE^yl(gnKkk26+I%F-d_VaE9!d!+^p5yQ_am*3q66EI!`mk1N20NTzZ;)lW8qK zI!YtGSmDKQ(i;`G_O?Kr9Ar@FIaWx7jV{s%kaxu6Y9^5x8;U0~88UVX=9kXUCO&o$br{?AVvs#<6{|9TM}CAM#_IpC$n(D56QKoLmBFF(xr4ZQ_`< zEwz9uD)oV)LVzto>I0M~KvmVBNLBk%pfq_xRZI~M4oIo`R;g-8sfwzq?XH7Kgt`yk z&d$uv&CY!@zqNkYA^mPJ2!O1cE8)0m{X%NvY+E1z7k~=GV1il-D-4EM{J6}4zv4_K zTv4ksILqy3p~_-6zlVdWCdlAQ-sOw)BWq4vGYLqS0^+=1d(_#N7#|&v;;3N7|L_|s zud{hR9Yyh2Iu;==7u6zpMjB3;slI#U9bk-PP5h7Cb20nF$u}=Dhf{cnAJGv(L~B zVGlklZ4yT+NCJg5Hz-B)DA5;Pt6D-y834xc`$z;1JWXMnwB z={EFA;5)_FtJmDtbbH9*`|3u5vknKvfY8fp=ky$r=Om%Gk)5-Z_SUjTn(<-iqCNNx8BPazix7e>Fu{gd(tl)L zv6`?3|En)!*=C4Om%C(DGhErkG?S}zkw#^Q$|x0iB5H=LMUh< zZlLNDTsJomUfr?N+NbFw5%8PVCHnxf5YaEKjtDv(5TzjM!h3C9-qqig7m`sFOBCiM z8m3lKVt@`%sG@%jZo>;UW#kQ_NO?(-$pn$i(-YGZAN#J>U8&1?0$EQW=Lz2R1eY1f z5Q0lq$Hn6pk6+V#X1s39)pTTQI&w9g*_zG;*}mYdzS?=EGv{r|dRx9eGVg7f_jco2 z`)Os_L52wpd+No&_dP+%@Z0vPN*76DroP7tZuxe!k!{v0^aR=2N~x!boo(WJf-|}e z4G?zWR)=Da(~Rj~R1`$V0jk9l4kvsEpK{!2Yodx?3WbKI%tYG?P6YC0kw_{XO^=U8 zqUkgmKbT3!QjtiZnq)I!$#xfJJmr#lvNmW70Phgpa5H14KA}~Gz&PPC51m%x_^-tX~ R2yKr6#pSoyQm83>;Xhn$v}*tW diff --git a/src/services/__pycache__/system_monitor.cpython-313.pyc b/src/services/__pycache__/system_monitor.cpython-313.pyc index 489773bf969ac4b6fa6e6dd79ac5d366c53c4a3c..0fd80e4eaf9ee1d29aa2831a404f55eba12245b2 100644 GIT binary patch delta 1372 zcmaJ>O>7%Q6y90yY}bxsCvhDAU}rb~b{*SwA{PXSngRt?p=pU@l#+wl*ppyoV_UQ9 zkd{g*oLrSlH8;co6(q`uqMQ&?)dO5BxruPJLV^QlR1%?zUdkK0sSrp!tv}EE-ZyV| z=e@VzO*~C_j=H;D0$AwY^7>x)Eze{0JCjjTT#?x=Il^xCy25$Ez+A#DEv(3$l^`s- z*;y1v9>CymPEI*Ms2m4R3E(-8y}YpKXV<*y?hj}RAwPR8z7)LLzd)=Hs&qrkoBBG@ zV)L)2&3L?v%{WqLy%k~=%GE-#TCZ4ynzpw_$yT{qHw&GJ-BqmB3pGNEq+;2<>mY{! zPgkh(bnJ#>0u8Wl9j7NhhNrkL97JOKO6WixYDoJ^xXu_Mw{HQ(tWJ zOq5RwFb>E6YhISud$$`>rPnijx z;(P`m?zKg0!^Uq=eUs1uHsP#}X~5gqDq9Az@fr`<*w9yrK@)u2B!_YKy>k%7nC(>2 z#O@R4XQD64x5;{~Mk*!SVUP+9u&>>TE{*Hs98R)d-1F#_-9-0~2t8qccxs}ES&tH! z%{i8Y7)ZG39zj@nUYR8!i#mKxN+&s>7CWKQQo9E9zPFYJ2v%gdXYWwuE-1En}nr%PDjRX zTxhw6o9^MyGxz$xEZ!OYqI`GccJ==BzWYt4_l#cVm9QnFY+5#^dS#t-QVwt$>ub;^ zyiVYCPJ_2KEpb@oPy~2Zy7#oXxlZZwK-yvU)Eh?U*=EICg;ay_U*JIj^!SMr)=BuND}^Y zDA@&jq`WjL#Ko)G*L0&;H*^iIEn-xQ<&s{~N<_2Zh0QfWNu^lUIYCKDBNdI$OsXuv zgT*n0!U{A5V7peYSi~%tFdH-s#Lh88NpTC58W(wrbqWdFg9Ec>ySTj2-f6qI@Y!0i zs+MjPHdamk8Td!zM|c)Bcg3{G=7nmdY*lIMKZE!Vh|C>cg6qO>A+;4sKMbY!LYao= zz(3ORr<(rM-TqeQTr+d7mATY}%YUii`rnwEgb98m3x2iPpSWW+ebWu)S8t%v=aWMV2tvkC*HA>M^-U zNDE}VBZ?Ea&PzFFS8?llrRZJUxc>72UBJyzj zjwrk%9VOC-{`R9(*RFi%PaMS(yYhoZu;o$GQGG8b2}!_b+U`$^V9m!<@QWr}d&P%^ zr&R00n}y0dq084v)asN^_L3}22gchjpnXt43ppNp!=abCzR7qDo&`$1DPec0U9=76 z&~+M!TT{SgXo2UU?=H=nP7^XuNuMUp5_Fm`Sfy`nR&-+Fq5}IT*)+GIi5yn za6`F9MyoHBPlUXNT&OI|RFdFZL)5bnzzL41QbE$_9LGj@55j{uC!kTsZ;7epbz66} zEu*-}7tlWkZ_h6KW`$}^gAyKwTv%Pg$vCo6v}}iR-7GLSHil-ZuiK2{+%UazO`^heSOS@^x;Ii3`FDlHT7 zs>`xRf>lo(wj;sqp;K#*q>&2#dVb9=GLxyyP|c6~;vPzBo~iD3lq^-x*%jSjR#x-6 z9W;p?M=lrhmPYCgSXfbYj~GX1>gHX`W}CAmvuKxi_P=GDz-_}uEZmMA>3b;hWO#4v z@fb{e4Rsy(yLd#{HOg^*ybXa@%W-bJ9rjwrJ5*FV5q*dy1Xkp6_}Ma*Y^CwqpiE~- xtuaEAwR9t$s3n3l^QX;2yWwhdfLwyD=n$ENchPQQ!npXby=cJebH!O?)v;eA1}FKfoqnai|dzV?rVX%Y#1peP_29VtjPc{qssxd3a++B$?j65FfXr;W(8FoR9$SpxFclyC{mQlbBj<{0f2&Z~;Bu_> zR`+tGfxWq0({d}ZT-n4fEyvq#4gTqON4-~^A9vqSfpxDJl-jEa9%3$%$jjS!1R+?IT(sp9>sz@twg`+?xO%#)&&?+48;%th} zAWwGni@Hb@=WwbP)|%Y_v%+lIfT#-8UquVReeHRz_WnNoWk?HMV5|w<1>l?G8YSt zFn3V1bj{HIn~lUE#D?jF99p@&N_e0q`dAGS$5WiTe?_=Hh0e?hfLWp9q3m0ds~6?! zCAn@3^x9m(U$N?8di;Guh$;)m4~1x>MRXb50X^>ek* zI_R)2xif?Zrfmo+LX^$PO&wuq+U14(c-qoZ7DjBQvgs+Uq$Iip=GTW0O6BH3%Y5U_NLOw@yHZefSQ=pw7l&( zbRnbVEj?$@z38%37(`nO1}*Ny9S!VJtjfC<`O$?3!LP;FG1W!iJkkD=qhh|fE82rg zIHA4R;(kivK-%al0Op!9aHNwxDQ_dE7NX%FMB--;BJ(87-jBBXv1<9rW@kY|-$c8} zTkJ_?4GUM+k{Ii({BZYS+wUR-qyVHn^n*w~|^4j*Ho zsGg!CFbB4bdo6uRvmHk6ye*p+oxm=q+LqE2V0k^vRnd>aRyqX0;~MMfDSAXr*fqdo zr4vj{u=%Pl))Q(}e?~}vmBr?pHUv>DBK{J7;p}WVwwGLFk@z79{8T*QDvE$zkJlu* z3Qpn?)(GElM2VZU-MvHosl$g(*v`KGkrO-#yfjR_X~v*POK0AOXU5z&ko@hsT9KS) z_4RGNJd3W9sdQdXLG|0tjBZ_|3ht1pX6AE-so73oFm2+E1xDd1QjuX->f6X=_GNv3 zoq{gqCE~);d@MpT&%Mmcbh^AR2WiZiim4k4sFv3FQclI7G q=60~GYA z(FkbOA`pbj1__}SgeZtbQ6x6d1yUD)Kqykw&#>tNA(cf{+662S;@xK_HBa(=Z{Fv= zd(S!d`R#popOqhYy)J<@{m1Fb)zFe0CP$VAro&+&BTU+&!lZpj#AQLCo(fSMOBY9% z?)8u4w+1MEi`#ty?J|&ys8VPj%#wJNY znidvt2XC7M_GMlBI_O>-O_L$g8nbou$y-HG#BoIe5VxchyXkILi&afGN?KVpW&MP1 zsI_9Pu2qdXg@44n+{I2QqG{FDg~QYjTP!CdUN)ugVP;Xd8S7tlgl{G@=dG)b82n<1 zxc_w9dR*tNZ@KQt@V8|UmTlj#1nTy1CWNjmw3~G_z>I0DsRpfDt_fiwtc1 zF6w1kYE-ofM})@k7+y(35OZgVA9lK<0ghOL&FZKq4%AWiCR+|?{)J2KL%Ev{&pWOQ zu6MVuIFdIUxfMt5;?!remu7GDjjr^Kt~z$zcKbl|yhb9+XFb=+o>oLvMz+qVHR=sh zYS5}?P~@mZj-56&jRn?b%(QBynrd2&l76&U@=QBKA%p5}l)jw60WTYZQn-NwwrOmL>388Zv1Ko4l$ zUb27rboVupcwjVqnKAK4c%v7Y;L$BEGPPzSPmnn%Muu7Px3kB<8}$$ELPt+A!-~dJ zZc?ghMiFD<$*rHoU06bNFEb_PBMP->B7mB_gH@|IxoYSjd>Bm(A%Lb-I?TL0%x$fd zo@a~n8D@Agb0Z_P2WK*HH<}`cK#qOc=4LhaF(F3?%;LNQI zi!cf|lwghd+5EC6XC9+nY~uW^HY^teA>N z)f1+*Ts2OZmL^?*pL*jqp3?!i+nXoHVMC_ThU8La8)0w8ui4YPv20HUcGnqWbv>;RX{TpJB6c{AR=$3|XZ!V}$(nYp_($^KZHIVlIWgQVo K?7o1O@Ba@jwxksR diff --git a/src/services/threads_manager.py b/src/services/threads_manager.py index 3daed0c..051b9d3 100644 --- a/src/services/threads_manager.py +++ b/src/services/threads_manager.py @@ -7,23 +7,33 @@ from services.threaden_task import ThreadenTask from services.system_monitor import SystemMonitor from services.tetris_game import TetrisGame from services.scrapper import Scrapper +from services.Radio_Player import RadioPlayer class ThreadsManager: """Constructor""" def __init__(self, ui_instance): self.ui_instance = ui_instance self.system_monitor = None + self.radio_player = RadioPlayer() self.tasks = { "time": ThreadenTask(), "temperature": ThreadenTask(), "emails":ThreadenTask(), "tetris_game":ThreadenTask(), "scrapper":ThreadenTask(), + "radio_player": ThreadenTask(), } self.system_monitor_tasks = {} self.scrapper = Scrapper(ui_instance) - + + def play_radio(self, url): + """Inicia la reproducción de radio en un hilo.""" + if not self.tasks["radio_player"].running: + self.tasks["radio_player"].start(self.radio_player.play, url) + def stop_radio(self): + """Detiene la reproducción de radio.""" + self.radio_player.stop() def set_system_monitor(self, system_monitor): """Asigna el monitor del sistema y crea sus tareas""" diff --git a/src/ui/__pycache__/centered_window.cpython-313.pyc b/src/ui/__pycache__/centered_window.cpython-313.pyc index 9421f4177f85fc1abbe54f0d5906e5cb2e828679..02fb587f5109a037597cdf22dee8e7074f79e67d 100644 GIT binary patch delta 6383 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 bi|hK-nzZmk{5g+u@! zBhC>QbD4eXk;)M_bDMqfh-bvhyfIQonu%l!6RF}1O~&|@zF<&5jf60Nj>hdP*d1HC zGnB|+Z@sN?$o(l8IZIw8X9%MbVHSxpLGth{JsM@+6!{!wzE%?V8lEAgs4Gm#p2!!o z>imjl`H$3YsX;x4N1tMfoJ~*5MLDN1X5}9XFHt{#(Rw@TLqhGN!rkd~zL?k3Y47q^ z#1Tt-06A_=mzka}snTvxRu7{Z1&FaWKo;T;Dq3lRhwP_q9Waog{N6y-@>TmAlm>Xh z8KHfA*xB8^^)a~!e1FOUwV2KnR885zzvFzav7`=o>&*cjbnX5(0nhShds=wG^_Ded zNxEQ*!+gN)a&JosD2Gkn#?N-fJk8`}Q1VFLexWF)L_Qd+=0DjLt@TNQ;yNG`HAUg;mC zNBNjPK|A;}{`VS>fWRXR{2oOZ0~qB`1)c!ri-9?Moc}w}^BMdxJ{s&o&B61)zZ2a5 z8T@1Xa8<&J@#j~owoV+vbq@lpd<`Hju#@m-RAkg?$cZc)gfH;1%rYEOhRHKC`C{&} z?{HCPYIZiG#0qjOl{^}!hHs`IXOt+@@dM!5CBs=z>nHxdNnVC8OunqQOlm)ZYVr|}hMp1c21rw!*N5M-9{)|%=lL(foA|?U5#rw% z579-w82Ok!$rtK-EXN6d#nXJf!Rl~IwvD{LzQxJ!Mrzyw&R5-)-30_Mm~Ri}y#P zmSluCS)i~dYp}v|cWs3e>cR)WfYQSA(PP#CtjZUAn)wIOR$CBFIL&|HZK!A_DZ5ma z;=aaeyHpJxtW^!TQr23s84b7lq#7(brj*l^s!fq(E6&ks{^Q2T|CQixHZ}ll%=0N) z=epwf`huy7Px!atHA!yf-;VWqYX~{LP9@0%|5L2iA4&-x(rb~zQe>mLEC^6HX^b4Q zj6#B8rGzR|KQuzjFl1L7jvj{|rJ44ZNh&SKWgRx=~>4`8=J26Vvel#F|kU z_9Xz2p1>)`m^`QCsYZpA*B~8albOGU3auL&Hr6ui*}NuC z7L+VxIcBl07%oik^n5;>Q*`!aT=feGR{-L)WC1k|z3i0mii{nCY-HyMaiZ0xV+VPA zbI-y!ilq=vplmJ6VSfrC4`2x6$BrA;eaFU!4JRb(xI8(RSLO{t&SpykV8^6-ktL99 z)#XWz*-*F&0khQzXo{ZJE}^UGX%((;*aj6R{NM`zusKN2^M5uc0wPNEAxr~cYV-b< zPWn7oS`zdUzuvOTW?tz%{QZ`8TLC!Q@b%U-P4bD>>gAVPZ&G`jl2DSe4xVZIZp2iz z6ZMs^gtbS(Ro>FRiGGhCZpZ39-+sR4TmOxAjXwn1+q|J81hgF;i_NIgaKcps9_4UD zAJ@FZf8Wtg-{mykKs%Nj<993zdr`G{w1!aHIy5EgQ0vWo#~f!*;jjRYq#LChfStkt zry1akT7ca$LyO0IB?|!YeHQCSlhla=51!Q1ASP|i60E3=nD!OHT-Z9jU~Urn z3g(qgD9+*i7k6%0XE-NSxGbjAli;d(L~U?7$B&J&A0i!1HC*}PIki;iHN!S17iJZW zokvBM(uMIl^fk0Bwss`8z)sz(3%NFQ8$8&%0&)LW?}Y#HFu%i#+hXazq7oOtBKd>e zebdwaJ9`Jit1@n9zl1;bD+Iio%!f)TCBBNE=F!CDhzo{&bhe=92WMtJ{Kjk8R`#%) zIOFF{d$;%EOPGZaA_!dwJqTA3t|2TTbR&QhguTOG+nZR}1YPqTytj0r*>MWNgA-V_ zK6-&Xv_!=I)d9PhSgmo2wX5|l;^x&cx>Iajy+{QZ^;yLDYNbVNTdfR>eXF~@;*N)H zRE*yx0H&*^&UnCZXJ$1Bihd!F4}RvwDq>Wuf4;(VgPTtpb?|DN%V!j=d+otqe*6na z50|HBm2xuuTXweogxNiKP?&AlNt6 F{s-ufIj;Z! diff --git a/src/ui/centered_window.py b/src/ui/centered_window.py index da5bba4..b9db71f 100644 --- a/src/ui/centered_window.py +++ b/src/ui/centered_window.py @@ -4,11 +4,13 @@ import webbrowser import subprocess import os import threading +from tkinter import filedialog from services.threads_manager import ThreadsManager from services.processes_manager import ProcessManager from services.tetris_game import TetrisGame from services.system_monitor import SystemMonitor +from services.Radio_Player import RadioPlayer class CenteredWindow(ctk.CTk): @@ -128,8 +130,11 @@ class CenteredWindow(ctk.CTk): tab_view.pack(fill=ctk.BOTH, expand=True) # Crear pestañas y manejar contenido por separado - for tab_name in ["Scrapping", "Navegador", "Correos", "Juego", "Sistema"]: + for tab_name in ["Scrapping", "Radio", "Correos", "Juego", "Sistema"]: tab = tab_view.add(tab_name) + + if tab_name == "Radio": + self.create_radio_tab(tab) if tab_name == "Scrapping": text_widget = ctk.CTkTextbox(tab, width=500, height=400) @@ -249,4 +254,55 @@ class CenteredWindow(ctk.CTk): def dummy_action(self): - print("Acción no implementada") \ No newline at end of file + print("Acción no implementada") + + def create_radio_tab(self, tab): + """Crea la interfaz para la funcionalidad de emisoras de radio.""" + self.radio_player = self.thread_manager.radio_player + + # Lista de emisoras + radio_stations = { + "Box Radio UK": "http://uk2.internet-radio.com:8024/", + "Radio 2": "http://stream-url-2.com/stream", + "Radio 3": "http://stream-url-3.com/stream", + } + + # Dropdown para seleccionar emisora + self.selected_station = ctk.StringVar(value="Selecciona una emisora") + station_menu = ctk.CTkOptionMenu(tab, variable=self.selected_station, values=list(radio_stations.keys())) + station_menu.pack(pady=10) + + # Botón para reproducir + play_button = ctk.CTkButton( + tab, + text="Reproducir", + command=lambda: self.start_radio(radio_stations[self.selected_station.get()]) + ) + play_button.pack(pady=5) + + # Botón para detener + stop_button = ctk.CTkButton( + tab, + text="Detener", + command=self.stop_radio, + state=tk.DISABLED # Deshabilitado inicialmente + ) + stop_button.pack(pady=5) + + # Guardar referencias para habilitar/deshabilitar botones + self.radio_controls = {"play_button": play_button, "stop_button": stop_button} + + def start_radio(self, url): + """Inicia la reproducción de radio y actualiza los botones.""" + if url == "Selecciona una emisora": + tk.messagebox.showwarning("Advertencia", "Por favor, selecciona una emisora válida.") + return + self.radio_player.play(url) + self.radio_controls["play_button"].configure(state=tk.DISABLED) + self.radio_controls["stop_button"].configure(state=tk.NORMAL) + + def stop_radio(self): + """Detiene la reproducción de radio y actualiza los botones.""" + self.radio_player.stop() + self.radio_controls["play_button"].configure(state=tk.NORMAL) + self.radio_controls["stop_button"].configure(state=tk.DISABLED) \ No newline at end of file