initial work to support timg instead of chafa

This commit is contained in:
Lionel Dricot 2022-03-16 23:58:10 +01:00
parent c9f2191f71
commit a651537052
1 changed files with 46 additions and 35 deletions

View File

@ -109,35 +109,50 @@ def wraplines(*args,**kwargs):
def wrapparagraph(*args,**kwargs):
return "\n".join(wraplines(*args,**kwargs))
_HAS_CHAFA = shutil.which('chafa')
if _HAS_CHAFA:
# starting with 1.10, chafa can return only one frame
# which allows us to drop dependancy for PIL
return_code = subprocess.run("chafa --version",shell=True, capture_output=True)
output = return_code.stdout.decode()
# with chafa < 1.10, --version was returned to stderr instead of stdout.
if output == '':
_NEW_CHAFA = False
else:
_NEW_CHAFA = True
else:
_NEW_CHAFA = False
_HAS_PIL = False
_RENDER_IMAGE = False
_HAS_TIMG = False
#_HAS_TIMG = shutil.which('timg')
if _HAS_TIMG:
chafa_inline = "timg --frames=1 -p q -g %sx1000"
chafa_cmd = "timg --frames=1 -C"
if _HAS_ANSIWRAP:
_RENDER_IMAGE = True
if _NEW_CHAFA and _HAS_ANSIWRAP:
_RENDER_IMAGE = True
else:
try:
from PIL import Image
_HAS_PIL = True
if _HAS_ANSIWRAP and _HAS_CHAFA:
_RENDER_IMAGE = True
_HAS_CHAFA = shutil.which('chafa')
if not _RENDER_IMAGE:
if _HAS_CHAFA:
# starting with 1.10, chafa can return only one frame
# which allows us to drop dependancy for PIL
return_code = subprocess.run("chafa --version",shell=True, capture_output=True)
output = return_code.stdout.decode()
# with chafa < 1.10, --version was returned to stderr instead of stdout.
if output == '':
_NEW_CHAFA = False
chafa_inline = "chafa --bg white -s %s -w 1 -f symbols"
chafa_cmd = "chafa --bg white -w 1"
else:
print("chafa and ansiwrap are required to render images in terminal")
_NEW_CHAFA = True
chafa_inline += "--animate=off "
else:
_NEW_CHAFA = False
if _NEW_CHAFA and _HAS_ANSIWRAP:
_RENDER_IMAGE = True
else:
try:
from PIL import Image
_HAS_PIL = True
if _HAS_ANSIWRAP and _HAS_CHAFA:
_RENDER_IMAGE = True
else:
print("chafa and ansiwrap are required to render images in terminal")
_RENDER_IMAGE = False
except ModuleNotFoundError:
print("python-pil, chafa and ansiwrap are required to render images")
_RENDER_IMAGE = False
except ModuleNotFoundError:
print("python-pil, chafa and ansiwrap are required to render images")
_RENDER_IMAGE = False
_HAS_PIL = False
_HAS_PIL = False
_HAS_XSEL = shutil.which('xsel')
@ -727,17 +742,12 @@ class ImageRenderer(AbstractRenderer):
else:
spaces = int((term_width() - width)//2)
try:
cmd = "chafa --bg white -s %s -w 1 "%width
#if mode=="inline":
cmd += "-f symbols "
if _NEW_CHAFA:
cmd += "--animate=off "
else:
if _HAS_PIL:
img_obj = Image.open(img)
if hasattr(img_obj,"n_frames") and img_obj.n_frames > 1:
# we remove all frames but the first one
img_obj.save(img,save_all=False)
cmd += "\"%s\""%img
cmd = chafa_inline%width+ " \"%s\""%img
return_code = subprocess.run(cmd,shell=True, capture_output=True)
ansi_img = return_code.stdout.decode()
except Exception as err:
@ -751,7 +761,7 @@ class ImageRenderer(AbstractRenderer):
def display(self,mode=None,title=None):
if title:
print(title)
cmd = "chafa --bg white -w 1 \"%s\""%self.body
cmd = chafa_cmd + " \"%s\""%self.body
subprocess.run(cmd,shell=True)
return True
@ -2832,6 +2842,7 @@ Marks are temporary until shutdown (not saved to disk)."""
output += " - python-setproctitle : " + has(_HAS_SETPROCTITLE)
output += " - xdg-open : " + has(_HAS_XDGOPEN)
output += " - xsel : " + has(_HAS_XSEL)
output += " - timg : " + has(_HAS_TIMG)
if _NEW_CHAFA:
output += " - chafa 1.10+ : " + has(_HAS_CHAFA)
else:
@ -2839,7 +2850,7 @@ Marks are temporary until shutdown (not saved to disk)."""
output += " - python-pil : " + has(_HAS_PIL)
output += "\nFeatures :\n"
output += " - Render images (ansiwrap,chafa, pil|chafa 1.10+ ) : " + has(_RENDER_IMAGE)
output += " - Render images (ansiwrap, chafa|timg) : " + has(_RENDER_IMAGE)
output += " - Render HTML (bs4, readability) : " + has(_DO_HTML)
output += " - Render Atom/RSS feeds (feedparser) : " + has(_DO_FEED)
output += " - Connect to http/https (requests) : " + has(_DO_HTTP)