add MediaPlayerController

This commit is contained in:
2024-05-09 14:06:49 +07:00
parent e6c7006f1f
commit 789f4f38d5
3 changed files with 72 additions and 2 deletions
+3 -2
View File
@@ -11,7 +11,7 @@ from fuzzywuzzy import fuzz
from pvrecorder import PvRecorder from pvrecorder import PvRecorder
from data import config from data import config
from modules import HomeAssistant from modules import HomeAssistant, MediaPlayerController
from utils import download_models, execute_cmd, play from utils import download_models, execute_cmd, play
@@ -25,6 +25,7 @@ class Jarvis:
self.CDIR = os.getcwd() self.CDIR = os.getcwd()
self.VA_CMD_LIST = yaml.safe_load(open('data/commands.yaml', encoding='utf8')) self.VA_CMD_LIST = yaml.safe_load(open('data/commands.yaml', encoding='utf8'))
self.home_assistant = HomeAssistant.HomeAssistant() self.home_assistant = HomeAssistant.HomeAssistant()
self.media_player_controller = MediaPlayerController.MediaPlayerController()
self.porcupine = pvporcupine.create( self.porcupine = pvporcupine.create(
access_key=config.PICOVOICE_TOKEN, access_key=config.PICOVOICE_TOKEN,
keywords=['jarvis'], keywords=['jarvis'],
@@ -73,7 +74,7 @@ class Jarvis:
:return: bool - распознана или нет команда :return: bool - распознана или нет команда
""" """
print(f"Распознано: {voice}") print(f"Распознано: {voice}")
for x in config.VA_ALIAS + config.VA_TBR: for x in config.VA_ALIAS:
voice = voice.replace(x, "").strip() voice = voice.replace(x, "").strip()
rc = {'cmd': '', 'percent': 0} rc = {'cmd': '', 'percent': 0}
for c, v in self.VA_CMD_LIST.items(): for c, v in self.VA_CMD_LIST.items():
+61
View File
@@ -0,0 +1,61 @@
import platform
import subprocess
class MediaPlayerController:
def __init__(self):
self.os_type = platform.system()
def play_pause(self):
if self.os_type == 'Windows':
self._windows_play_pause()
elif self.os_type == 'Linux':
self._linux_control("play-pause")
def stop(self):
if self.os_type == 'Windows':
self._windows_control("stop")
elif self.os_type == 'Linux':
self._linux_control("stop")
def next_track(self):
if self.os_type == 'Windows':
self._windows_control("next")
elif self.os_type == 'Linux':
self._linux_control("next")
def previous_track(self):
if self.os_type == 'Windows':
self._windows_control("previous")
elif self.os_type == 'Linux':
self._linux_control("previous")
@staticmethod
def _windows_play_pause():
from pycaw.pycaw import AudioUtilities
sessions = AudioUtilities.GetAllSessions()
for session in sessions:
if session.Process and session.AudioSessionControl:
control = session.AudioSessionControl
if control and control.State == 1:
control.Stop()
else:
control.Play()
@staticmethod
def _windows_control(action):
from pycaw.pycaw import AudioUtilities, IAudioSessionControl2
sessions = AudioUtilities.GetAllSessions()
for session in sessions:
if session.Process and isinstance(session.ControlInterface, IAudioSessionControl2):
if action == "stop":
session.SimpleAudioVolume.SetMute(1, None)
elif action == "next" or action == "previous":
pass
@staticmethod
def _linux_control(command):
try:
subprocess.run(["playerctl", command], check=True)
except subprocess.CalledProcessError as e:
print(f"Failed to {command}: {e}")
+8
View File
@@ -16,6 +16,14 @@ def execute_cmd(self, cmd: str, recognized_phrase: str, voice: str) -> None:
self.play("off", True) self.play("off", True)
self.porcupine.delete() self.porcupine.delete()
exit(0) exit(0)
elif cmd == 'music_on':
self.media_player_controller.play_pause()
elif cmd == 'music_off':
self.media_player_controller.play_pause()
elif cmd == 'music_next':
self.media_player_controller.next_track()
elif cmd == 'music_previous':
self.media_player_controller.previous_track()
elif cmd == 'home_assistant_execute': elif cmd == 'home_assistant_execute':
self.home_assistant.send_process(recognized_phrase) self.home_assistant.send_process(recognized_phrase)
elif cmd == 'home_assistant_get': elif cmd == 'home_assistant_get':