refactoring needed; add plex (DBus) support

This commit is contained in:
2024-12-26 18:03:21 -05:00
parent 0b42bd4e05
commit 8333218d99
2 changed files with 200 additions and 18 deletions

View File

@@ -3,20 +3,75 @@
import time
import traceback
import requests
import dbus
import re
import random
import discord_presence_priv
import catbox
from setproctitle import setproctitle
from pypresence import Presence, ActivityType
setproctitle("disc-presence")
class DBus:
def __init__(self) -> None:
self.session_bus = dbus.SessionBus()
self.catbox = catbox.Catbox()
try:
self.player_dbus_proxy = self.session_bus.get_object('org.mpris.MediaPlayer2.playerctld',
'/org/mpris/MediaPlayer2')
self.player_interface = dbus.Interface(self.player_dbus_proxy,
'org.freedesktop.DBus.Properties')
self.interface_details = None
self.plex_last = None
self.plex_np = {
'name': None,
'details': None,
'art': None,
}
except:
pass
def is_plexing(self) -> bool:
try:
self.interface_details = self.player_interface.GetAll('org.mpris.MediaPlayer2.Player').get('Metadata')
if "app.plex.tv" in self.interface_details.get('xesam:url'):
return True
except:
print(traceback.format_exc())
return False
def get_now_playing(self) -> dict | bool:
try:
self.interface_details = self.player_interface.GetAll('org.mpris.MediaPlayer2.Player').get('Metadata')
original_art = str(self.interface_details.get('mpris:artUrl', ''))
self.plex_np = {
'name': str(" ".join(self.interface_details.get('xesam:artist'))),
'details': f'{str(self.interface_details.get('xesam:album', ''))} {str(self.interface_details.get('xesam:title'))}',
}
if not self.plex_last or (self.plex_np.get('name') == self.plex_last.get('name') and self.plex_np.get('details') == self.plex_last.get('details')):
self.plex_np['art'] = self.catbox.upload(original_art.split("file://", maxsplit=1)[1])
print(f"Path: {original_art.split("file://", maxsplit=0)[0]}")
return self.plex_np
except:
self.plex_np = {
'name': None,
'details': None,
'art': None,
}
print(traceback.format_exc())
return False
class DiscordPresence:
def __init__(self):
self.dbus = DBus()
self.last_updated = None
self.last_track = None
self.client_id = discord_presence_priv.CLIENT_ID
self.client_id_plex = discord_presence_priv.CLIENT_ID_PLEX
self.api_key = discord_presence_priv.API_KEY
self.api_url = 'https://api.codey.lol'
self.album_art_url = 'https://codey.lol/images/radio_art.jpg'
@@ -33,20 +88,71 @@ class DiscordPresence:
lyrics_content = None
lyrics_current_iteration = None
chosen_image = random.choice([
{
'image': "cat",
'label': "Exorzist",
},
{
'image': "qu",
'label': "Quietscheentchen",
}
'label': "quietscheentchen",
},
# {
# 'image': "rooster",
# 'label': ":3",
# }
])
RPC = Presence(self.client_id, pipe=0)
RPC.connect()
RPC.connect()
while True:
try:
now = time.time()
plex = self.dbus.is_plexing()
if plex:
RPC.client_id = self.client_id_plex
# if RPC.client_id != self.client_id_plex:
# RPC = Presence(self.client_id_plex, pipe=0)
# print(f"Connecting")
# RPC.connect()
# print(f"Connected")
plex_current = self.dbus.plex_np
plex_new = self.dbus.get_now_playing()
print(f"new: {plex_new}")
if plex_current == plex_new:
continue
if self.last_updated and (now - self.last_updated < 5):
# print(f"Skip: {self.last_track} & {(now - self.last_updated)}")
time.sleep(0.7)
continue
RPC.client_id = self.client_id
# if RPC.client_id != self.client_id:
# try:
# RPC.close()
# except:
# pass
# RPC = Presence(self.client_id, pipe=0)
# RPC.connect()
print(RPC.update(
details=plex_new.get('name'),
state=plex_new.get('details'),
large_image=plex_new.get('art'),
# large_image="https://codey.lol/images/cat.png",
# large_text=f"{rand_msg}" if rand_msg else None,k
large_text=lyrics_current_iteration if lyrics_current_iteration else None,
small_image=f"https://codey.lol/images/{chosen_image.get('image')}.png",
small_text=chosen_image.get('label'),
activity_type=ActivityType.WATCHING,
buttons=[
{
"label": "Listen",
"url": "https://codey.lol/radio"
},]
))
continue
request = requests.post(f'{self.api_url}/xc/', json=self.api_req_data,
headers={
'content-type': 'application/json; charset=utf-8'
@@ -138,17 +244,17 @@ class DiscordPresence:
},]
))
match chosen_image.get('image'):
case "cat":
chosen_image = {
'image': "qu",
'label': "Quietscheentchen"
}
case "qu":
chosen_image = {
'image': "cat",
'label': "Exorzist",
}
# match chosen_image.get('image'):
# case "rooster":
# chosen_image = {
# 'image': "qu",
# 'label': "rubber duck :3"
# }
# case "qu":
# chosen_image = {
# 'image': "rooster",
# 'label': ":3",
# }
except:
print(traceback.format_exc())
time.sleep(5)