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 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 ## Overriding command defaults
Defaults for command arguments can be override by specifying a `[commands.<name>]` section. Defaults for command arguments can be override by specifying a `[commands.<name>]` section.

Wyświetl plik

@ -1,7 +1,9 @@
import logging import logging
import subprocess
import urwid import urwid
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from typing import List
from toot import api, config, __version__, settings from toot import api, config, __version__, settings
from toot.console import get_default_visibility 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 .overlays import StatusDeleteConfirmation, Account
from .poll import Poll from .poll import Poll
from .timeline import Timeline 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__) logger = logging.getLogger(__name__)
@ -137,12 +139,13 @@ class TUI(urwid.Frame):
self.exception = None self.exception = None
self.can_translate = False self.can_translate = False
self.account = None self.account = None
self.followed_accounts = []
super().__init__(self.body, header=self.header, footer=self.footer) super().__init__(self.body, header=self.header, footer=self.footer)
def run(self): 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_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( self.loop.set_alarm_in(0, lambda *args: self.async_load_timeline(
is_initial=True, timeline_name="home")) is_initial=True, timeline_name="home"))
self.loop.run() self.loop.run()
@ -496,9 +499,24 @@ class TUI(urwid.Frame):
promise.add_done_callback(lambda *args: self.close_overlay()) promise.add_done_callback(lambda *args: self.close_overlay())
def show_media(self, status): 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: if urls:
show_media(urls) self.run_in_thread(_show, done_callback=_done)
def show_context_menu(self, status): def show_context_menu(self, status):
# TODO: show context menu # TODO: show context menu

Wyświetl plik

@ -1,7 +1,5 @@
import base64 import base64
import re import re
import shutil
import subprocess
import urwid import urwid
from functools import reduce from functools import reduce
@ -47,31 +45,6 @@ def highlight_hashtags(line):
return hline 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): class LinkParser(HTMLParser):
def reset(self): def reset(self):