Fixed cutting end of sound, developing micro restreaming
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,4 +4,5 @@
|
|||||||
/dist/
|
/dist/
|
||||||
/tests/
|
/tests/
|
||||||
/data/
|
/data/
|
||||||
|
/temp/
|
||||||
*.spec
|
*.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.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)
|
||||||
|
|||||||
@@ -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())
|
||||||
|
)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
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
|
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)
|
||||||
|
|||||||
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()
|
||||||
@@ -8,3 +8,6 @@ python-vlc
|
|||||||
sounddevice
|
sounddevice
|
||||||
numpy
|
numpy
|
||||||
validators
|
validators
|
||||||
|
pydub
|
||||||
|
pafy
|
||||||
|
youtube-dl==2020.12.2
|
||||||
Reference in New Issue
Block a user