|
|
@ -0,0 +1,72 @@ |
|
|
|
#!/usr/bin/env python3 |
|
|
|
|
|
|
|
import os |
|
|
|
import sys |
|
|
|
import magic |
|
|
|
import subprocess |
|
|
|
import urllib.request |
|
|
|
import tempfile |
|
|
|
|
|
|
|
# Getting what's needed |
|
|
|
path = sys.argv[1] |
|
|
|
|
|
|
|
# Getting the MIME type |
|
|
|
ishttp = path.startswith('http') |
|
|
|
|
|
|
|
buf = None |
|
|
|
if ishttp: |
|
|
|
buf = urllib.request.urlopen(path) |
|
|
|
chunk = buf.read(1024) |
|
|
|
mime = magic.from_buffer(chunk, mime=True) |
|
|
|
else: |
|
|
|
assert os.path.isfile(path), f"Not a file: {path}" |
|
|
|
path = os.path.realpath(path) |
|
|
|
mime = magic.from_file(path, mime=True) |
|
|
|
mime = tuple(mime.split('/')) |
|
|
|
assert len(mime) == 2 |
|
|
|
|
|
|
|
graphical = not not os.environ.get('DISPLAY') |
|
|
|
|
|
|
|
# Some energumens |
|
|
|
if mime[0] == "application" and mime[1] in ("json", "javascript"): |
|
|
|
mime = ("text", mime[1]) |
|
|
|
|
|
|
|
# Determine stuff |
|
|
|
ex = None # Executable needed to open the file |
|
|
|
forcelocal = False # If we need to copy the file locally before opening it |
|
|
|
isterm = False # Executable should run in a terminal |
|
|
|
|
|
|
|
if mime[0] == "text": |
|
|
|
if not ishttp: |
|
|
|
ex = os.environ.get('VISUAL' if graphical else 'EDITOR', None) |
|
|
|
isterm = True |
|
|
|
elif mime[0] == "image": |
|
|
|
ex = "feh" |
|
|
|
elif mime[0] in ("audio", "video"): |
|
|
|
ex = "mpv" |
|
|
|
isterm = True |
|
|
|
elif mime == ("application", "pdf"): |
|
|
|
ex = "llpp.inotify" |
|
|
|
forcelocal = True |
|
|
|
|
|
|
|
# Open stuff |
|
|
|
tmp = None |
|
|
|
if ex: |
|
|
|
if forcelocal and ishttp: |
|
|
|
tmp = tempfile.NamedTemporaryFile(prefix='o') |
|
|
|
tmp.write(chunk) |
|
|
|
tmp.write(buf.read()) |
|
|
|
path = tmp.name |
|
|
|
else: |
|
|
|
ex = 'xdg-open' |
|
|
|
if ishttp: |
|
|
|
ex = os.environ.get('BROWSER', ex) |
|
|
|
if buf: |
|
|
|
buf.close() |
|
|
|
|
|
|
|
# TODO Launch a new terminal window for some |
|
|
|
|
|
|
|
p = subprocess.run([ex, path]) |
|
|
|
if tmp: |
|
|
|
tmp.close() |
|
|
|
sys.exit(p.returncode) |