diff --git a/ircradio/factory.py b/ircradio/factory.py index c4f0c9a..2601220 100644 --- a/ircradio/factory.py +++ b/ircradio/factory.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2021, dsc@xmr.pm +import re import sys import collections from typing import List, Optional @@ -29,6 +30,7 @@ irc_message_announce_bus = MultisubscriberQueue() websocket_status_bus_last_item: Optional[dict[str, Station]] = None irc_bot = None keycloak = None +NP_MAP = {} # station, filepath soap = Radio() @@ -61,6 +63,7 @@ async def _setup_tasks(app: Quart): asyncio.create_task(last_websocket_item_updater()) asyncio.create_task(irc_announce_task()) + asyncio.create_task(_now_playing_watch()) async def _setup_irc(app: Quart): @@ -97,6 +100,29 @@ async def _setup_cache(app: Quart): Session(app) +async def _now_playing_watch(): + global NP_MAP + proc = await asyncio.create_subprocess_exec( + "journalctl", "-n15000", "-xefu", "liquidsoap", + stdout=asyncio.subprocess.PIPE, + ) + + line = await proc.stdout.readline() + while line: + line = line.decode().strip() + if '] Prepared "/' in line and ".ogg" in line: + try: + filename = re.findall(r"\"(.*\.ogg)\"", line)[0] + radio = re.findall(r"\[(\w+)\:\d\]", line)[0] + if radio == "playlist": + radio = "pmain" + NP_MAP[radio] = filename + except Exception as ex: + print(f"_now_playing_watch: {ex}") + + line = await proc.stdout.readline() + + def create_app(): global app, soap, icecast2 app = Quart(__name__) diff --git a/ircradio/station.py b/ircradio/station.py index 10bfe2e..3eb6052 100644 --- a/ircradio/station.py +++ b/ircradio/station.py @@ -61,10 +61,17 @@ class Station: # 4. check .ogg.json metadata file (Song.from_filepath) # 5. verify the above by comparing icecast metadata - liq_meta = await Radio.command(self.telnet_cmd_metadata) - liq_meta = liq_meta.decode(errors="ignore") - liq_filenames = re.findall(r"filename=\"(.*)\"", liq_meta) - liq_filenames = [fn for fn in liq_filenames if os.path.exists(fn)] + # find a better way to get current song + liq_filenames = [] + from ircradio.factory import NP_MAP + np_uid = self.id + if np_uid == "main": + np_uid = "pmain" + elif np_uid == "wow": + np_uid = "pmain" + + if np_uid in NP_MAP: + liq_filenames = [NP_MAP[np_uid]] liq_remaining = await Radio.command(self.telnet_cmd_remaining) liq_remaining = liq_remaining.decode(errors="ignore")