Fixed cutting end of sound, developing micro restreaming

This commit is contained in:
BarsTiger
2022-12-09 17:46:15 +02:00
parent 4d698235a1
commit 1bf045ced9
12 changed files with 139 additions and 10 deletions

1
.gitignore vendored
View File

@@ -4,4 +4,5 @@
/dist/ /dist/
/tests/ /tests/
/data/ /data/
/temp/
*.spec *.spec

View File

@@ -0,0 +1,21 @@
from gui.gui import Ui_MainWindow
from modules.config import Config
from modules.restream import get_streaming_devices
def fill_settings(ui: Ui_MainWindow):
ui.volume_box.setValue(Config.get().volume)
ui.theme_box.setCurrentText(Config.get().theme)
# ui.output_device_play_box.addItems()
ui.restream_micro_checkbox.setChecked(Config.get().restream)
ui.input_device_restream_box.addItems(get_streaming_devices().in_l)
ui.output_device_restream_box.addItems(get_streaming_devices().out_l)
if Config.get().in_micro in get_streaming_devices().in_l:
ui.input_device_restream_box.setCurrentText(Config.get().in_micro)
if Config.get().out_micro in get_streaming_devices().out_l:
ui.output_device_restream_box.setCurrentText(Config.get().out_micro)

View File

@@ -1,6 +1,7 @@
from gui.gui import Ui_MainWindow from gui.gui import Ui_MainWindow
from gui.modules.core.blur import GlobalBlur from gui.modules.core.blur import GlobalBlur
from gui.modules.initialize import styles from gui.modules.initialize import styles
from gui.modules.initialize import fill_settings
from gui.modules.handlers import register from gui.modules.handlers import register
from PyQt5.QtWidgets import QMainWindow from PyQt5.QtWidgets import QMainWindow
from PyQt5 import QtCore from PyQt5 import QtCore
@@ -16,7 +17,6 @@ def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow):
:return: :return:
""" """
ui.content.setCurrentIndex(0) ui.content.setCurrentIndex(0)
ui.volume_box.setValue(Config.get().volume)
MainWindow.setStyleSheet(styles.centralwidget()) MainWindow.setStyleSheet(styles.centralwidget())
ui.menu.setStyleSheet(styles.menupage()) ui.menu.setStyleSheet(styles.menupage())
@@ -28,4 +28,6 @@ def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow):
p = Player() p = Player()
fill_settings.fill_settings(ui)
register.register_handlers(ui, MainWindow, p) register.register_handlers(ui, MainWindow, p)

View File

@@ -9,6 +9,13 @@ def register_handlers(ui: Ui_MainWindow):
:return: :return:
""" """
ui.theme_box.setCurrentText(Config.get().theme)
ui.theme_box.currentTextChanged.connect(lambda: Config.update("theme", ui.theme_box.currentText())) ui.theme_box.currentTextChanged.connect(lambda: Config.update("theme", ui.theme_box.currentText()))
ui.restream_micro_checkbox.clicked.connect(lambda: Config.update("restream",
ui.restream_micro_checkbox.isChecked()))
ui.output_device_restream_box.currentTextChanged.connect(
lambda: Config.update("out_micro", ui.output_device_restream_box.currentText())
)
ui.input_device_restream_box.currentTextChanged.connect(
lambda: Config.update("in_micro", ui.input_device_restream_box.currentText())
)

View File

@@ -7,3 +7,8 @@ from dataclasses_json import dataclass_json
class ConfigModel: class ConfigModel:
theme: str theme: str
volume: int volume: int
out_device: str
preview_device: str
in_micro: str
out_micro: str
restream: bool

View File

@@ -8,7 +8,12 @@ class Config:
def default(): def default():
return { return {
"theme": "Dark gray", "theme": "Dark gray",
"volume": 100 "volume": 100,
"out_device": str(),
"preview_device": str(),
"in_micro": str(),
"out_micro": str(),
"restream": False
} }
@staticmethod @staticmethod

View File

@@ -0,0 +1,31 @@
import pydub
import validators
from urllib.request import urlopen
from io import BytesIO
from rich import print
import pafy
import hashlib
import os
def get_silenced_media(original: str) -> str | None:
if not os.path.isdir('temp'):
os.mkdir('temp')
try:
name = original
namehash = 'temp\\' + hashlib.md5(name.encode('utf-8')).hexdigest()
if not os.path.isfile(namehash):
if validators.url(original):
if 'youtu' in original:
original = pafy.new(original).getbestaudio().url
original = BytesIO(urlopen(original).read())
(pydub.AudioSegment.from_file(original) + pydub.AudioSegment.silent(1500))\
.export(namehash, format='mp3')
return namehash
except Exception as e:
print(e)
raise e
return None

View File

@@ -1,5 +1,7 @@
import vlc import vlc
from gui.gui import Ui_MainWindow from gui.gui import Ui_MainWindow
from gui.modules.core import popup
from modules.player.add_second import get_silenced_media
def get_instance() -> vlc.Instance: def get_instance() -> vlc.Instance:
@@ -23,16 +25,22 @@ def get_devices(mediaplayer: vlc.MediaPlayer) -> dict:
class Player(object): class Player(object):
def __init__(self): def __init__(self):
self.instance = get_instance() self.instance_preview = get_instance()
self.mediaplayer_preview = get_player(self.instance) self.instance_out = get_instance()
self.mediaplayer_preview = get_player(self.instance_preview)
self.mediaplayer_preview.audio_output_device_set(None, get_devices(self.mediaplayer_preview)['Default']) self.mediaplayer_preview.audio_output_device_set(None, get_devices(self.mediaplayer_preview)['Default'])
self.mediaplayer_out = get_player(self.instance) self.mediaplayer_out = get_player(self.instance_out)
self.mediaplayer_out.audio_output_device_set(None, get_devices( self.mediaplayer_out.audio_output_device_set(None, get_devices(
self.mediaplayer_out)['CABLE Input (VB-Audio Virtual Cable)']) self.mediaplayer_out)['CABLE Input (VB-Audio Virtual Cable)'])
def set_media(self, media: str) -> None: def set_media(self, media: str) -> None:
self.mediaplayer_preview.set_media(self.instance.media_new(media)) if get_silenced_media(media):
self.mediaplayer_out.set_media(self.instance.media_new(media)) self.mediaplayer_preview.set_media(self.instance_preview.media_new(get_silenced_media(media)))
self.mediaplayer_out.set_media(self.instance_out.media_new(get_silenced_media(media)))
else:
popup.popup('Error', 'Error playing this media. \nIf it uses link, check is this link valid.')
self.mediaplayer_preview.set_media(None)
self.mediaplayer_out.set_media(None)
def set_volume(self, volume: int): def set_volume(self, volume: int):
self.mediaplayer_preview.audio_set_volume(volume) self.mediaplayer_preview.audio_set_volume(volume)

View File

@@ -0,0 +1 @@
from .devices import get_streaming_devices

View File

@@ -0,0 +1,24 @@
from dataclasses import dataclass
import sounddevice as sd
@dataclass
class StreamingDevices:
output: dict
out_l: list
input: dict
in_l: list
def get_streaming_devices() -> StreamingDevices:
devices = StreamingDevices(dict(), list(), dict(), list())
for device in sd.query_hostapis()[0]['devices']:
if sd.query_devices(device)['max_output_channels'] == 0:
devices.input[sd.query_devices(device)['name']] = sd.query_devices(device)['index']
devices.in_l.append(sd.query_devices(device)['name'])
else:
devices.output[sd.query_devices(device)['name']] = sd.query_devices(device)['index']
devices.out_l.append(sd.query_devices(device)['name'])
return devices

View File

@@ -0,0 +1,21 @@
from gui.gui import Ui_MainWindow
import sounddevice as sd
from . import get_streaming_devices
class Restreamer(object):
def __init__(self):
self.stream = sd.Stream()
@staticmethod
def callback(indata, outdata, frames, time, status):
if status:
print(status)
outdata[:] = indata
def restart(self, ui: Ui_MainWindow):
self.stream.stop()
self.stream = sd.Stream(device=(get_streaming_devices().input[ui.input_device_restream_box.currentText()],
get_streaming_devices().output[ui.output_device_restream_box.currentText()]),
callback=Restreamer.callback)
self.stream.start()

View File

@@ -8,3 +8,6 @@ python-vlc
sounddevice sounddevice
numpy numpy
validators validators
pydub
pafy
youtube-dl==2020.12.2