Spaces:
Running
on
Zero
Running
on
Zero
from pypresence import Presence | |
from pypresence.exceptions import DiscordNotFound, InvalidPipe | |
import datetime as dt | |
import threading | |
import functools | |
class RichPresenceManager: | |
def __init__(self): | |
self.client_id = "1339001292319621181" | |
self.rpc = None | |
self.running = False | |
self.current_state = "Idling" | |
self.lock = threading.Lock() | |
self.discord_available = True | |
self.presence_configs = { | |
# Roformer | |
"Performing BS/Mel Roformer Separation": { | |
"small_image": "roformer", | |
"small_text": "BS/Mel Roformer" | |
}, | |
"Performing BS/Mel Roformer Batch Separation": { | |
"small_image": "roformer", | |
"small_text": "BS/Mel Roformer" | |
}, | |
# MDXC | |
"Performing MDXC Separationn": { | |
"small_image": "mdxc", | |
"small_text": "MDXC" | |
}, | |
"Performing MDXC Batch Separation": { | |
"small_image": "mdxc", | |
"small_text": "MDXC" | |
}, | |
# MDX-NET | |
"Performing MDX-NET Separation": { | |
"small_image": "mdxnet", | |
"small_text": "MDX-NET" | |
}, | |
"Performing MDX-NET Batch Separation": { | |
"small_image": "mdxnet", | |
"small_text": "MDX-NET" | |
}, | |
# VR Arch | |
"Performing VR Arch Separation": { | |
"small_image": "vrarch", | |
"small_text": "VR Arch" | |
}, | |
"Performing VR Arch Batch Separation": { | |
"small_image": "vrarch", | |
"small_text": "VR Arch" | |
}, | |
# Demucs | |
"Performing Demucs Separation": { | |
"small_image": "demucs", | |
"small_text": "Demucs" | |
}, | |
"Performing Demucs Batch Separation": { | |
"small_image": "demucs", | |
"small_text": "Demucs" | |
}, | |
# Idling | |
"Idling": { | |
"small_image": "idling", | |
"small_text": "Idling" | |
} | |
} | |
def get_presence_config(self, state): | |
return self.presence_configs.get(state, self.presence_configs["Idling"]) | |
def start_presence(self): | |
try: | |
if not self.running: | |
self.rpc = Presence(self.client_id) | |
try: | |
self.rpc.connect() | |
self.running = True | |
self.discord_available = True | |
self.update_presence() | |
print("Discord Rich Presence connected successfully") | |
except (DiscordNotFound, InvalidPipe): | |
print("Discord is not running. Rich Presence will be disabled.") | |
self.discord_available = False | |
self.running = False | |
self.rpc = None | |
except Exception as error: | |
print(f"An error occurred connecting to Discord: {error}") | |
self.discord_available = False | |
self.running = False | |
self.rpc = None | |
except Exception as e: | |
print(f"Unexpected error in start_presence: {e}") | |
self.discord_available = False | |
self.running = False | |
self.rpc = None | |
def update_presence(self): | |
if self.rpc and self.running and self.discord_available: | |
try: | |
config = self.get_presence_config(self.current_state) | |
self.rpc.update( | |
state=self.current_state, | |
details="Ultimate Vocal Remover 5 Gradio UI", | |
buttons=[{"label": "Download", "url": "https://github.com/Eddycrack864/UVR5-UI"}], | |
large_image="logo", | |
large_text="Separating tracks with UVR5 UI", | |
small_image=config["small_image"], | |
small_text=config["small_text"], | |
start=dt.datetime.now().timestamp(), | |
) | |
except Exception as e: | |
print(f"Error updating Discord presence: {e}") | |
self.discord_available = False | |
self.cleanup() | |
def set_state(self, state): | |
if self.discord_available: | |
with self.lock: | |
self.current_state = state | |
if self.running: | |
self.update_presence() | |
def cleanup(self): | |
self.running = False | |
if self.rpc and self.discord_available: | |
try: | |
self.rpc.close() | |
except: | |
pass | |
self.rpc = None | |
self.discord_available = False | |
def stop_presence(self): | |
self.cleanup() | |
RPCManager = RichPresenceManager() | |
def track_presence(state_message): | |
def decorator(func): | |
def wrapper(*args, **kwargs): | |
if RPCManager.running and RPCManager.discord_available: | |
RPCManager.set_state(state_message) | |
try: | |
result = func(*args, **kwargs) | |
return result | |
finally: | |
if RPCManager.running and RPCManager.discord_available: | |
RPCManager.set_state("Idling") | |
return wrapper | |
return decorator |