From ed03c7026a372ef350813cb7f6aa82afa7c5ad7a Mon Sep 17 00:00:00 2001 From: j Date: Fri, 22 Mar 2024 14:10:07 +0100 Subject: [PATCH] sync to hour, play sax inline, add s/p keybindings --- player/player.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++- title.png | Bin 0 -> 8278 bytes 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 title.png diff --git a/player/player.py b/player/player.py index 74800e9..62a6579 100755 --- a/player/player.py +++ b/player/player.py @@ -8,6 +8,7 @@ import time from threading import Thread from datetime import datetime +import ox import mpv @@ -53,11 +54,22 @@ class Sync(Thread): def __init__(self, *args, **kwargs): self.is_main = kwargs.get('mode', 'main') == 'main' + self.start_at_hour = kwargs.get("hour", False) self.sock = self.init_socket() self.main = Main() if self.is_main: self.socket_enable_broadcast() + if kwargs.get("sax"): + self.sax = mpv.MPV( + log_handler=mpv_log, input_default_bindings=True, + input_vo_keyboard=True, + ) + self.sax.loop_file = True + self.sax.play("/srv/t_for_time/render/Saxophone-5.1.mp4") + else: + self.sax = None + if mpv.MPV_VERSION >= (2, 2): self.mpv = mpv.MPV( log_handler=mpv_log, input_default_bindings=True, @@ -79,6 +91,8 @@ class Sync(Thread): self.mpv.loop_file = False self.mpv.loop_playlist = True self.mpv.register_key_binding('q', self.q_binding) + self.mpv.register_key_binding('s', self.s_binding) + self.mpv.register_key_binding('p', self.p_binding) self.playlist = kwargs['playlist'] self.playlist_mtime = os.stat(self.playlist).st_mtime self.mpv.loadlist(self.playlist) @@ -90,6 +104,30 @@ class Sync(Thread): time.sleep(0.1) self.mpv.pause = True self.sync_to_main() + elif self.start_at_hour: + self.mpv.pause = True + fmt = '%Y-%m-%d %H' + now = datetime.now() + offset = (now - datetime.strptime(now.strftime(fmt), fmt)).total_seconds() + if self.sax: + self.sax.seek(offset, 'absolute', 'exact') + self.sax.pause = True + position = 0 + for idx, item in enumerate(self.mpv.playlist): + duration = ox.avinfo(item['filename'])['duration'] + if position + duration > offset: + pos = offset - position + self.mpv.playlist_play_index(idx) + self.mpv.pause = False + self.mpv.wait_until_playing() + self.mpv.seek(pos, 'absolute', 'exact') + time.sleep(0.1) + break + else: + position += duration + if self.sax: + self.sax.pause = False + self.ready = True Thread.__init__(self) self.start() @@ -116,6 +154,16 @@ class Sync(Thread): self.stop() self.mpv.stop() + def s_binding(self, *args): + self.mpv.pause = True + if self.sax: + self.sax.pause = True + + def p_binding(self, *args): + self.mpv.pause = False + if self.sax: + self.sax.pause = False + def stop(self, *args): self.active = False if self.sock: @@ -302,6 +350,8 @@ def main(): parser.add_argument('--prefix', help='video location', default=prefix) parser.add_argument('--window', action='store_true', help='run in window', default=False) parser.add_argument('--debug', action='store_true', help='debug', default=False) + parser.add_argument('--hour', action='store_true', help='hour', default=False) + parser.add_argument('--sax', action='store_true', help='hour', default=False) args = parser.parse_args() DEBUG = args.debug @@ -311,7 +361,7 @@ def main(): base = os.path.dirname(os.path.abspath(__file__)) #os.chdir(base) - player = Sync(mode=args.mode, playlist=args.playlist, fullscreen=not args.window) + player = Sync(mode=args.mode, playlist=args.playlist, fullscreen=not args.window, hour=args.hour, sax=args.sax) while player.active: try: player.mpv.wait_for_playback() diff --git a/title.png b/title.png new file mode 100644 index 0000000000000000000000000000000000000000..c92b10e1bdfed63f87b11db517cd3f2d176428eb GIT binary patch literal 8278 zcmeH}dpMNa9>^O5ivwALz1KtgWB7rCij{ecS4;?B%9nNwe4ck zG^j~(C%H{B24l#*W(#xQ41`#I;o^Y8g<*7Lm2`#kTv-u3(aKHs&zzxS4tqmBHA zZ5sdp@^-dX&HzZo03c~3Ee@afmb)s$n@o`H*-!vg(wVB?0N5dIXJz4XEr-p} z_d}jm2SMXSX&NV;ZWYFR^e6>k=A7c}TT+cRUfHWW)KS=Xupp(}DP>abdrzU|MN3(O z#V(~2a@+fzDb`;1vlMENil4aM7hhQ0^g!vk0n@9BW7eA5ai4uMhZ#uV%nXGKOc?XD z(dZIkGNK_OAR-_lAR-_lAR-_lAR-_lAR_QT3E1qGj$2vcWVDS}S65FS^YQgfQ%JGQ z%+0;K7Gakp0p7QLB|nw`z-TpYM^)s?Vt2=KJBs-LQ(TlwLXt?N(a}*mn_!Ich6L2m zwNYuU!T$cN%uJ&?88H|#2AkS8o`sjh|B}(RC-R)&02<9S^fDqzQ0N&hh8#i0~F`5{kjwv2#>Fw>cJ1Pml{014}%l(Fi2zJ!!0u9d@I<|K! z00mEN%_V>;SzBAzEmEoXS)oe^1Y$cnYVb?k$jC@x zVd0B&B`$8B%-Th6dU|@jf-p@$aIx$jdR%`?TRP6KFX4#B^i8ac{JN~qwDq9CcU5Z| zPPul=qbf+FpD{S-@J~e;Tg48>h9gL)CkD>Kud`4Lcv9qmUg~%JS0QUGr*{i$y8@2-@R+# zNecY^_dQVo`WbC^;ka{Weqq5N$IZjT1B=be%)EK%6!&AdbRgr+mI~Q~y3fx}>v_CU zu6~Clq6za;weeC6E$i^!*cx2?RQ$z#(s2WoftNFfcG;O$(SgFYwY#^QTPl`4LiWYH3BQ(%w0qhHJRj?z*a{bTecV zj@+JHendhdkq;d-J3<~hOe`^@1Ci0qdUC?WbJnX(t~h>_*9HYEHMy=V^vB?No8M(QDjD0+{w+&^^98H zla66j1@Cg(xhubugK|B6nnt5_=9z}C@)l-enN`6>3uBi(Gb@J(-*WLox3DRllPDDG zc(B11VG%}WnvsraTNpDu{xUblvO+ZGKtY6=6lZ{MclDn@uX zLlZPwz<1%qB$KT8vGPQ#`p`?d8JigCIqg10PqU(vogmS^mAB>P!NcG1g0v?#1$M?TC+rmqML9XS8;pumgiGXp zV$Iq%)9-ZO{3~yHP?+*FtZPP$KE2*So-L`oyxec;({c1=ld;~?b0#Jx-b)kh+2vm( zK*1%YE&z5v*FgS&@5yTWQ79EQwwgdD6@OdcF(`Nwr2RSQ4-2&uvd|&w7H4N?V?QM) zCnvH$fBx)TqO6sfv{5~gt$n(z;UD6_d}()q7_jXd2&_?KuPqJ)UQSZJ-AJh3ew7)) zZSVLaYJTd3uf!oG0iWCHopkVl?^!H1`OvSt=BBQ$E^pd8P;h{_M-3K7e8ZjWw4vzB zp2y*EH~bsIj2U$5JDVly>xku$S1Uu|oJO74$VC?250%}%w^|$oiT@pWc-X5i8S(Wp zd-~JU?#So4(+61@QlOyuzrOQeScu%!wsWC%!wu|B7ryWPt|~~CH)gJ4hoHX`e{0|Xq%b!WM~}mX5zi$J|z0%onl~zg3y|j zdS5&>@WBKJ1^tTSuvn_W4)cFO-}FPJweH>`13<9Qf>U19tnsw_SBK*__A9jdkRl@^ zy_Z_kv~1K7rv3ziaewtywwrS*0E$VH(ClSaMv~MYF*c(4FW4z_b8~+9>(`fWUU-zW zZ{NNIc53RTY^WIF;m@hs>6q;7Y;U}m*N%)fa+O(Ht9wn9DPauCY5JsZ%3|a8!_osV z-pP|EleX!4%Y&f%KdBEva_a1;~y(`}k-& zC_MQzT~bmKVOCR70e1_@Wv{{E!>Y$jIV)eE5i!M7yJmvhSjg+l1?@a^bky)1rZ{Bo zOXDv2y??lsF1BjrTX|-}G~f#1OEad|zyAh{7kEWS3zoT)*`7!M9PbFhnHHYWdE#8+ zhtW^R$ip)!C->H`Wo&G$p`k&h!Fr?dY=RxsJ&Z>!wr_1*2i^-##7V$*eL@F;=1mpB zG!{QVH#EV|w3yX=`B&o?3g;c=)hp%bmWhc8xXfIFBrumS5$aSoIOtB*2z%sKYP}0K zUk}GKd((BXZ!_D*o0^(n8_sH5C@U+|)zic05U^*@PVcY7b_J=ZF0@MH8|e)QVeS_FvM zd{tA}mxmMJe@W0tT@=Nw^uuwGSq!C(-3e)e_Yc@PZ|0TBTa0TBTa0TBTa0TBTa h0TF@!6M>w^0`Vt^P(}6yl#4K=-BCxYvLjw`{{|x-$SeQ= literal 0 HcmV?d00001