From f7540b9031630d366d76f081244fd666ea977eb3 Mon Sep 17 00:00:00 2001 From: Ivan Habunek Date: Sat, 18 Nov 2023 21:29:20 +0100 Subject: [PATCH] wip --- docs/settings.md | 10 ++++++++++ toot/tui/app.py | 26 ++++++++++++++++++++++---- toot/tui/utils.py | 27 --------------------------- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/docs/settings.md b/docs/settings.md index baff676..e8a2bd4 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -37,6 +37,16 @@ verbose = false quiet = false ``` +## TUI options + +```toml +[tui] + +# Define executable to use as image viewer +# The given executable will be passed one or more images as aguments +media_viewer = "eog" +``` + ## Overriding command defaults Defaults for command arguments can be override by specifying a `[commands.]` section. diff --git a/toot/tui/app.py b/toot/tui/app.py index 6909d79..0f99647 100644 --- a/toot/tui/app.py +++ b/toot/tui/app.py @@ -1,7 +1,9 @@ import logging +import subprocess import urwid from concurrent.futures import ThreadPoolExecutor +from typing import List from toot import api, config, __version__, settings from toot.console import get_default_visibility @@ -14,7 +16,7 @@ from .overlays import ExceptionStackTrace, GotoMenu, Help, StatusSource, StatusL from .overlays import StatusDeleteConfirmation, Account from .poll import Poll from .timeline import Timeline -from .utils import get_max_toot_chars, parse_content_links, show_media, copy_to_clipboard +from .utils import get_max_toot_chars, parse_content_links, copy_to_clipboard logger = logging.getLogger(__name__) @@ -137,12 +139,13 @@ class TUI(urwid.Frame): self.exception = None self.can_translate = False self.account = None + self.followed_accounts = [] super().__init__(self.body, header=self.header, footer=self.footer) def run(self): self.loop.set_alarm_in(0, lambda *args: self.async_load_instance()) - self.loop.set_alarm_in(0, lambda *args: self.async_load_followed_accounts()) + # self.loop.set_alarm_in(0, lambda *args: self.async_load_followed_accounts()) self.loop.set_alarm_in(0, lambda *args: self.async_load_timeline( is_initial=True, timeline_name="home")) self.loop.run() @@ -496,9 +499,24 @@ class TUI(urwid.Frame): promise.add_done_callback(lambda *args: self.close_overlay()) def show_media(self, status): - urls = [m["url"] for m in status.original.data["media_attachments"]] + urls: List[str] = [m["url"] for m in status.original.data["media_attachments"]] + if not urls: + return + + viewer = settings.get_setting("tui.media_viewer", str) + if not viewer: + self.footer.set_error_message("Media viewer not configured") + + # TODO: this breaks in an ugly way if viewer is not found, handle this + def _show(): + if viewer: + subprocess.run([viewer] + urls, capture_output=True) + + def _done(): + self.footer.set_message(f"Launched media viewer with {len(urls)} URL(s).") + if urls: - show_media(urls) + self.run_in_thread(_show, done_callback=_done) def show_context_menu(self, status): # TODO: show context menu diff --git a/toot/tui/utils.py b/toot/tui/utils.py index 734ae32..86c7dc4 100644 --- a/toot/tui/utils.py +++ b/toot/tui/utils.py @@ -1,7 +1,5 @@ import base64 import re -import shutil -import subprocess import urwid from functools import reduce @@ -47,31 +45,6 @@ def highlight_hashtags(line): return hline -def show_media(paths): - """ - Attempt to open an image viewer to show given media files. - - FIXME: This is not very thought out, but works for me. - Once settings are implemented, add an option for the user to configure their - prefered media viewer. - """ - viewer = None - potential_viewers = [ - "feh", - "eog", - "display" - ] - for v in potential_viewers: - viewer = shutil.which(v) - if viewer: - break - - if not viewer: - raise Exception("Cannot find an image viewer") - - subprocess.run([viewer] + paths) - - class LinkParser(HTMLParser): def reset(self):