More pep8 fixes. A tiny bit of refactoring.

This commit is contained in:
Storm Dragon
2025-07-07 00:42:23 -04:00
parent d28c18faed
commit 3390c25dfe
343 changed files with 11092 additions and 7582 deletions

View File

@@ -2,15 +2,18 @@
# -*- coding: utf-8 -*-
# Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributers.
# By Chrys, Storm Dragon, and contributors.
# generic driver
from fenrirscreenreader.core import debug
from threading import Thread, Lock
from queue import Queue, Empty
import shlex
from subprocess import Popen
import subprocess
from queue import Empty
from queue import Queue
from subprocess import Popen
from threading import Lock
from threading import Thread
from fenrirscreenreader.core import debug
from fenrirscreenreader.core.speechDriver import speech_driver
@@ -33,22 +36,29 @@ class driver(speech_driver):
def initialize(self, environment):
self.env = environment
self.minVolume = self.env['runtime']['SettingsManager'].get_setting_as_int(
'speech', 'fenrirMinVolume')
self.maxVolume = self.env['runtime']['SettingsManager'].get_setting_as_int(
'speech', 'fenrirMaxVolume')
self.minPitch = self.env['runtime']['SettingsManager'].get_setting_as_int(
'speech', 'fenrirMinPitch')
self.maxPitch = self.env['runtime']['SettingsManager'].get_setting_as_int(
'speech', 'fenrirMaxPitch')
self.minRate = self.env['runtime']['SettingsManager'].get_setting_as_int(
'speech', 'fenrirMinRate')
self.maxRate = self.env['runtime']['SettingsManager'].get_setting_as_int(
'speech', 'fenrirMaxRate')
self.minVolume = self.env["runtime"][
"SettingsManager"
].get_setting_as_int("speech", "fenrirMinVolume")
self.maxVolume = self.env["runtime"][
"SettingsManager"
].get_setting_as_int("speech", "fenrirMaxVolume")
self.minPitch = self.env["runtime"][
"SettingsManager"
].get_setting_as_int("speech", "fenrirMinPitch")
self.maxPitch = self.env["runtime"][
"SettingsManager"
].get_setting_as_int("speech", "fenrirMaxPitch")
self.minRate = self.env["runtime"][
"SettingsManager"
].get_setting_as_int("speech", "fenrirMinRate")
self.maxRate = self.env["runtime"][
"SettingsManager"
].get_setting_as_int("speech", "fenrirMaxRate")
self.speechCommand = self.env['runtime']['SettingsManager'].get_setting(
'speech', 'genericSpeechCommand')
if self.speechCommand == '':
self.speechCommand = self.env["runtime"][
"SettingsManager"
].get_setting("speech", "genericSpeechCommand")
if self.speechCommand == "":
self.speechCommand = 'espeak -a fenrirVolume -s fenrirRate -p fenrirPitch -v fenrirVoice -- "fenrirText"'
if False: # for debugging overwrite here
# self.speechCommand = 'spd-say --wait -r 100 -i 100 "fenrirText"'
@@ -70,13 +80,13 @@ class driver(speech_driver):
if not queueable:
self.cancel()
utterance = {
'text': text,
'volume': self.volume,
'rate': self.rate,
'pitch': self.pitch,
'module': self.module,
'language': self.language,
'voice': self.voice,
"text": text,
"volume": self.volume,
"rate": self.rate,
"pitch": self.pitch,
"module": self.module,
"language": self.language,
"voice": self.voice,
}
self.textQueue.put(utterance.copy())
@@ -97,22 +107,26 @@ class driver(speech_driver):
self.proc.kill()
self.proc.wait(timeout=1.0)
except Exception as e:
self.env['runtime']['DebugManager'].write_debug_out(
'speech_driver:Cancel:self.proc.terminate():' + str(e), debug.DebugLevel.WARNING)
self.env["runtime"]["DebugManager"].write_debug_out(
"speech_driver:Cancel:self.proc.terminate():" + str(e),
debug.DebugLevel.WARNING,
)
try:
self.proc.kill()
# Wait after kill to prevent zombies
self.proc.wait(timeout=1.0)
except Exception as e:
self.env['runtime']['DebugManager'].write_debug_out(
'speech_driver:Cancel:self.proc.kill():' + str(e), debug.DebugLevel.WARNING)
self.env["runtime"]["DebugManager"].write_debug_out(
"speech_driver:Cancel:self.proc.kill():" + str(e),
debug.DebugLevel.WARNING,
)
self.proc = None
finally:
# Ensure lock is always released, even if process termination fails
self.lock.release()
def set_callback(self, callback):
print('SpeechDummyDriver: set_callback')
print("SpeechDummyDriver: set_callback")
def clear_buffer(self):
if not self._is_initialized:
@@ -127,8 +141,9 @@ class driver(speech_driver):
def set_pitch(self, pitch):
if not self._is_initialized:
return
self.pitch = str(self.minPitch + pitch *
(self.maxPitch - self.minPitch))
self.pitch = str(
self.minPitch + pitch * (self.maxPitch - self.minPitch)
)
def set_rate(self, rate):
if not self._is_initialized:
@@ -148,8 +163,9 @@ class driver(speech_driver):
def set_volume(self, volume):
if not self._is_initialized:
return
self.volume = str(self.minVolume + volume *
(self.maxVolume - self.minVolume))
self.volume = str(
self.minVolume + volume * (self.maxVolume - self.minVolume)
)
def worker(self):
while True:
@@ -163,68 +179,73 @@ class driver(speech_driver):
elif not isinstance(utterance, dict):
continue
# no text means nothing to speak
if 'text' not in utterance:
if "text" not in utterance:
continue
if not isinstance(utterance['text'], str):
if not isinstance(utterance["text"], str):
continue
if utterance['text'] == '':
if utterance["text"] == "":
continue
# check for valid data fields
if 'volume' not in utterance:
utterance['volume'] = ''
if not isinstance(utterance['volume'], str):
utterance['volume'] = ''
if 'module' not in utterance:
utterance['module'] = ''
if not isinstance(utterance['module'], str):
utterance['module'] = ''
if 'language' not in utterance:
utterance['language'] = ''
if not isinstance(utterance['language'], str):
utterance['language'] = ''
if 'voice' not in utterance:
utterance['voice'] = ''
if not isinstance(utterance['voice'], str):
utterance['voice'] = ''
if 'pitch' not in utterance:
utterance['pitch'] = ''
if not isinstance(utterance['pitch'], str):
utterance['pitch'] = ''
if 'rate' not in utterance:
utterance['rate'] = ''
if not isinstance(utterance['rate'], str):
utterance['rate'] = ''
if "volume" not in utterance:
utterance["volume"] = ""
if not isinstance(utterance["volume"], str):
utterance["volume"] = ""
if "module" not in utterance:
utterance["module"] = ""
if not isinstance(utterance["module"], str):
utterance["module"] = ""
if "language" not in utterance:
utterance["language"] = ""
if not isinstance(utterance["language"], str):
utterance["language"] = ""
if "voice" not in utterance:
utterance["voice"] = ""
if not isinstance(utterance["voice"], str):
utterance["voice"] = ""
if "pitch" not in utterance:
utterance["pitch"] = ""
if not isinstance(utterance["pitch"], str):
utterance["pitch"] = ""
if "rate" not in utterance:
utterance["rate"] = ""
if not isinstance(utterance["rate"], str):
utterance["rate"] = ""
popen_speech_command = shlex.split(self.speechCommand)
for idx, word in enumerate(popen_speech_command):
word = word.replace('fenrirVolume', str(utterance['volume']))
word = word.replace('fenrirModule', str(utterance['module']))
word = word.replace("fenrirVolume", str(utterance["volume"]))
word = word.replace("fenrirModule", str(utterance["module"]))
word = word.replace(
'fenrirLanguage', str(
utterance['language']))
word = word.replace('fenrirVoice', str(utterance['voice']))
word = word.replace('fenrirPitch', str(utterance['pitch']))
word = word.replace('fenrirRate', str(utterance['rate']))
"fenrirLanguage", str(utterance["language"])
)
word = word.replace("fenrirVoice", str(utterance["voice"]))
word = word.replace("fenrirPitch", str(utterance["pitch"]))
word = word.replace("fenrirRate", str(utterance["rate"]))
# Properly quote text to prevent command injection
word = word.replace('fenrirText',
shlex.quote(str(utterance['text'])))
word = word.replace(
"fenrirText", shlex.quote(str(utterance["text"]))
)
popen_speech_command[idx] = word
try:
self.env['runtime']['DebugManager'].write_debug_out(
'speech_driver:worker:' + ' '.join(popen_speech_command), debug.DebugLevel.INFO)
self.env["runtime"]["DebugManager"].write_debug_out(
"speech_driver:worker:" + " ".join(popen_speech_command),
debug.DebugLevel.INFO,
)
self.lock.acquire(True)
self.proc = Popen(
popen_speech_command,
stdin=None,
stdout=None,
stderr=None,
shell=False)
shell=False,
)
self.lock.release()
self.proc.wait()
except Exception as e:
self.env['runtime']['DebugManager'].write_debug_out(
'speech_driver:worker:' + str(e), debug.DebugLevel.ERROR)
self.env["runtime"]["DebugManager"].write_debug_out(
"speech_driver:worker:" + str(e), debug.DebugLevel.ERROR
)
self.lock.acquire(True)
self.proc = None