Skip to content
This repository has been archived by the owner on Jul 9, 2023. It is now read-only.

Commit

Permalink
Move rich presence to separate process
Browse files Browse the repository at this point in the history
  • Loading branch information
joaovitorbf committed May 1, 2022
1 parent ae539d4 commit 38cf5f1
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 31 deletions.
11 changes: 7 additions & 4 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from ui import UserInterface
from session import Session
from player import Player
from presence import Presence

player = Player()
ui = UserInterface(player)
session = Session(ui, player)
if __name__ == "__main__":
presence = Presence()
player = Player()
ui = UserInterface(player, presence)
session = Session(ui, player, presence)

ui.mainloop()
ui.mainloop()
7 changes: 4 additions & 3 deletions player.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import vlc


class Player:
def __init__(self) -> None:
self.configure()
Expand All @@ -9,13 +10,13 @@ def configure(self):
self.player.stop()
self.vlcinstance.release()
self.player.release()
except: pass
self.vlcinstance = vlc.Instance()
except:
self.vlcinstance = vlc.Instance()
self.player = self.vlcinstance.media_player_new()
self.media = self.vlcinstance.media_new("http://radio.plaza.one/mp3")
self.player.set_media(self.media)
self.player.audio_set_volume(100)

def play(self):
self.player.play()

Expand Down
43 changes: 43 additions & 0 deletions presence.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import pypresence
from tkinter import messagebox
from multiprocessing import Process, shared_memory, Queue
from time import sleep


class Presence:
def __init__(self) -> None:
self.q = Queue()
Process(target=self.process, daemon=True, args=(self.q,)).start()

def process(self, q):
self.configure()
while True:
item = q.get()
if item != 'clear':
self.apply_update(item[0], item[1], item[2])
else:
self.presence.clear()
sleep(1)

def configure(self):
try:
print("start presence")
self.presence = pypresence.Presence("970102086194827294")
self.presence.connect()
print("presence connected")
except:
messagebox.showerror(
title="Error!", message="Could not connect to Discord.")
quit()

def apply_update(self, artist, track, end):
self.presence.update(state="by {}".format(artist),
details=track,
end=end,
large_image='nightwave')

def update(self, artist, track, end):
self.q.put((artist, track, end))

def clear(self):
self.q.put('clear')
22 changes: 12 additions & 10 deletions session.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@


class Session:
def __init__(self, ui, player):
def __init__(self, ui, player, presence):
self.req = requests.session()
self.ui = ui
self.length = 1
self.initialtime = time()
self.lastupdate = 0
self.player = player
self.playercheck = False
self.presence = presence

Thread(target=self.update_interface, daemon=True).run()
Thread(target=self.update_listeners, daemon=True).run()
Expand All @@ -33,7 +34,8 @@ def update_interface(self):
return

self.lastupdate = time()
if not self.playercheck: self.check_player()
if not self.playercheck:
self.check_player()

try:
info = self.get_status()
Expand All @@ -59,19 +61,18 @@ def update_interface(self):

if self.ui.is_playing():
print("update")
self.ui.presence.update(state="by {}".format(info['song']['artist']),
details=info['song']['title'],
end=self.initialtime+self.length,
large_image='nightwave')
self.presence.update(info['song']['artist'],
info['song']['title'],
self.initialtime+self.length,)

self.update_time()

def update_time(self):
print("update_time")
if not main_thread().is_alive():
return

if not self.playercheck: self.check_player()
if not self.playercheck:
self.check_player()

self.ui.set_time(self.length, int(time()) -
self.initialtime, self.initialtime+self.length)
Expand All @@ -88,7 +89,8 @@ def update_listeners(self):
if not main_thread().is_alive():
return

if not self.playercheck: self.check_player()
if not self.playercheck:
self.check_player()

try:
r = self.req.get("https://api.plaza.one/status/on-screen-data")
Expand All @@ -112,4 +114,4 @@ def check_player(self):
self.player.play()
timer = Timer(3, self.check_player)
timer.daemon = True
timer.start()
timer.start()
22 changes: 8 additions & 14 deletions ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@


class UserInterface:
def __init__(self, player) -> None:
def __init__(self, player, presence) -> None:
self.bundle_dir = path.abspath(path.dirname(__file__))

# Init Tk
self.root = Tk()
self.root.withdraw()
self.root.eval('tk::PlaceWindow . center')
self.root.title("Rich Plaza")
self.root.geometry("470x180")
self.root.iconbitmap(path.join(self.bundle_dir, 'favicon.ico'))
Expand All @@ -26,14 +28,6 @@ def __init__(self, player) -> None:
self.player = player
self.shouldbeplaying = False

try:
self.presence = pypresence.Presence("970102086194827294")
self.presence.connect()
except:
messagebox.showerror(
title="Error!", message="Could not connect to Discord.")
quit()

WCELLS = 24
HCELLS = 3

Expand Down Expand Up @@ -144,16 +138,15 @@ def setvolume(val): player.audio_set_volume(int(round(float(val))))
def play():
self.playing = player.is_playing()
if self.playing:
self.presence.clear()
presence.clear()
self.playbtn_text.set("Play")
player.stop()
self.shouldbeplaying = False
else:
self.playbtn_text.set("Stop")
self.presence.update(state="by {}".format(self.artist_text.get()),
details=self.track_text.get(),
end=self.end,
large_image='nightwave')
presence.update(self.artist_text.get(),
self.track_text.get(),
self.end)
player.play()
self.shouldbeplaying = True

Expand All @@ -174,6 +167,7 @@ def play():
settings_btn.grid(column=3, row=1, sticky="we")

def mainloop(self):
self.root.deiconify()
self.root.mainloop()

def set_track_name(self, name):
Expand Down

0 comments on commit 38cf5f1

Please sign in to comment.