minor refactoring (discord_presence needs full rewrite, obviously) + discord_presence enhancement: read correct station from ff to remove the need to manually edit the script every-fucking-time

This commit is contained in:
2025-07-23 16:03:16 -04:00
parent 3d94d385c3
commit 1d9c094853
3 changed files with 69 additions and 79 deletions

View File

@@ -19,9 +19,7 @@ HEADERS = {
class Catbox: class Catbox:
def generateRandomFileName(self, fileExt=""): def generateRandomFileName(self, fileExt=""):
if len(fileExt) < 1: if len(fileExt) < 1:
fileExt = "db" fileExt = "db"

View File

@@ -1,17 +1,22 @@
#!/usr/bin/env python3.12 #!/usr/bin/env python3.13
import time import time
import traceback import traceback
import requests import requests
import dbus import dbus
import re import re
import sys
import os
import random import random
import discord_presence_priv import discord_presence_priv
import catbox import catbox
import logging
from ff_brotab import query_ff
from setproctitle import setproctitle from setproctitle import setproctitle
from typing import Optional from typing import Optional
from pypresence import Presence, ActivityType from pypresence import Presence, ActivityType
setproctitle("disc-presence") setproctitle("disc-presence")
@@ -49,19 +54,23 @@ class DBus:
"elapsed": None, "elapsed": None,
"duration": None, "duration": None,
} }
except: except Exception as e:
pass logging.debug("Exception: %s", str(e))
def is_plexing(self) -> bool: def is_plexing(self) -> bool:
try: try:
self.interface_metadata = self.player_interface.GetAll( self.interface_metadata = self.player_interface.GetAll(
"org.mpris.MediaPlayer2.Player" "org.mpris.MediaPlayer2.Player"
).get("Metadata") ).get("Metadata")
if "app.plex.tv" in self.interface_metadata.get("xesam:url"): if self.interface_metadata and "app.plex.tv" in self.interface_metadata.get(
"xesam:url"
):
return True return True
print(f"WTF, NO PLEX?") logging.debug("Plex not found")
except: return False
print(traceback.format_exc()) except Exception as e:
logging.debug("Exception: %s", str(e))
traceback.print_exc()
return False return False
def get_now_playing(self): def get_now_playing(self):
@@ -115,15 +124,17 @@ class DBus:
"elapsed": None, "elapsed": None,
"duration": None, "duration": None,
} }
print(traceback.format_exc()) traceback.print_exc()
return False return False
class DiscordPresence: class DiscordPresence:
def __init__(self): def __init__(self):
self.dbus = DBus() self.dbus = DBus()
self.radio_station = None
self.last_updated = None self.last_updated = None
self.last_track = None self.last_track = None
self.last_track_title = None
self.client_id = discord_presence_priv.CLIENT_ID self.client_id = discord_presence_priv.CLIENT_ID
self.client_id_plex = discord_presence_priv.CLIENT_ID_PLEX self.client_id_plex = discord_presence_priv.CLIENT_ID_PLEX
self.api_key = discord_presence_priv.API_KEY self.api_key = discord_presence_priv.API_KEY
@@ -212,8 +223,17 @@ class DiscordPresence:
time.sleep(1) time.sleep(1)
continue continue
ff_brotab = query_ff()
if ff_brotab:
(station, _track) = ff_brotab
self.radio_station = station
if self.last_track_title == _track.strip():
continue
else:
self.last_track_title = _track.strip()
request = requests.post( request = requests.post(
f"{self.api_url}/radio/np", f"{self.api_url}/radio/np?station={self.radio_station}",
headers={"content-type": "application/json; charset=utf-8"}, headers={"content-type": "application/json; charset=utf-8"},
timeout=(2, 10), timeout=(2, 10),
) )
@@ -230,60 +250,9 @@ class DiscordPresence:
end_time = data.get("end") end_time = data.get("end")
if self.last_uuid == track_uuid: if self.last_uuid == track_uuid:
print("Track has not changed")
continue continue
# if self.last_updated and (now - self.last_updated < 15):
# time.sleep(0.7)
# continue
# if self.last_track and self.last_track == track:
# lyr_start_idx = lyr_end_idx
# lyr_end_idx += 1
# elif self.last_track:
# lyr_start_idx = 0
# lyr_end_idx = 1
# try:
# # rand_msg_request = requests.post(f'{self.api_url}/randmsg/',
# # headers={
# # 'content-type': 'application/json; charset=utf-8'
# # }, json={
# # 'short': True,
# # }, timeout=(1, 2))
# # rand_msg = rand_msg_request.json().get('msg').strip()
# # rand_msg = re.sub(r'(<b>|</b>)', '', re.sub(r'(<br>|<br/>|<br />|\n|\r\n)', ' ', rand_msg))
# # if len(rand_msg) > 126:
# # rand_msg = None
# if not self.last_track or not self.last_track == track:
# lyrics = requests.post(f'{self.api_url}/lyric/search',
# headers={
# 'content-type': 'application/json; charset=utf-8',
# },
# json={
# 'a': track_artist,
# 's': track_title,
# 'src': 'WEB-RADIO',
# }, timeout=(2,10))
# lyrics.raise_for_status()
# lyrics_content = lyrics.json().get("lyrics")
# lyrics_current_iteration = " / ".join(lyrics_content.split("<br>")[lyr_start_idx:lyr_end_idx]).strip()
# if not lyrics_current_iteration.strip():
# lyr_start_idx = 0
# lyr_end_idx = 1
# if len(lyrics_current_iteration) > 128:
# lyrics_current_iteration = lyrics_current_iteration.split(" / ", maxsplit=1)[0].strip()
# except:
# try:
# lyrics_current_iteration = " / ".join(lyrics_content.split("<br>")[0]).strip()
# except:
# lyrics_content = lyrics_current_iteration = None
# print("FAILED TO GET RANDMSG/LYRICS")
# print(traceback.format_exc())
self.last_updated = now self.last_updated = now
self.last_track = track self.last_track = track
self.last_uuid = track_uuid self.last_uuid = track_uuid
@@ -308,26 +277,18 @@ class DiscordPresence:
) )
) )
# match chosen_image.get('image'): except Exception as e:
# case "rooster": logging.debug("Exception: %s", str(e))
# chosen_image = { traceback.print_exc()
# 'image': "qu",
# 'label': "rubber duck :3"
# }
# case "qu":
# chosen_image = {
# 'image': "rooster",
# 'label': ":3",
# }
except:
print(traceback.format_exc())
time.sleep(0.7) time.sleep(0.7)
continue continue
except: except Exception as e:
print(traceback.format_exc()) logging.debug("Exception: %s", str(e))
traceback.print_exc()
try: try:
self.loop() self.loop()
except: except Exception as e:
logging.debug("Exception: %s", str(e))
pass pass

31
ff_brotab.py Normal file
View File

@@ -0,0 +1,31 @@
"""Radio Info (FF Tab Info Grabber)"""
import subprocess
import sys
import logging
import os
logging.getLogger().setLevel(logging.DEBUG)
bin_path = os.path.join(os.path.expanduser("~"), ".local", "bin", "bt")
def query_ff() -> tuple[str, str] | None:
res: str | None = subprocess.check_output(
f"{bin_path} query -title 'CODEY STUFF*'", shell=True
).decode() # Utilize brotab to get open tab info
if not res:
logging.debug("brotab: No matching (radio) tab found")
return None
tab_name = res.split("\t", maxsplit=1)[
1
] # Discard brotab output before first \t (tab character)
station = tab_name.split("[")[-1].split("]", maxsplit=1)[
0
] # Extract station from page title
track = tab_name.split(" - Radio - ")[1].split(f"[{station}]")[
0
] # Extract track from page title
return (station, track)
print(query_ff())