diff --git a/modules/download_monitor.py b/modules/download_monitor.py new file mode 100644 index 0000000..1dc01ac --- /dev/null +++ b/modules/download_monitor.py @@ -0,0 +1,56 @@ +import logging +import threading +import time + +from pytubefix import YouTube +from modules.metrics import MetricsHandler + + +TEST_VIDEO_URL = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" + + +def monitor_download(): + start = time.time() + + try: + video = YouTube(TEST_VIDEO_URL) + + stream = ( + video.streams.filter( + resolution="360p", + progressive=True, + ) + .order_by("resolution") + .desc() + .first() + ) + + if stream is None: + raise Exception("No suitable stream found") + + stream.download( + output_path="/dev", + filename="null", + ) + + duration = time.time() - start + + MetricsHandler.download_monitor_success.set(1) + MetricsHandler.download_monitor_duration_seconds.set(duration) + + logging.info(f"Download monitoring succeeded in {duration:.2f} seconds") + + except Exception as e: + MetricsHandler.download_monitor_success.set(0) + MetricsHandler.download_monitor_failures_total.inc() + logging.exception(f"Download monitoring failed: {e}") + + +def start_download_monitor(interval: int): + def monitor_loop(): + while True: + monitor_download() + time.sleep(interval) + + thread = threading.Thread(target=monitor_loop, daemon=True) + thread.start() \ No newline at end of file diff --git a/server.py b/server.py index 775f8bd..575041f 100644 --- a/server.py +++ b/server.py @@ -29,6 +29,7 @@ from modules.args import get_args from modules.cache import Cache from modules.metrics import MetricsHandler +from modules.download_monitor import start_download_monitor logging.Formatter.converter = time.gmtime @@ -798,7 +799,13 @@ def startup(): threading.Thread(target=download_video_worker, daemon=True).start() threading.Thread(target=play_video_worker, daemon=True).start() + if args.download_monitoring_interval > 0: + start_download_monitor(args.download_monitoring_interval) + logging.info( + f"Started download monitoring every {args.download_monitoring_interval} seconds" + ) + @app.get("/announcement") async def announcement(): return FileResponse("static/announcement.html")