libretime/playout/libretime_playout/player/queue.py

80 lines
2.5 KiB
Python
Raw Permalink Normal View History

2023-02-26 01:27:00 +01:00
import logging
from collections import deque
from datetime import datetime
from queue import Empty, Queue
from threading import Thread
from typing import Any, Dict
2021-05-27 16:23:02 +02:00
from ..utils import seconds_between
from .events import AnyEvent
from .liquidsoap import Liquidsoap
2023-02-26 01:27:00 +01:00
logger = logging.getLogger(__name__)
2021-05-27 16:23:02 +02:00
class PypoLiqQueue(Thread):
2022-08-14 19:55:39 +02:00
name = "liquidsoap_queue"
daemon = True
2022-08-14 19:55:39 +02:00
def __init__(
self,
future_queue: "Queue[Dict[str, Any]]",
liquidsoap: Liquidsoap,
):
Thread.__init__(self)
self.queue = future_queue
self.liquidsoap = liquidsoap
2023-03-01 20:27:27 +01:00
def main(self) -> None:
time_until_next_play = None
2023-03-01 20:27:27 +01:00
schedule_deque: deque[AnyEvent] = deque()
media_schedule = None
while True:
try:
if time_until_next_play is None:
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
logger.info("waiting indefinitely for schedule")
media_schedule = self.queue.get(block=True)
else:
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
logger.info(
"waiting %ss until next scheduled item", time_until_next_play
2021-05-27 16:23:02 +02:00
)
media_schedule = self.queue.get(
block=True, timeout=time_until_next_play
)
except Empty:
2021-05-27 16:23:02 +02:00
# Time to push a scheduled item.
media_item = schedule_deque.popleft()
self.liquidsoap.play(media_item)
if len(schedule_deque):
time_until_next_play = seconds_between(
datetime.utcnow(),
schedule_deque[0].start,
2021-05-27 16:23:02 +02:00
)
else:
time_until_next_play = None
else:
logger.info("New schedule received")
2021-05-27 16:23:02 +02:00
# new schedule received. Replace old one with this.
schedule_deque.clear()
keys = sorted(media_schedule.keys())
for i in keys:
schedule_deque.append(media_schedule[i])
if len(keys):
time_until_next_play = seconds_between(
datetime.utcnow(),
media_schedule[keys[0]].start,
2021-05-27 16:23:02 +02:00
)
else:
time_until_next_play = None
2023-03-01 20:27:27 +01:00
def run(self) -> None:
2021-05-27 16:23:02 +02:00
try:
self.main()
except Exception as exception: # pylint: disable=broad-exception-caught
logger.exception(exception)