Fixed cutting end of sound, developing micro restreaming
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,4 +4,5 @@
|
||||
/dist/
|
||||
/tests/
|
||||
/data/
|
||||
/temp/
|
||||
*.spec
|
||||
|
||||
21
gui/modules/initialize/fill_settings.py
Normal file
21
gui/modules/initialize/fill_settings.py
Normal 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)
|
||||
@@ -1,6 +1,7 @@
|
||||
from gui.gui import Ui_MainWindow
|
||||
from gui.modules.core.blur import GlobalBlur
|
||||
from gui.modules.initialize import styles
|
||||
from gui.modules.initialize import fill_settings
|
||||
from gui.modules.handlers import register
|
||||
from PyQt5.QtWidgets import QMainWindow
|
||||
from PyQt5 import QtCore
|
||||
@@ -16,7 +17,6 @@ def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow):
|
||||
:return:
|
||||
"""
|
||||
ui.content.setCurrentIndex(0)
|
||||
ui.volume_box.setValue(Config.get().volume)
|
||||
|
||||
MainWindow.setStyleSheet(styles.centralwidget())
|
||||
ui.menu.setStyleSheet(styles.menupage())
|
||||
@@ -28,4 +28,6 @@ def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow):
|
||||
|
||||
p = Player()
|
||||
|
||||
fill_settings.fill_settings(ui)
|
||||
|
||||
register.register_handlers(ui, MainWindow, p)
|
||||
|
||||
@@ -9,6 +9,13 @@ def register_handlers(ui: Ui_MainWindow):
|
||||
:return:
|
||||
"""
|
||||
|
||||
ui.theme_box.setCurrentText(Config.get().theme)
|
||||
|
||||
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())
|
||||
)
|
||||
|
||||
@@ -7,3 +7,8 @@ from dataclasses_json import dataclass_json
|
||||
class ConfigModel:
|
||||
theme: str
|
||||
volume: int
|
||||
out_device: str
|
||||
preview_device: str
|
||||
in_micro: str
|
||||
out_micro: str
|
||||
restream: bool
|
||||
|
||||
@@ -8,7 +8,12 @@ class Config:
|
||||
def default():
|
||||
return {
|
||||
"theme": "Dark gray",
|
||||
"volume": 100
|
||||
"volume": 100,
|
||||
"out_device": str(),
|
||||
"preview_device": str(),
|
||||
"in_micro": str(),
|
||||
"out_micro": str(),
|
||||
"restream": False
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
|
||||
31
modules/player/add_second.py
Normal file
31
modules/player/add_second.py
Normal 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
|
||||
@@ -1,5 +1,7 @@
|
||||
import vlc
|
||||
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:
|
||||
@@ -23,16 +25,22 @@ def get_devices(mediaplayer: vlc.MediaPlayer) -> dict:
|
||||
|
||||
class Player(object):
|
||||
def __init__(self):
|
||||
self.instance = get_instance()
|
||||
self.mediaplayer_preview = get_player(self.instance)
|
||||
self.instance_preview = get_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_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)['CABLE Input (VB-Audio Virtual Cable)'])
|
||||
|
||||
def set_media(self, media: str) -> None:
|
||||
self.mediaplayer_preview.set_media(self.instance.media_new(media))
|
||||
self.mediaplayer_out.set_media(self.instance.media_new(media))
|
||||
if get_silenced_media(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):
|
||||
self.mediaplayer_preview.audio_set_volume(volume)
|
||||
|
||||
1
modules/restream/__init__.py
Normal file
1
modules/restream/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .devices import get_streaming_devices
|
||||
24
modules/restream/devices.py
Normal file
24
modules/restream/devices.py
Normal 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
|
||||
21
modules/restream/restream.py
Normal file
21
modules/restream/restream.py
Normal 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()
|
||||
@@ -7,4 +7,7 @@ requests
|
||||
python-vlc
|
||||
sounddevice
|
||||
numpy
|
||||
validators
|
||||
validators
|
||||
pydub
|
||||
pafy
|
||||
youtube-dl==2020.12.2
|
||||
Reference in New Issue
Block a user