debuged the fact that the timer required an enter to run out, also now there is a timer functionality with the --once flag

This commit is contained in:
JJJHolscher 2023-03-29 17:14:55 +02:00
parent 3e69c99523
commit a5c1a49248

152
main.py
View File

@ -1,4 +1,4 @@
#! /usr/bin/env python3 #! /home/gum/p/break/.venv/bin/python
# vim:fenc=utf-8 # vim:fenc=utf-8
# #
# Copyright © 2023 gum <gum@gums-lappy> # Copyright © 2023 gum <gum@gums-lappy>
@ -12,34 +12,23 @@ Play my playlist every few minutes.
import sys import sys
import threading import threading
from argparse import ArgumentParser from argparse import ArgumentParser
from datetime import datetime
from select import select from select import select
from subprocess import DEVNULL, Popen, run from subprocess import DEVNULL, Popen, run
from termios import TCIOFLUSH, tcflush from termios import TCIOFLUSH, tcflush
from time import sleep, time from time import sleep, time
WINDOW_TITLE = ""
class StoppableThread(threading.Thread):
"""Thread class with a stop() method. The thread itself has to check
regularly for the stopped() condition."""
def __init__(self, *args, **kwargs):
super(StoppableThread, self).__init__(*args, **kwargs)
self._stop_event = threading.Event()
def stop(self):
self._stop_event.set()
def stopped(self):
return self._stop_event.is_set()
def generate_interval(interval: int): def generate_interval(work_time: int, break_time: int):
""" """
Generate the interval between plays in seconds. Generate the interval between plays in seconds.
""" """
if interval: if work_time and break_time:
while True: while True:
yield int(interval) yield work_time
yield break_time
else: else:
# pomodoro scheme # pomodoro scheme
while True: while True:
@ -60,24 +49,103 @@ def play_playlist(playlist):
def wait_or_enter(duration, i3_focus=False): def wait_or_enter(duration, i3_focus=False):
"""
A timer that will stop if the user presses enter.
The i3_focus flag will focus the i3 window with the title "break" to prevent the user from doing other things while the timer lasts.
"""
stop = "" stop = ""
start = time() start = time()
if i3_focus:
run(
["i3-msg", f'[title="{WINDOW_TITLE}"] focus, fullscreen'],
stdout=DEVNULL,
stderr=DEVNULL,
)
while not stop and (time() - start < duration): # Run until flag is True while not stop and (time() - start < duration): # Run until flag is True
if i3_focus: if i3_focus:
run(["i3-msg", '[title=\"break\"] focus']) run(
["i3-msg", f'[title="{WINDOW_TITLE}"] focus'],
stdout=DEVNULL,
stderr=DEVNULL,
)
stop, _, _ = select([sys.stdin], [], [], 1) stop, _, _ = select([sys.stdin], [], [], 1)
tcflush(sys.stdin, TCIOFLUSH)
if i3_focus:
run(
["i3-msg", f'[title="{WINDOW_TITLE}"] move to scratchpad'],
stdout=DEVNULL,
stderr=DEVNULL,
)
if stop:
return sys.stdin.readline().strip()
else:
tcflush(sys.stdin, TCIOFLUSH)
return
def main(playlist, interval): def write_break_message(msg):
for i in generate_interval(interval): today = datetime.now().strftime("%Y-%m-%d")
play = play_playlist(playlist) minute = datetime.now().strftime("%H:%M")
print(f"playlist playing, press enter to start {i // 60} minute interval") msg = f"{minute} BREAK {msg}"
wait_or_enter(float("inf"), i3_focus=True) with open(f"/home/gum/z/{today}.md", "a") as f:
play.terminate() print(msg)
print("...") f.write(msg + "\n")
def main(playlist, work_time, break_time):
interval = generate_interval(work_time, break_time)
print(
"testing playlist, press enter to start if you hear the playlist",
end="",
flush=True,
)
play = play_playlist(playlist)
wait_or_enter(float("inf"), i3_focus=True)
play.terminate()
while True:
# work
i = next(interval)
print("work for", i // 60, "minutes", end="", flush=True)
wait_or_enter(i) wait_or_enter(i)
print("next")
# break
i = next(interval)
print("break for", i // 60, "minutes", end=" ", flush=True)
msg = wait_or_enter(i, i3_focus=bool(WINDOW_TITLE))
# start music to signal the end of a break.
if not msg:
print("> ", end="", flush=True)
play = play_playlist(playlist)
msg = wait_or_enter(float("inf"), i3_focus=bool(WINDOW_TITLE))
play.terminate()
write_break_message(msg)
def timer(playlist, duration):
print(
"testing playlist, press enter to start if you hear the playlist",
end="",
flush=True,
)
play = play_playlist(playlist)
wait_or_enter(float("inf"), i3_focus=bool(WINDOW_TITLE))
play.terminate()
# work
print("wait for", duration, "seconds")
msg = wait_or_enter(duration, i3_focus=bool(WINDOW_TITLE))
# start music to signal the end of a break.
if msg is None:
print("timer is over, press enter to quit", end="", flush=True)
play = play_playlist(playlist)
wait_or_enter(float("inf"), i3_focus=bool(WINDOW_TITLE))
play.terminate()
if __name__ == "__main__": if __name__ == "__main__":
@ -88,11 +156,33 @@ if __name__ == "__main__":
help="path to the folder with the playlist to play", help="path to the folder with the playlist to play",
) )
parser.add_argument( parser.add_argument(
"--interval", "--work-time",
default=None, default=None,
type=str, type=int,
help="Interval between plays in minutes, if empty I use the pomodoro scheme.", help="Interval between plays in minutes, if empty I use the pomodoro scheme.",
) )
parser.add_argument(
"--break-time",
default=None,
type=int,
help="Interval between plays in minutes, if empty I use the pomodoro scheme.",
)
parser.add_argument(
"--window-title",
default=None,
type=str,
help="window title of this program, to prevent the user from doing other things during a break.",
)
parser.add_argument(
"--once",
default=None,
type=int,
help="set true for this to be a single timer",
)
args = parser.parse_args() args = parser.parse_args()
WINDOW_TITLE = args.window_title
main(args.playlist, args.interval) if args.once:
timer(args.playlist, args.once)
else:
main(args.playlist, args.work_time, args.break_time)