From 1d9c094853699ca473062ca4c605c4ae5bedd945 Mon Sep 17 00:00:00 2001 From: codey Date: Wed, 23 Jul 2025 16:03:16 -0400 Subject: [PATCH] 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 --- catbox.py | 2 - discord_presence.py | 115 +++++++++++++++----------------------------- ff_brotab.py | 31 ++++++++++++ 3 files changed, 69 insertions(+), 79 deletions(-) create mode 100644 ff_brotab.py diff --git a/catbox.py b/catbox.py index e8a01cf..53e0423 100644 --- a/catbox.py +++ b/catbox.py @@ -19,9 +19,7 @@ HEADERS = { class Catbox: - def generateRandomFileName(self, fileExt=""): - if len(fileExt) < 1: fileExt = "db" diff --git a/discord_presence.py b/discord_presence.py index b1ede33..a58e288 100644 --- a/discord_presence.py +++ b/discord_presence.py @@ -1,17 +1,22 @@ -#!/usr/bin/env python3.12 +#!/usr/bin/env python3.13 import time import traceback import requests import dbus import re +import sys +import os import random import discord_presence_priv import catbox +import logging +from ff_brotab import query_ff from setproctitle import setproctitle from typing import Optional from pypresence import Presence, ActivityType + setproctitle("disc-presence") @@ -49,19 +54,23 @@ class DBus: "elapsed": None, "duration": None, } - except: - pass + except Exception as e: + logging.debug("Exception: %s", str(e)) def is_plexing(self) -> bool: try: self.interface_metadata = self.player_interface.GetAll( "org.mpris.MediaPlayer2.Player" ).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 - print(f"WTF, NO PLEX?") - except: - print(traceback.format_exc()) + logging.debug("Plex not found") + return False + except Exception as e: + logging.debug("Exception: %s", str(e)) + traceback.print_exc() return False def get_now_playing(self): @@ -115,15 +124,17 @@ class DBus: "elapsed": None, "duration": None, } - print(traceback.format_exc()) + traceback.print_exc() return False class DiscordPresence: def __init__(self): self.dbus = DBus() + self.radio_station = None self.last_updated = None self.last_track = None + self.last_track_title = 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 @@ -212,8 +223,17 @@ class DiscordPresence: time.sleep(1) 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( - f"{self.api_url}/radio/np", + f"{self.api_url}/radio/np?station={self.radio_station}", headers={"content-type": "application/json; charset=utf-8"}, timeout=(2, 10), ) @@ -230,60 +250,9 @@ class DiscordPresence: end_time = data.get("end") if self.last_uuid == track_uuid: + print("Track has not changed") 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'(|)', '', re.sub(r'(
|
|
|\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("
")[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("
")[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_track = track self.last_uuid = track_uuid @@ -308,26 +277,18 @@ class DiscordPresence: ) ) - # 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()) + except Exception as e: + logging.debug("Exception: %s", str(e)) + traceback.print_exc() time.sleep(0.7) continue - except: - print(traceback.format_exc()) + except Exception as e: + logging.debug("Exception: %s", str(e)) + traceback.print_exc() try: self.loop() - except: + except Exception as e: + logging.debug("Exception: %s", str(e)) pass diff --git a/ff_brotab.py b/ff_brotab.py new file mode 100644 index 0000000..083b7c4 --- /dev/null +++ b/ff_brotab.py @@ -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())