media-viewer
Ivan Habunek 2023-11-18 21:29:20 +01:00
rodzic 7141d83c6f
commit f7540b9031
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: F5F0623FF5EBCB3D
3 zmienionych plików z 32 dodań i 31 usunięć

Wyświetl plik

@ -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.<name>]` section.

Wyświetl plik

@ -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

Wyświetl plik

@ -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):