mirror of
https://github.com/ihabunek/toot.git
synced 2024-09-22 04:25:55 -04:00
wip
This commit is contained in:
parent
7141d83c6f
commit
f7540b9031
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user