Sundpood/main.py

286 lines
9.5 KiB
Python
Raw Permalink Normal View History

2020-09-07 15:32:38 +03:00
import os
import sys
import json
import threading
import keyboard
import soundfile as sf
import sounddevice as sd
2020-10-17 23:51:55 +03:00
from PyQt5 import QtWidgets, QtGui, QtCore
import ui_sundpood
import ui_overlay
class OverlayUi(QtWidgets.QMainWindow, ui_overlay.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_F1:
self.hide()
win.show()
class MainUi(QtWidgets.QMainWindow, ui_sundpood.Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_F1:
self.hide()
over.show()
2020-09-07 15:32:38 +03:00
###! JSON !###
def jsonread(file): ## Чтение JSON
with open(file, "r", encoding='utf-8') as read_file:
data = json.load(read_file)
return data
def jsonwrite(file, data): ## Запись JSON
with open(file, 'w', encoding='utf-8') as write_file:
write_file.write(json.dumps(data))
###! FUNCTIONS !###
def found_device(list_): # Поиск микшера VoiceMeeter
index = 0
for i in list_:
if 'VoiceMeeter Input' in i['name']:
break
index += 1
return index
def sound_get(mode): # Сбор файлов
2020-10-17 23:51:55 +03:00
if os.path.exists('settings.json') and mode == False:
sounds_list = jsonread('settings.json')
elif not os.path.exists('settings.json') or mode == True:
msg = QtWidgets.QMessageBox()
msg.setIcon(QtWidgets.QMessageBox.Critical)
msg.setText("You don't have any sounds in 'sound' folder")
msg.setInformativeText('download sound in .wav / .mp3 / .m4a format')
msg.setWindowTitle('Error')
2020-09-07 15:32:38 +03:00
if os.path.exists('sound'):
sounds = []
for i in os.listdir('sound'):
format_ = ''
name = i
if os.path.isfile(os.path.join('sound', i)):
while i[-1] != '.':
format_ += i[-1]
i = i[:-1]
format_ = format_[::-1]
if format_ == 'wav':
sounds.append(name)
2020-10-17 23:51:55 +03:00
2020-09-07 15:32:38 +03:00
if len(sounds) == 0:
msg.exec_()
exit()
2020-10-17 23:51:55 +03:00
menu = []
sounds_list = ['sound\\']
2020-10-17 23:51:55 +03:00
for i in os.listdir('sound'): # Коонвертируем файлы в .wav
name = i
format_ = ''
if os.path.isfile(os.path.join('sound', i)):
while i[-1] != '.':
format_ += i[-1]
i = i[:-1]
format_ = format_[::-1]
if format_ in ['mp3', 'm4a']:
os.system(f'ffmpeg.exe -i "sound\\{name}" "sound\\{i}wav"')
os.remove(f'sound\\{name}')
sounds_list.append(name)
2020-10-17 23:51:55 +03:00
else:
sounds_list_cat = [os.path.join('sound', i)]
for x in os.listdir(os.path.join('sound', i)): # Коонвертируем файлы в .wav
name = x
format_ = ''
if os.path.isfile(os.path.join('sound', i, x)):
while x[-1] != '.':
format_ += x[-1]
x = x[:-1]
format_ = format_[::-1]
if format_ in ['mp3', 'm4a']:
os.system(f'ffmpeg.exe -i "sound\\{os.path.join(i, name)}" "sound\\{os.path.join(i, x)}wav"')
os.remove(f'sound\\{os.path.join(i, name)}')
sounds_list_cat.append(name)
menu.append(sounds_list_cat)
menu.append(sounds_list)
2020-10-17 23:51:55 +03:00
2020-09-07 15:32:38 +03:00
if os.path.exists('settings.json'):
hotkeys = jsonread('settings.json')['hotkeys']
sounds_list = {'sounds':sounds, 'hotkeys':hotkeys, 'menu':menu}
2020-09-07 15:32:38 +03:00
else:
sounds_list = {'sounds':sounds, 'hotkeys':{'':''}, 'menu':menu}
2020-09-07 15:32:38 +03:00
for i in COMBOS:
i.addItems(sounds)
2020-10-17 23:51:55 +03:00
jsonwrite('settings.json', sounds_list)
2020-09-07 15:32:38 +03:00
else:
msg.exec_()
exit()
return sounds_list
2020-09-12 13:44:23 +03:00
def save(): # Сохранение списка хоткеев
hotkeys = {}
2020-10-17 23:51:55 +03:00
sounds = sound_get(False)
for i in range(len(COMBOS)):
print(COMBOS[i].currentText())
hotkeys.setdefault(HOTKEYS[i].text(), COMBOS[i].currentText())
print(hotkeys)
sounds_list = {'sounds':sounds, 'hotkeys':hotkeys, 'menu':menu}
jsonwrite('settings.json', sounds_list)
2020-09-07 15:32:38 +03:00
sounds = None
hotkeys = None
2020-09-12 13:44:23 +03:00
def play_sound(index): # Проигрываение звука
2020-10-17 23:51:55 +03:00
try:
filename = COMBOS[index].currentText()
2020-10-20 23:41:25 +03:00
try:
data, fs = sf.read(os.path.join('sound', filename), dtype='float32')
sd.play(data, fs)
keyboard.wait(sd.play())
sd.wait()
except:
pass
2020-10-17 23:51:55 +03:00
except:
filename = menu[select[0]][select[1]]
2020-10-20 23:41:25 +03:00
try:
data, fs = sf.read(os.path.join(menu[select[0]][0], filename), dtype='float32')
sd.play(data, fs)
keyboard.wait(sd.play())
sd.wait()
except:
pass
2020-09-07 15:32:38 +03:00
def hotkey_remap(btn):
button = HOTKEYS[btn]
key = keyboard.read_key()
if key not in ['esc']:
print(key)
print(COMMANDS[COMMANDS.index(button.text())])
COMMANDS[COMMANDS.index(button.text())] = key
button.setText(key)
2020-09-12 13:44:23 +03:00
2020-10-17 23:51:55 +03:00
###! CONTROL !###
2020-09-12 13:44:23 +03:00
def key(arg): # Хоткеи
2020-10-17 23:51:55 +03:00
def select_move(mode):
select[1] += mode[1]
select[0] += mode[0]
if select[0] > len(menu)-1 or select[0] < -len(menu)+1:
select[0] = 0
if select[1] > len(menu[select[0]])-1 or select[1] < -len(menu[select[0]])+1:
select[1] = 0
if mode[0] != 0:
2020-10-17 23:51:55 +03:00
select[1] = 0
over.label.setText(menu[select[0]][select[1]])
win.select_label.setText(menu[select[0]][select[1]])
keyboard.add_hotkey(72, select_move, args=[[0, -1]])
keyboard.add_hotkey(80, select_move, args=[[0, 1]])
keyboard.add_hotkey(77, select_move, args=[[1, 0]])
keyboard.add_hotkey(75, select_move, args=[[-1, 0]])
keyboard.add_hotkey(76, play_sound, args=[''])
2020-09-12 13:44:23 +03:00
keyboard.add_hotkey(73, sd.stop)
2020-09-07 15:32:38 +03:00
while True:
key = keyboard.read_key()
print(keyboard.key_to_scan_codes(key))
if key == 'esc':
break
elif key in COMMANDS:
print(key)
play_sound(COMMANDS.index(key))
2020-09-07 15:32:38 +03:00
def main(): # Интерфейс
hotkeys_thread.start()
2020-10-17 23:51:55 +03:00
win.save_button.clicked.connect(save)
2020-09-07 15:32:38 +03:00
win.hotkey_1.clicked.connect(lambda: hotkey_remap(0))
win.hotkey_2.clicked.connect(lambda: hotkey_remap(1))
win.hotkey_3.clicked.connect(lambda: hotkey_remap(2))
win.hotkey_4.clicked.connect(lambda: hotkey_remap(3))
win.hotkey_5.clicked.connect(lambda: hotkey_remap(4))
win.hotkey_6.clicked.connect(lambda: hotkey_remap(5))
win.hotkey_7.clicked.connect(lambda: hotkey_remap(6))
win.hotkey_8.clicked.connect(lambda: hotkey_remap(7))
win.hotkey_9.clicked.connect(lambda: hotkey_remap(8))
win.hotkey_10.clicked.connect(lambda: hotkey_remap(9))
win.hotkey_11.clicked.connect(lambda: hotkey_remap(10))
win.hotkey_12.clicked.connect(lambda: hotkey_remap(11))
2020-09-07 15:32:38 +03:00
if __name__ == '__main__':
2020-10-17 23:51:55 +03:00
### Поиск устроства ввода ###
2020-09-07 15:32:38 +03:00
list_ = list(sd.query_devices())
index = found_device(list_)
sd.default.device = list_[index]['name']
2020-10-17 23:51:55 +03:00
### Создание окна ###
2020-09-07 15:32:38 +03:00
app = QtWidgets.QApplication([])
2020-10-17 23:51:55 +03:00
over = OverlayUi()
win = MainUi()
win.show()
2020-09-07 15:32:38 +03:00
select = [0, 0]
2020-09-07 15:32:38 +03:00
COMBOS = [
win.combo0,
win.combo1,
win.combo2,
win.combo3,
win.combo4,
win.combo5,
win.combo6,
win.combo7,
win.combo8,
win.combo9,
win.combo10,
win.combo11,]
HOTKEYS = [
win.hotkey_1,
win.hotkey_2,
win.hotkey_3,
win.hotkey_4,
win.hotkey_5,
win.hotkey_6,
win.hotkey_7,
win.hotkey_8,
win.hotkey_9,
win.hotkey_10,
win.hotkey_11,
win.hotkey_12,]
sounds = sound_get(True)['hotkeys']
combo = 0
for i in sounds.items():
index = COMBOS[combo].findText(i[1])
COMBOS[combo].setCurrentIndex(index)
HOTKEYS[combo].setText(i[0])
combo += 1
2020-09-07 15:32:38 +03:00
COMMANDS = [
HOTKEYS[0].text(),
HOTKEYS[1].text(),
HOTKEYS[2].text(),
HOTKEYS[3].text(),
HOTKEYS[4].text(),
HOTKEYS[5].text(),
HOTKEYS[6].text(),
HOTKEYS[7].text(),
HOTKEYS[8].text(),
HOTKEYS[9].text(),
HOTKEYS[10].text(),
HOTKEYS[11].text(),]
menu = sound_get(True)['menu']
2020-10-17 23:51:55 +03:00
hotkeys_thread = threading.Thread(target=key, args=(1,))
hotkeys_thread.setDaemon(True)
2020-09-07 15:32:38 +03:00
main()
sys.exit(app.exec())