Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/lib
diff options
context:
space:
mode:
authorAnton Hvornum <anton.feeds+github@gmail.com>2020-10-11 14:02:01 +0200
committerAnton Hvornum <anton.feeds+github@gmail.com>2020-10-11 14:02:01 +0200
commit2f5aa052a1211fc9c98bd0d5e1cf15059cd6e728 (patch)
tree12128da84447aae506f42f83dc0a68e07650bce8 /archinstall/lib
parentd043f487b2b20660e77384e734ad349fab18b3d9 (diff)
Added text-to-speach, untested but the base is now added. It routes through if available. And can be accessed with directly if needed.
Diffstat (limited to 'archinstall/lib')
-rw-r--r--archinstall/lib/general.py45
-rw-r--r--archinstall/lib/output.py50
-rw-r--r--archinstall/lib/tts.py36
3 files changed, 87 insertions, 44 deletions
diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py
index e15f9bad..393bf69a 100644
--- a/archinstall/lib/general.py
+++ b/archinstall/lib/general.py
@@ -3,13 +3,7 @@ import time, pty
from subprocess import Popen, STDOUT, PIPE, check_output
from select import epoll, EPOLLIN, EPOLLHUP
from .exceptions import *
-
-def log(*args, **kwargs):
- string = ' '.join([str(x) for x in args])
- if supports_color():
- kwargs = {'bg' : 'black', 'fg': 'white', **kwargs}
- string = stylize_output(string, **kwargs)
- print(string)
+from .output import *
def gen_uid(entropy_length=256):
return hashlib.sha512(os.urandom(entropy_length)).hexdigest()
@@ -28,43 +22,6 @@ def multisplit(s, splitters):
s = ns
return s
-# Heavily influenced by: https://github.com/django/django/blob/ae8338daf34fd746771e0678081999b656177bae/django/utils/termcolors.py#L13
-# Color options here: https://askubuntu.com/questions/528928/how-to-do-underline-bold-italic-strikethrough-color-background-and-size-i
-def stylize_output(text :str, *opts, **kwargs):
- opt_dict = {'bold': '1', 'italic' : '3', 'underscore': '4', 'blink': '5', 'reverse': '7', 'conceal': '8'}
- color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white')
- foreground = {color_names[x]: '3%s' % x for x in range(8)}
- background = {color_names[x]: '4%s' % x for x in range(8)}
- RESET = '0'
-
- code_list = []
- if text == '' and len(opts) == 1 and opts[0] == 'reset':
- return '\x1b[%sm' % RESET
- for k, v in kwargs.items():
- if k == 'fg':
- code_list.append(foreground[v])
- elif k == 'bg':
- code_list.append(background[v])
- for o in opts:
- if o in opt_dict:
- code_list.append(opt_dict[o])
- if 'noreset' not in opts:
- text = '%s\x1b[%sm' % (text or '', RESET)
- return '%s%s' % (('\x1b[%sm' % ';'.join(code_list)), text or '')
-
-# Found first reference here: https://stackoverflow.com/questions/7445658/how-to-detect-if-the-console-does-support-ansi-escape-codes-in-python
-# And re-used this: https://github.com/django/django/blob/master/django/core/management/color.py#L12
-def supports_color():
- """
- Return True if the running system's terminal supports color,
- and False otherwise.
- """
- supported_platform = sys.platform != 'win32' or 'ANSICON' in os.environ
-
- # isatty is not always implemented, #6223.
- is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty()
- return supported_platform and is_a_tty
-
def locate_binary(name):
for PATH in os.environ['PATH'].split(':'):
for root, folders, files in os.walk(PATH):
diff --git a/archinstall/lib/output.py b/archinstall/lib/output.py
new file mode 100644
index 00000000..a2711f54
--- /dev/null
+++ b/archinstall/lib/output.py
@@ -0,0 +1,50 @@
+import sys
+from .tts import TTS
+
+# Found first reference here: https://stackoverflow.com/questions/7445658/how-to-detect-if-the-console-does-support-ansi-escape-codes-in-python
+# And re-used this: https://github.com/django/django/blob/master/django/core/management/color.py#L12
+def supports_color():
+ """
+ Return True if the running system's terminal supports color,
+ and False otherwise.
+ """
+ supported_platform = sys.platform != 'win32' or 'ANSICON' in os.environ
+
+ # isatty is not always implemented, #6223.
+ is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty()
+ return supported_platform and is_a_tty
+
+# Heavily influenced by: https://github.com/django/django/blob/ae8338daf34fd746771e0678081999b656177bae/django/utils/termcolors.py#L13
+# Color options here: https://askubuntu.com/questions/528928/how-to-do-underline-bold-italic-strikethrough-color-background-and-size-i
+def stylize_output(text :str, *opts, **kwargs):
+ opt_dict = {'bold': '1', 'italic' : '3', 'underscore': '4', 'blink': '5', 'reverse': '7', 'conceal': '8'}
+ color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white')
+ foreground = {color_names[x]: '3%s' % x for x in range(8)}
+ background = {color_names[x]: '4%s' % x for x in range(8)}
+ RESET = '0'
+
+ code_list = []
+ if text == '' and len(opts) == 1 and opts[0] == 'reset':
+ return '\x1b[%sm' % RESET
+ for k, v in kwargs.items():
+ if k == 'fg':
+ code_list.append(foreground[v])
+ elif k == 'bg':
+ code_list.append(background[v])
+ for o in opts:
+ if o in opt_dict:
+ code_list.append(opt_dict[o])
+ if 'noreset' not in opts:
+ text = '%s\x1b[%sm' % (text or '', RESET)
+ return '%s%s' % (('\x1b[%sm' % ';'.join(code_list)), text or '')
+
+def log(*args, **kwargs):
+ string = ' '.join([str(x) for x in args])
+ if supports_color():
+ kwargs = {'bg' : 'black', 'fg': 'white', **kwargs}
+ string = stylize_output(string, **kwargs)
+
+ print(string)
+ with TTS() as tts_instance:
+ if tts_instance.is_available:
+ tts_instance.speak(string.replace('-', '').strip().lstrip())
diff --git a/archinstall/lib/tts.py b/archinstall/lib/tts.py
new file mode 100644
index 00000000..d94fbf1e
--- /dev/null
+++ b/archinstall/lib/tts.py
@@ -0,0 +1,36 @@
+class TTS():
+ def __init__(self):
+ try:
+ import pyttsx3
+ self._available = True
+ except:
+ self._available = False
+
+ @property
+ def available(self):
+ return self._available
+ @property
+ def is_available(self):
+ return self._available
+
+ @property
+ def volume(self):
+ return self.engine.getProperty('volume')
+
+ @volume.setter
+ def volume(self, percentage):
+ self.engine.setProperty('volume', percentage/100)
+ return self.volume
+
+
+ def speak(self, phrase):
+ if self.available:
+ self.engine.say("I will speak this text")
+ engine.runAndWait()
+
+ def __enter__(self):
+ self.engine = pyttsx3.init()
+ return self
+
+ def __exit__(self, *args, **kwargs):
+ self.engine.stop() \ No newline at end of file