From f6628b9302c9b01ebdd04a02ca1e67faf966f0d7 Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Tue, 17 Feb 2026 14:31:34 -0500 Subject: [PATCH] jellyfin-qbittorrent-monitor: add stream headroom --- services/jellyfin-qbittorrent-monitor.nix | 1 + services/jellyfin-qbittorrent-monitor.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/services/jellyfin-qbittorrent-monitor.nix b/services/jellyfin-qbittorrent-monitor.nix index 68ab406..307e07b 100644 --- a/services/jellyfin-qbittorrent-monitor.nix +++ b/services/jellyfin-qbittorrent-monitor.nix @@ -51,6 +51,7 @@ SERVICE_BUFFER = "5000000"; # 5 Mbps reserved for other services (bps) DEFAULT_STREAM_BITRATE = "10000000"; # 10 Mbps fallback when bitrate unknown (bps) MIN_TORRENT_SPEED = "100"; # KB/s - below this, pause torrents instead + STREAM_BITRATE_HEADROOM = "1.1"; # multiplier per stream for bitrate fluctuations }; }; } diff --git a/services/jellyfin-qbittorrent-monitor.py b/services/jellyfin-qbittorrent-monitor.py index f1548bb..3c01cee 100644 --- a/services/jellyfin-qbittorrent-monitor.py +++ b/services/jellyfin-qbittorrent-monitor.py @@ -33,6 +33,7 @@ class JellyfinQBittorrentMonitor: service_buffer=5000000, default_stream_bitrate=10000000, min_torrent_speed=100, + stream_bitrate_headroom=1.1, ): self.jellyfin_url = jellyfin_url self.qbittorrent_url = qbittorrent_url @@ -42,6 +43,7 @@ class JellyfinQBittorrentMonitor: self.service_buffer = service_buffer self.default_stream_bitrate = default_stream_bitrate self.min_torrent_speed = min_torrent_speed + self.stream_bitrate_headroom = stream_bitrate_headroom self.last_streaming_state = None self.current_state = "unlimited" self.torrents_paused = False @@ -124,6 +126,8 @@ class JellyfinQBittorrentMonitor: bitrate = self.default_stream_bitrate bitrate = min(int(bitrate), 100_000_000) + # Add headroom to account for bitrate fluctuations + bitrate = int(bitrate * self.stream_bitrate_headroom) active_streams.append({"name": stream_name, "bitrate_bps": bitrate}) return active_streams @@ -292,6 +296,7 @@ class JellyfinQBittorrentMonitor: logger.info(f"Service buffer: {self.service_buffer} bps") logger.info(f"Default stream bitrate: {self.default_stream_bitrate} bps") logger.info(f"Minimum torrent speed: {self.min_torrent_speed} KB/s") + logger.info(f"Stream bitrate headroom: {self.stream_bitrate_headroom}x") signal.signal(signal.SIGINT, self.signal_handler) signal.signal(signal.SIGTERM, self.signal_handler) @@ -415,6 +420,7 @@ if __name__ == "__main__": service_buffer = int(os.getenv("SERVICE_BUFFER", "5000000")) default_stream_bitrate = int(os.getenv("DEFAULT_STREAM_BITRATE", "10000000")) min_torrent_speed = int(os.getenv("MIN_TORRENT_SPEED", "100")) + stream_bitrate_headroom = float(os.getenv("STREAM_BITRATE_HEADROOM", "1.1")) monitor = JellyfinQBittorrentMonitor( jellyfin_url=jellyfin_url, @@ -427,6 +433,7 @@ if __name__ == "__main__": service_buffer=service_buffer, default_stream_bitrate=default_stream_bitrate, min_torrent_speed=min_torrent_speed, + stream_bitrate_headroom=stream_bitrate_headroom, ) monitor.run()