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:
parent
3e69c99523
commit
a5c1a49248
152
main.py
152
main.py
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user