Added comments

This commit is contained in:
Ninnjah 2020-10-30 01:50:29 +03:00 committed by GitHub
parent c3c1880349
commit 4829149082
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

195
main.py
View file

@ -43,42 +43,58 @@ class MainUi(QtWidgets.QMainWindow, ui_sundpood.Ui_MainWindow):
###! JSON !### ###! JSON !###
def jsonread(file): ## Чтение JSON def jsonread(file):
'''
Чтение JSON файла file
file - имя JSON файла, может содержать полный или относительный путь
'''
with open(file, "r", encoding='utf-8') as read_file: with open(file, "r", encoding='utf-8') as read_file:
data = json.load(read_file) data = json.load(read_file)
return data return data
def jsonwrite(file, data): ## Запись JSON def jsonwrite(file, data):
'''
Запись в JSON файл file данные data
file - имя JSON файла, может содержать полный или относительный путь
data - данные, может быть словарем/списком/кортежем/строкой/числом
'''
with open(file, 'w', encoding='utf-8') as write_file: with open(file, 'w', encoding='utf-8') as write_file:
write_file.write(json.dumps(data)) write_file.write(json.dumps(data))
###! FUNCTIONS !### ###! FUNCTIONS !###
def find_device(list_): # Поиск микшера VoiceMeeter def find_device():
msg = QtWidgets.QMessageBox() '''
Ищем устройство device и возвращаем его индекс
'''
list_ = list(sd.query_devices()) # Список устройств вывода звука
device = 'VoiceMeeter Input' # Имя искомого устройства
msg = QtWidgets.QMessageBox() # Окно ошибки (Устройство не найдено)
msg.setIcon(QtWidgets.QMessageBox.Critical) msg.setIcon(QtWidgets.QMessageBox.Critical)
msg.setText("You don't install VoiceMeeter") msg.setText("You don't install VoiceMeeter")
msg.setInformativeText('install VoiceMetter from "redist" folder or download it from \nvb-audio.com/Voicemeeter') msg.setInformativeText('install VoiceMetter from "redist" folder or download it from \nvb-audio.com/Voicemeeter')
msg.setWindowTitle('Error') msg.setWindowTitle('Error')
index = 0
device = 'VoiceMeeter Input'
found = False
for i in list_: for i in list_:
if device not in i['name']: if device in i['name']:
index += 1 return i['name']
elif device in i['name']:
found = True
break
if found == False:
msg.exec_() msg.exec_()
exit() exit()
return index def sound_get():
'''
def sound_get(): # Сбор файлов Сбор всех аудифайлов
def check_format(name, format_): # Проверка слова до точки с конца строки '''
suf = '' def check_format(name, format_):
'''
Проверка формата файла name
name - название файла, только название
format_ - нужный формат
'''
suf = '' # Суффикс
while name[-1] != '.': while name[-1] != '.':
suf += name[-1] suf += name[-1]
name = name[:-1] name = name[:-1]
@ -94,7 +110,15 @@ def sound_get(): # Сбор файлов
else: else:
return False return False
def sound_convert(path, name, format_): # Конвертация из форматов 'mp3' 'm4a' в format_ def sound_convert(path, name, format_):
'''
Конвертация файла name в папке path в формат format_
по средством ffmpeg.exe
path - папка с файлом, может содержать полный или относительный путь
name - название файла, может только название файла
format_ - формат в который нужно конвертировать
'''
if os.path.exists('ffmpeg.exe'): if os.path.exists('ffmpeg.exe'):
old_name = name old_name = name
if check_format(name, ['mp3', 'm4a']): if check_format(name, ['mp3', 'm4a']):
@ -106,13 +130,13 @@ def sound_get(): # Сбор файлов
os.remove(f'{os.path.join(path, old_name)}') os.remove(f'{os.path.join(path, old_name)}')
return name return name
msg = QtWidgets.QMessageBox() msg = QtWidgets.QMessageBox() # Окно ошибки (Не найдены файлы в папке 'sound')
msg.setIcon(QtWidgets.QMessageBox.Critical) msg.setIcon(QtWidgets.QMessageBox.Critical)
msg.setText("You don't have any sounds in 'sound' folder") msg.setText("You don't have any sounds in 'sound' folder")
msg.setInformativeText('download sound in .wav / .mp3 / .m4a format') msg.setInformativeText('download sound in .wav / .mp3 / .m4a format')
msg.setWindowTitle('Error') msg.setWindowTitle('Error')
ffmsg = QtWidgets.QMessageBox() ffmsg = QtWidgets.QMessageBox() # Окно ошибки (Не найден ffmpeg.exe)
ffmsg.setIcon(QtWidgets.QMessageBox.Warning) ffmsg.setIcon(QtWidgets.QMessageBox.Warning)
ffmsg.setText("You don't have ffmpeg.exe in the program root folder") ffmsg.setText("You don't have ffmpeg.exe in the program root folder")
ffmsg.setInformativeText('download ffmpeg from ffmpeg.org for converting sound files') ffmsg.setInformativeText('download ffmpeg from ffmpeg.org for converting sound files')
@ -122,8 +146,9 @@ def sound_get(): # Сбор файлов
if len(os.listdir('sound')) == 0: if len(os.listdir('sound')) == 0:
msg.exec_() msg.exec_()
menu = [] menu = [] # Оверлейное меню
sounds_list = ['sound\\'] sounds_list = ['sound\\'] # Начальная категория
sounds = [] # Все аудиофайлы
for i in os.listdir('sound'): for i in os.listdir('sound'):
if os.path.exists('ffmpeg.exe') or not ffmsg: if os.path.exists('ffmpeg.exe') or not ffmsg:
if os.path.isfile(os.path.join('sound', i)): if os.path.isfile(os.path.join('sound', i)):
@ -151,7 +176,6 @@ def sound_get(): # Сбор файлов
pass pass
menu.append(sounds_list) menu.append(sounds_list)
sounds = []
for i in os.listdir('sound'): for i in os.listdir('sound'):
if os.path.isfile(os.path.join('sound', i)): if os.path.isfile(os.path.join('sound', i)):
if check_format(i, 'wav'): if check_format(i, 'wav'):
@ -196,23 +220,29 @@ def sound_get(): # Сбор файлов
os.mkdir('sound') os.mkdir('sound')
msg.exec_() msg.exec_()
def save(): # Сохранение списка хоткеев def save():
hotkeys = {} '''
sounds = jsonread('settings.json')['sounds'] Сохранение настроек оверлея и глобальных хоткеев
'''
hotkeys = {} # Словарь хоткеев и аудиофайлов
sounds = jsonread('settings.json')['sounds']# Все аудиофайлы
KEYS_JSON = {} # Настроенные клавиши
for i in range(len(COMBOS)): for i in range(len(COMBOS)):
hotkeys.setdefault(HOTKEYS[i].text(), COMBOS[i].currentText()) hotkeys.setdefault(HOTKEYS[i].text(), COMBOS[i].currentText())
KEYS_JSON = {}
for i in KEYS_CMD.keys(): for i in KEYS_CMD.keys():
KEYS_JSON.setdefault(COMMAND_DICT[i], KEYS_CMD[i]) KEYS_JSON.setdefault(COMMAND_DICT[i], KEYS_CMD[i])
sounds_list = {'sounds':sounds, 'hotkeys':hotkeys, 'menu':menu, 'KEYS_CMD':KEYS_JSON} sounds_list = {'sounds':sounds, 'hotkeys':hotkeys, 'menu':menu, 'KEYS_CMD':KEYS_JSON}
jsonwrite('settings.json', sounds_list) jsonwrite('settings.json', sounds_list)
KEYS_JSON = None
hotkeys = None
sounds = None
def play_sound(index): # Проигрываение звука def play_sound(index):
'''
Проигрывание звука
index - может быть индексом комбобокса с именем
или '' для проигрывания выбранного в оверлее имени
'''
try: try:
filename = COMBOS[index].currentText() filename = COMBOS[index].currentText()
try: try:
@ -228,8 +258,18 @@ def play_sound(index): # Проигрываение зву
except: except:
pass pass
def hotkey_remap(btn): # Переназначение хоткеев def hotkey_remap(btn):
'''
Переназначение хоткея
btn - индекс кнопки хоткея в списке HOTKEYS
'''
def check(key): def check(key):
'''
Проверка кнопки btn на не участие
в списке запрещенных клавиш keys.forbidden
если это клавиша 'Key.backspace' то стираем значение
key - pynput код клавиши
'''
button = HOTKEYS[btn] button = HOTKEYS[btn]
key = str(key).replace("'",'') key = str(key).replace("'",'')
@ -253,7 +293,18 @@ def hotkey_remap(btn): # Переназначение хо
hotkey_remap_Listener.start() hotkey_remap_Listener.start()
def pref_remap(btn, func_): def pref_remap(btn, func_):
'''
Переназначение клавиши в окно Preference
btn - PyQt5 кнопка
func_ - строковое значени функции из словаря KEYS_CMD
'''
def check(key): def check(key):
'''
Проверка кнопки btn на не участие
в списке запрещенных клавиш keys.forbidden
если это клавиша 'Key.backspace' то стираем значение
key - pynput код клавиши
'''
key = str(key).replace("'",'') key = str(key).replace("'",'')
if key not in keys.forbidden: if key not in keys.forbidden:
func = find_key(COMMAND_DICT, func_) func = find_key(COMMAND_DICT, func_)
@ -277,13 +328,23 @@ def pref_remap(btn, func_):
save() save()
def find_key(dict, val): def find_key(dict, val):
'''
Поиск ключа в словаре dict по значению val
dict - словарь
val - значение
'''
return next(key for key, value in dict.items() if value == val) return next(key for key, value in dict.items() if value == val)
###! CONTROL !### ###! CONTROL !###
def select_move(mode): def select_move(mode):
select[1] += mode[1] '''
select[0] += mode[0] Перемешение по оверлейному меню
mode - кортеж из двух цифр
(смещение по категории, смещение по списку)
'''
select[0] += mode[0] # Категории
select[1] += mode[1] # Файлы в категории
if select[0] > len(menu)-1 or select[0] < -len(menu)+1: if select[0] > len(menu)-1 or select[0] < -len(menu)+1:
select[0] = 0 select[0] = 0
if select[1] > len(menu[select[0]])-1 or select[1] < -len(menu[select[0]])+1: if select[1] > len(menu[select[0]])-1 or select[1] < -len(menu[select[0]])+1:
@ -293,20 +354,27 @@ def select_move(mode):
over.label.setText(menu[select[0]][select[1]]) over.label.setText(menu[select[0]][select[1]])
win.select_label.setText(menu[select[0]][select[1]]) win.select_label.setText(menu[select[0]][select[1]])
def key_check(key): # Хоткеи def key_check(key):
key_n = '' '''
key = str(key).replace("'",'') Проверка клавиши key на наличие записанных функций
key - pynput код клавиши
'''
key = str(key).replace("'",'') # Преобразование кода в строку
key_n = '' # Переведенное значение клавиши
try: try:
key_n = keys.dict_[key] key_n = keys.dict_[key]
except KeyError: except KeyError:
pass pass
print(f'{key_n} in {HOTKEYS_CMD} -- {key_n in HOTKEYS_CMD}')
if key_n in HOTKEYS_CMD: if key_n in HOTKEYS_CMD:
play_sound(HOTKEYS_CMD.index(key_n)) play_sound(HOTKEYS_CMD.index(key_n))
elif key in KEYS_CMD.values(): elif key in KEYS_CMD.values():
find_key(KEYS_CMD, key)() find_key(KEYS_CMD, key)()
def main(): # Интерфейс def main():
'''
Открытие окна win, запуск слушателя клавиатуры,
подключение кнопок интерфейса к функциям
'''
win.show() win.show()
key_check_Listener = Listener( key_check_Listener = Listener(
@ -345,11 +413,11 @@ def main(): # Интерфейс
if __name__ == '__main__': if __name__ == '__main__':
### Создание окна ### ### Создание окна ###
app = QtWidgets.QApplication([]) app = QtWidgets.QApplication([]) # Приложение
over = OverlayUi() over = OverlayUi() # Окно оверлея
pref = PreferencesUi() pref = PreferencesUi() # Окно настроек
win = MainUi() win = MainUi() # Основное окно
COMBOS = [ COMBOS = [ # Список комбобоксов в win
win.combo0, win.combo0,
win.combo1, win.combo1,
win.combo2, win.combo2,
@ -362,7 +430,7 @@ if __name__ == '__main__':
win.combo9, win.combo9,
win.combo10, win.combo10,
win.combo11,] win.combo11,]
HOTKEYS = [ HOTKEYS = [ # Список кнопок хоткеев в win
win.hotkey_1, win.hotkey_1,
win.hotkey_2, win.hotkey_2,
win.hotkey_3, win.hotkey_3,
@ -375,7 +443,7 @@ if __name__ == '__main__':
win.hotkey_10, win.hotkey_10,
win.hotkey_11, win.hotkey_11,
win.hotkey_12,] win.hotkey_12,]
PREF_BTN = [ PREF_BTN = [ # Список кнопок настроек клавиш в pref
pref.select_move_up, pref.select_move_up,
pref.select_move_down, pref.select_move_down,
pref.select_move_left, pref.select_move_left,
@ -384,26 +452,26 @@ if __name__ == '__main__':
pref.stop_sound,] pref.stop_sound,]
### Поиск устроства ввода ### ### Поиск устроства ввода ###
list_ = list(sd.query_devices()) sd.default.device = find_device() # Установка устройства вывода по умолчанию
index = find_device(list_) sound_get() # Сбор всех аудиофайлов
sd.default.device = list_[index]['name']
sound_get()
### Глобальные переменные ### ### Глобальные переменные ###
sound_get_dict = jsonread('settings.json') sound_get_dict = jsonread('settings.json')# Загрузка данных
hotkeys = sound_get_dict['hotkeys'] hotkeys = sound_get_dict['hotkeys'] # Загрузка словаря хоткеев
menu = sound_get_dict['menu'] menu = sound_get_dict['menu'] # Загрузка оверлейного меню
select = [0, 0] select = [0, 0] # Установка курсора оверлея в нулевую позицию
COMMAND_DICT = { COMMAND_DICT = { # Словарь функций к строковому значению
lambda: select_move([0, -1]):'select_move_up', # вверх lambda: select_move((0, -1)):'select_move_up', # вверх
lambda: select_move([0, 1]) :'select_move_down', # вниз lambda: select_move((0, 1)) :'select_move_down', # вниз
lambda: select_move([-1, 0]):'select_move_left', # влево lambda: select_move((-1, 0)):'select_move_left', # влево
lambda: select_move([1, 0]) :'select_move_right', # вправо lambda: select_move((1, 0)) :'select_move_right', # вправо
lambda: play_sound('') :'play_sound', # Играть lambda: play_sound('') :'play_sound', # Играть
lambda: sd.stop() :'stop_sound', # Остановить lambda: sd.stop() :'stop_sound', # Остановить
} }
KEYS_CMD = COMMAND_DICT.copy() KEYS_JSON = sound_get_dict['KEYS_CMD']# Загрузка настроенных клавиш
KEYS_JSON = sound_get_dict['KEYS_CMD'] KEYS_CMD = COMMAND_DICT.copy() # Настроенные клавиши
### Установка настроенных клавиш ###
for i in KEYS_CMD.keys(): for i in KEYS_CMD.keys():
KEYS_CMD.update({i:KEYS_JSON[COMMAND_DICT[i]]}) KEYS_CMD.update({i:KEYS_JSON[COMMAND_DICT[i]]})
KEYS_JSON = None KEYS_JSON = None
@ -413,6 +481,7 @@ if __name__ == '__main__':
PREF_BTN[combo].setText(keys.dict_[i]) PREF_BTN[combo].setText(keys.dict_[i])
combo += 1 combo += 1
### Установка хоткеев ###
combo = 0 combo = 0
for i in hotkeys.items(): for i in hotkeys.items():
index = COMBOS[combo].findText(i[1]) index = COMBOS[combo].findText(i[1])
@ -421,7 +490,7 @@ if __name__ == '__main__':
combo += 1 combo += 1
combo = None combo = None
HOTKEYS_CMD = [ HOTKEYS_CMD = [ # Имена связанные с хоткеями
HOTKEYS[0].text(), HOTKEYS[0].text(),
HOTKEYS[1].text(), HOTKEYS[1].text(),
HOTKEYS[2].text(), HOTKEYS[2].text(),