sintonia/playout/libretime_playout/notify/main.py

107 lines
3.0 KiB
Python
Raw Normal View History

2010-11-05 15:54:15 +01:00
"""
Python part of radio playout (pypo)
This function acts as a gateway between liquidsoap and the server API.
Mainly used to tell the platform what pypo/liquidsoap does.
2010-11-05 15:54:15 +01:00
Main case:
2010-11-05 15:54:15 +01:00
- whenever LS starts playing a new track, its on_metadata callback calls
a function in ls (notify(m)) which then calls the python script here
with the currently starting filename as parameter
2010-11-05 15:54:15 +01:00
- this python script takes this parameter, tries to extract the actual
media id from it, and then calls back to the API to tell about it about it.
2010-11-05 15:54:15 +01:00
"""
2023-02-26 01:27:00 +01:00
import logging
feat(playout): enhance playout logging (#1495) Some initial work on modernizing the playout app. This replace any custom logger or logging based logger with the logging tools from libretime_shared.logging and loguru. Removed all the thread/function assigned logger (self.logger = ...), as this makes it part of the logic (passing logger though function args) as it should not. Of a dedicated logger is required for a specific task, it should use the create_task_logger function. - refactor: remove dead code - refactor: remove py2 specific fix - feat: remove unused test command - feat: setup shared cli and logging tools - feat: replace logging with loguru - feat: setup shared cli and logging tools for notify - fix: warn method deos not exist - feat: make cli setup the entrypoint - fix: install shared modules globally in production use extra_requires to load local packages in dev environement - feat: configure log path in systemd service - feat: default behavior is to log to console only - feat: create log dir during install - chore: add comment - fix: don't create useless dir in install - fix: move notify logs to /var/log/libretime dir - fix: update setup_logger attrs - style: linting - fix: replace verbosity flag with log-level flag - feat: use shared logging tool in liquidsoap - fix: pass logger down to api client - feat: allow custom log_filepath in liquidsoap config - chore: add pylintrc to playout - refactor: fix pylint errors - feat: set liquidsoap log filepath in systemd service - fix: missing setup entrypoint update BREAKING CHANGE: for playout and liquidsoap the default log file path changed to None and will only log to the console when developing / testing. Unless you are running the app as a systemd service (production) the default logs filepaths changed: from "/var/log/airtime/pypo/pypo.log" to "/var/log/libretime/playout.log" and from "/var/log/airtime/pypo-liquidsoap/ls_script.log" to "/var/log/libretime/liquidsoap.log" BREAKING CHANGE: for playout-notify the default log file path changed from "/var/log/airtime/pypo/notify.log" to "/var/log/libretime/playout-notify.log"
2022-01-13 16:11:37 +01:00
from pathlib import Path
from typing import Optional
2010-11-05 15:54:15 +01:00
import click
from libretime_api_client.v1 import ApiClient as LegacyClient
from libretime_shared.cli import cli_logging_options
from libretime_shared.config import DEFAULT_ENV_PREFIX
2023-02-26 01:27:00 +01:00
from libretime_shared.logging import setup_logger
logger = logging.getLogger(__name__)
2010-11-05 15:54:15 +01:00
def api_client():
2023-02-26 01:27:00 +01:00
return LegacyClient()
@click.group(context_settings={"auto_envvar_prefix": DEFAULT_ENV_PREFIX})
@cli_logging_options()
def cli(log_level: str, log_filepath: Optional[Path]):
"""
A gateway between Liquidsoap and the API.
"""
2023-02-26 01:27:00 +01:00
setup_logger(log_level, log_filepath, rotate=False)
@cli.command()
@click.argument("media_id")
def media(media_id):
"""
Notify currently playing media.
Replaces: notify --media-id=#{m['schedule_table_id']}
"""
logger.info(f"Sending currently playing media id '{media_id}'")
api_client().notify_media_item_start_playing(media_id)
@cli.command()
@click.argument("media_id")
@click.argument("data")
def webstream(media_id, data):
"""
Notify currently playing webstream.
Replaces: notify --webstream='#{json_str}' --media-id=#{!current_dyn_id}
"""
logger.info(f"Sending currently playing webstream '{media_id}' data '{data}'")
api_client().notify_webstream_data(data, media_id)
@cli.command()
@click.argument("name")
@click.argument("status")
def live(name, status):
"""
Notify currently playing live input.
Replaces: notify --source-name=#{sourcename} --source-status=#{status}
"""
logger.info(f"Sending currently playing live source '{name}' status '{status}'")
api_client().notify_source_status(name, status)
@cli.command()
@click.argument("stream_id")
@click.argument("time")
@click.option("--error", help="Error message if any occurred.")
def stream(stream_id, time, error):
"""
Notify about output stream status.
Replaces: notify --error='#{msg}' --stream-id=#{stream} --time=#{!time}
Replaces: notify --connect --stream-id=#{stream} --time=#{!time}
"""
status = "OK"
if error is not None:
status = error
logger.info(f"Sending output stream '{stream_id}' status '{status}'")
api_client().notify_liquidsoap_status(status, stream_id, time)
@cli.command()
def started():
"""
Notify liquidsoap startup status.
Replaces: notify --liquidsoap-started
"""
logger.debug("Notifying server that Liquidsoap has started")
api_client().notify_liquidsoap_started()