From fd1f560f7410b04554d2cb8fc219b3022be7251e Mon Sep 17 00:00:00 2001 From: Abhorrent_Anger Date: Fri, 15 Jan 2021 23:20:48 +0200 Subject: [PATCH] Start and end sound support --- eyestrainreminder/EyeStrainReminder.py | 53 +++++++++++++++++++------ eyestrainreminder/files/ptt-e.wav | Bin 0 -> 5440 bytes eyestrainreminder/files/ptt-s.wav | Bin 0 -> 14792 bytes 3 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 eyestrainreminder/files/ptt-e.wav create mode 100644 eyestrainreminder/files/ptt-s.wav diff --git a/eyestrainreminder/EyeStrainReminder.py b/eyestrainreminder/EyeStrainReminder.py index 8f5414c..3d1e928 100755 --- a/eyestrainreminder/EyeStrainReminder.py +++ b/eyestrainreminder/EyeStrainReminder.py @@ -18,63 +18,76 @@ MILLISECOND = 1000 MINUTE = 60 DIR = os.path.dirname(os.path.abspath(__file__)) -icon = mute = disable_notifs = invert_icons = notify_thread = sound = None +icon = mute = disable_notifs = invert_icons = notify_thread = start_sound = end_sound = None + def init(): print("Initializing EyeStrainReminder...") notify2.init(NAME) + def create_tray_icon(): global icon image = get_image() icon = pystray.Icon(NAME, image, NAME, generate_menu_items()) icon.run() + def update_icon(): global icon image = get_image() icon.icon = image + def get_image(): theme = [[DIR + "/files/eye_light.png", DIR + "/files/eye_dark.png"], - [DIR + "/files/eye_dark.png", DIR + "/files/eye_light.png"]] + [DIR + "/files/eye_dark.png", DIR + "/files/eye_light.png"]] return Image.open(theme[invert_icons][disable_notifs]) -def generate_menu_items(): + +def generate_menu_items(): menu_items = [] menu_items.append(item('Mute' if not mute else 'Unmute', toggle_mute)) - menu_items.append(item('Do Not Disturb' if not disable_notifs else 'Enable Notifications', toggle_notifications)) + menu_items.append(item( + 'Do Not Disturb' if not disable_notifs else 'Enable Notifications', toggle_notifications)) menu_items.append(menu.SEPARATOR) menu_items.append(item('Exit', exit)) return menu_items + def toggle_mute(): global mute mute = not mute update_menu() + def toggle_notifications(): global disable_notifs disable_notifs = not disable_notifs update_menu() update_icon() + def exit(): global icon icon.stop() os._exit(0) + def update_menu(): global icon icon.menu = generate_menu_items() icon.update_menu() + def uninit(): notify2.uninit() + def wait(): sleep(TIMEOUT*MINUTE) + def send_notification(): if not disable_notifs: notify(MESSAGE) @@ -84,30 +97,41 @@ def send_notification(): sleep(10) notify(MESSAGE_MISSED) + def notify(message): print(message) - notification = notify2.Notification(NAME, message, "notification-device-eject") + notification = notify2.Notification( + NAME, message, "notification-device-eject") notification.set_timeout(TIMEOUT * MILLISECOND) notification.set_urgency(notify2.URGENCY_LOW) notification.show() - play_sound() + play_sound(start_sound) sleep(TIMEOUT) notification.close() - play_sound() + play_sound(end_sound) -def play_sound(): + +def play_sound(sound): if not mute: playsound(sound) + def parse_args(): parser = argparse.ArgumentParser() - parser.add_argument("-i", "--invert_icons", action="store_true", default=False, help="Default to the dark icon for light themes") - parser.add_argument("-m", "--mute", action="store_true", default=False, help="Mute notification sounds by default") - parser.add_argument("-n", "--disable_notifs", action="store_true", default=False, help="Disable notifications by default") - parser.add_argument("-s", "--sound", action="store", default=DIR + "/files/default.wav", help="Custom notification sound") + parser.add_argument("-i", "--invert_icons", action="store_true", + default=False, help="Default to the dark icon for light themes") + parser.add_argument("-m", "--mute", action="store_true", + default=False, help="Mute notification sounds by default") + parser.add_argument("-n", "--disable_notifs", action="store_true", + default=False, help="Disable notifications by default") + parser.add_argument("-ss", "--start_sound", action="store", default=DIR + + "/files/ptt-s.wav", help="Custom start notification sound") + parser.add_argument("-es", "--end_sound", action="store", default=DIR + + "/files/ptt-e.wav", help="Custom end notification sound") args = parser.parse_args() globals().update(args.__dict__) + def notification_loop(): init() while 1: @@ -115,12 +139,15 @@ def notification_loop(): send_notification() uninit() + def main(): parse_args() - notify_thread = threading.Thread(target=notification_loop, name="Notify Thread") + notify_thread = threading.Thread( + target=notification_loop, name="Notify Thread") notify_thread.start() create_tray_icon() notify_thread.join() + if __name__ == '__main__': main() diff --git a/eyestrainreminder/files/ptt-e.wav b/eyestrainreminder/files/ptt-e.wav new file mode 100644 index 0000000000000000000000000000000000000000..2e2815c954ae35ad2a041fe87b5e725c5eeaa8cc GIT binary patch literal 5440 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 literal 0 HcmV?d00001 diff --git a/eyestrainreminder/files/ptt-s.wav b/eyestrainreminder/files/ptt-s.wav new file mode 100644 index 0000000000000000000000000000000000000000..a2407eb1847264aaf38c45f389979844bc9162d3 GIT binary patch literal 14792 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 literal 0 HcmV?d00001