This repository has been archived by the owner on Jan 18, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.py
91 lines (73 loc) · 2.69 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""
A simple Discord Rich Presence client that connects to MPRIS and shows your current song.
"""
import sys
import time
import gi
gi.require_version('Playerctl', '2.0')
from gi.repository import Playerctl, GLib
from pypresence import Presence
manager = Playerctl.PlayerManager()
print("Starting RPC client...")
RPC = Presence('440997014315204609')
def connect_rpc():
while True:
try:
RPC.connect()
print("RPC client connected")
break
except ConnectionRefusedError as e:
print("Failed to connect to RPC! Trying again in 10 seconds...")
time.sleep(10)
except (FileNotFoundError, AttributeError) as e:
print("RPC failed to connect due to Discord not being opened yet. Please open it. Reconnecting in 10 seconds...")
time.sleep(10)
def setup_player(name):
player = Playerctl.Player.new_from_name(name)
player.connect('playback-status::playing', on_play, manager)
player.connect('playback-status::paused', on_pause, manager)
player.connect('metadata', on_metadata, manager)
manager.manage_player(player)
update(player)
def get_song(player):
return "%s - %s" % (player.get_title(), player.get_artist())
def update(player):
status = player.get_property('status')
try:
if status == "":
RPC.clear()
elif status == "Playing":
song = get_song(player)
RPC.update(state='Playing', details=song, large_image='music', large_text=song, small_image='play')
elif status == "Paused":
RPC.update(state='Paused', large_image='music', small_image='pause')
except pypresence.exceptions.InvalidID:
print("Lost connection to Discord RPC! Attempting reconnection...")
connect_rpc()
def on_play(player, status, manager):
update(player)
def on_pause(player, status, manager):
update(player)
def on_metadata(player, metadata, manager):
update(player)
def on_player_add(manager, name):
setup_player(name)
def on_player_remove(manager, player):
if len(manager.props.players) < 1:
try:
RPC.clear()
except pypresence.exceptions.InvalidID:
if e == "Client ID is Invalid":
print("Lost connection to Discord RPC! Attempting reconnection...")
connect_rpc()
else:
raise
else:
update(manager.props.players[0])
manager.connect('name-appeared', on_player_add)
manager.connect('player-vanished', on_player_remove)
# Start program, connect to Discord, setup existing players & hook into GLib's main loop
connect_rpc()
for name in manager.props.player_names:
setup_player(name)
GLib.MainLoop().run()