Repository files navigation

Stream Watchdog

Stream Watchdog is a Python script designed to monitor streams in IPTV Proxy applications. It ensures uninterrupted streaming by detecting buffering issues and automatically switching to the next stream if buffering persists for a configurable period.

Features

  • Monitors streams for buffering issues in real-time.
  • Displays the current speed of each stream being monitored.
  • Detects buffering below a configurable speed threshold.
  • Automatically switches to the next stream after prolonged buffering.
  • Logs relevant messages to the console, including buffering detection and resolution status.

Requirements

  • FFMPEG
  • Python 3.8 or higher
  • Dependencies:
    • requests
    • psutil

Installation

  1. Clone this repository:
    git clone https://github.com/SergeantPanda/Stream-Watchdog.git
    cd Stream-Watchdog
  2. Install required Python dependencies:
    pip install requests
    pip install psutil
  3. Ensure ffmpeg is installed and available on your system.

Configuration

Update the following variables in the script to match your environment:

  • SERVER_URL: Base URL of your server (e.g., http://Dispatcharr:9191).
  • USERNAME: # Username you use to login to the web ui. (Default: none)
  • PASSWORD: # Password you use to login to the web ui. (Default: none)
  • USER_AGENT: Identifier used for the watchdog client. (Default: Buffer Watchdog)
  • QUERY_INTERVAL: Interval (in seconds) to query the API for stream updates. Setting this faster will not speed up buffer detection. (Default: 5)
  • BUFFER_SPEED_THRESHOLD: Speed threshold to detect buffering. (Default: 1.0)
  • BUFFER_TIME_THRESHOLD: Time (in seconds) to wait before switching streams when buffering. (Default: 30)
  • BUFFER_EXTENSION_TIME: Time (in seconds) to add to the buffer timeout after switching streams. (Default: 10)
  • ERROR_THRESHOLD: Number of errors before switching. (Default: 0 (disables error checking))
  • ERROR_SWITCH_COOLDOWN: Time (in seconds) between stream switches if errors trigger the switch. (Default: 10)
  • ERROR_RESET_TIME: Time (in seconds) to wait before error count resets to 0. (Default: 20)
  • CUSTOM_COMMAND: Command that will run when buffering persists and a next stream is sent. (Default: no command provided)
  • CUSTOM_COMMAND_TIMEOUT: Time (in seconds) to wait for a command before terminating it. (Default:10)
  • FFMPEG_PATH: Path to your ffmpeg executable.
  • MAX_FFMPEG_MEMORY_MB: Max amount of memory (in MB) each FFmpeg process is allowed to consume before force restarting it. (Default: 150)
  • MODULE: Module name to use. (Default: Dispatcharr) (Accepted Values: Dispatcharr,Stream_Master,AIPTV)

Usage

  1. Start the script:
    python Stream-Master-Watchdog.py
  2. The script will:
    • Periodically query the StreamMaster API for active streams.
    • Monitor each stream's speed using FFmpeg.
    • Switch to the next stream if buffering persists.

Docker Compose Example

You can deploy Stream Watchdog using Docker Compose for easier setup and management.

version: "3.8"services:
streamwatchdog:
image: sergeantpanda/streamwatchdog:latestcontainer_name: StreamWatchdogenvironment:
- SERVER_URL=http://Dispatcharr:9191
- USERNAME= # Optional - Only needed if using authentication
- PASSWORD= # Optional - Only needed if using authentication
- QUERY_INTERVAL=5 # Optional
- USER_AGENT=Buffer Watchdog # Optional
- BUFFER_SPEED_THRESHOLD=1.0 # Optional
- BUFFER_TIME_THRESHOLD=30 # Optional
- BUFFER_EXTENSION_TIME=10 # Optional
- ERROR_THRESHOLD=0 # Optional (value higher than 0 enables error checking)
- CUSTOM_COMMAND= # Optional - Don't use quotes around entire command
- CUSTOM_COMMAND_TIMEOUT=10 # Optional
- FFMPEG_PATH=/usr/bin/ffmpeg # Optional - Don't change unless you know what you're doing
- MAX_FFMPEG_MEMORY_MB=150 # Optional
- MODULE=Dispatcharr # Optional
- TZ=US/Central # Optionalrestart: unless-stoppedlogging:
driver: "json-file"options:
max-size: "10m"max-file: "3"

Example Output

Starting stream watchdog monitor...
Started watchdog for channel ID: 101 - Sports Channel
Started watchdog for channel ID: 102 - Movie Channel
Started watchdog for channel ID: 103 - News Channel
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 0.8x - News Channel
Buffering detected on channel 103 - News Channel.
Channel ID: 103 - Current Speed: 0.6x - News Channel
Buffering persisted on channel 103 (News Channel) for 30.05 seconds.
Attempting to switch to the next stream for channel 103...
Switched to the next stream for channel 103. Added 10 seconds to buffer timer.
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 1.1x - News Channel (New Stream)
Buffering resolved on channel 103 - News Channel.

Contributing

Contributions are welcome! Feel free to submit issues or pull requests to improve this script.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

About

Stream Watchdog: A Python script to monitor streams, detect buffering issues, and ensure seamless streaming by automatically switching to the next stream when needed. Configurable, lightweight, and easy to deploy with Docker.

Resources

Stars

32 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Stream Watchdog

Stream Watchdog is a Python script designed to monitor streams in IPTV Proxy applications. It ensures uninterrupted streaming by detecting buffering issues and automatically switching to the next stream if buffering persists for a configurable period.

Features

  • Monitors streams for buffering issues in real-time.
  • Displays the current speed of each stream being monitored.
  • Detects buffering below a configurable speed threshold.
  • Automatically switches to the next stream after prolonged buffering.
  • Logs relevant messages to the console, including buffering detection and resolution status.

Requirements

  • FFMPEG
  • Python 3.8 or higher
  • Dependencies:
    • requests
    • psutil

Installation

  1. Clone this repository:
    git clone https://github.com/SergeantPanda/Stream-Watchdog.git
    cd Stream-Watchdog
  2. Install required Python dependencies:
    pip install requests
    pip install psutil
  3. Ensure ffmpeg is installed and available on your system.

Configuration

Update the following variables in the script to match your environment:

  • SERVER_URL: Base URL of your server (e.g., http://Dispatcharr:9191).
  • USERNAME: # Username you use to login to the web ui. (Default: none)
  • PASSWORD: # Password you use to login to the web ui. (Default: none)
  • USER_AGENT: Identifier used for the watchdog client. (Default: Buffer Watchdog)
  • QUERY_INTERVAL: Interval (in seconds) to query the API for stream updates. Setting this faster will not speed up buffer detection. (Default: 5)
  • BUFFER_SPEED_THRESHOLD: Speed threshold to detect buffering. (Default: 1.0)
  • BUFFER_TIME_THRESHOLD: Time (in seconds) to wait before switching streams when buffering. (Default: 30)
  • BUFFER_EXTENSION_TIME: Time (in seconds) to add to the buffer timeout after switching streams. (Default: 10)
  • ERROR_THRESHOLD: Number of errors before switching. (Default: 0 (disables error checking))
  • ERROR_SWITCH_COOLDOWN: Time (in seconds) between stream switches if errors trigger the switch. (Default: 10)
  • ERROR_RESET_TIME: Time (in seconds) to wait before error count resets to 0. (Default: 20)
  • CUSTOM_COMMAND: Command that will run when buffering persists and a next stream is sent. (Default: no command provided)
  • CUSTOM_COMMAND_TIMEOUT: Time (in seconds) to wait for a command before terminating it. (Default:10)
  • FFMPEG_PATH: Path to your ffmpeg executable.
  • MAX_FFMPEG_MEMORY_MB: Max amount of memory (in MB) each FFmpeg process is allowed to consume before force restarting it. (Default: 150)
  • MODULE: Module name to use. (Default: Dispatcharr) (Accepted Values: Dispatcharr,Stream_Master,AIPTV)

Usage

  1. Start the script:
    python Stream-Master-Watchdog.py
  2. The script will:
    • Periodically query the StreamMaster API for active streams.
    • Monitor each stream's speed using FFmpeg.
    • Switch to the next stream if buffering persists.

Docker Compose Example

You can deploy Stream Watchdog using Docker Compose for easier setup and management.

version: "3.8"services:
streamwatchdog:
image: sergeantpanda/streamwatchdog:latestcontainer_name: StreamWatchdogenvironment:
- SERVER_URL=http://Dispatcharr:9191
- USERNAME= # Optional - Only needed if using authentication
- PASSWORD= # Optional - Only needed if using authentication
- QUERY_INTERVAL=5 # Optional
- USER_AGENT=Buffer Watchdog # Optional
- BUFFER_SPEED_THRESHOLD=1.0 # Optional
- BUFFER_TIME_THRESHOLD=30 # Optional
- BUFFER_EXTENSION_TIME=10 # Optional
- ERROR_THRESHOLD=0 # Optional (value higher than 0 enables error checking)
- CUSTOM_COMMAND= # Optional - Don't use quotes around entire command
- CUSTOM_COMMAND_TIMEOUT=10 # Optional
- FFMPEG_PATH=/usr/bin/ffmpeg # Optional - Don't change unless you know what you're doing
- MAX_FFMPEG_MEMORY_MB=150 # Optional
- MODULE=Dispatcharr # Optional
- TZ=US/Central # Optionalrestart: unless-stoppedlogging:
driver: "json-file"options:
max-size: "10m"max-file: "3"

Example Output

Starting stream watchdog monitor...
Started watchdog for channel ID: 101 - Sports Channel
Started watchdog for channel ID: 102 - Movie Channel
Started watchdog for channel ID: 103 - News Channel
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 0.8x - News Channel
Buffering detected on channel 103 - News Channel.
Channel ID: 103 - Current Speed: 0.6x - News Channel
Buffering persisted on channel 103 (News Channel) for 30.05 seconds.
Attempting to switch to the next stream for channel 103...
Switched to the next stream for channel 103. Added 10 seconds to buffer timer.
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 1.1x - News Channel (New Stream)
Buffering resolved on channel 103 - News Channel.

Contributing

Contributions are welcome! Feel free to submit issues or pull requests to improve this script.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

About

Stream Watchdog: A Python script to monitor streams, detect buffering issues, and ensure seamless streaming by automatically switching to the next stream when needed. Configurable, lightweight, and easy to deploy with Docker.

Resources

Stars

32 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Stream Watchdog

Stream Watchdog is a Python script designed to monitor streams in IPTV Proxy applications. It ensures uninterrupted streaming by detecting buffering issues and automatically switching to the next stream if buffering persists for a configurable period.

Features

  • Monitors streams for buffering issues in real-time.
  • Displays the current speed of each stream being monitored.
  • Detects buffering below a configurable speed threshold.
  • Automatically switches to the next stream after prolonged buffering.
  • Logs relevant messages to the console, including buffering detection and resolution status.

Requirements

  • FFMPEG
  • Python 3.8 or higher
  • Dependencies:
    • requests
    • psutil

Installation

  1. Clone this repository:
    git clone https://github.com/SergeantPanda/Stream-Watchdog.git
    cd Stream-Watchdog
  2. Install required Python dependencies:
    pip install requests
    pip install psutil
  3. Ensure ffmpeg is installed and available on your system.

Configuration

Update the following variables in the script to match your environment:

  • SERVER_URL: Base URL of your server (e.g., http://Dispatcharr:9191).
  • USERNAME: # Username you use to login to the web ui. (Default: none)
  • PASSWORD: # Password you use to login to the web ui. (Default: none)
  • USER_AGENT: Identifier used for the watchdog client. (Default: Buffer Watchdog)
  • QUERY_INTERVAL: Interval (in seconds) to query the API for stream updates. Setting this faster will not speed up buffer detection. (Default: 5)
  • BUFFER_SPEED_THRESHOLD: Speed threshold to detect buffering. (Default: 1.0)
  • BUFFER_TIME_THRESHOLD: Time (in seconds) to wait before switching streams when buffering. (Default: 30)
  • BUFFER_EXTENSION_TIME: Time (in seconds) to add to the buffer timeout after switching streams. (Default: 10)
  • ERROR_THRESHOLD: Number of errors before switching. (Default: 0 (disables error checking))
  • ERROR_SWITCH_COOLDOWN: Time (in seconds) between stream switches if errors trigger the switch. (Default: 10)
  • ERROR_RESET_TIME: Time (in seconds) to wait before error count resets to 0. (Default: 20)
  • CUSTOM_COMMAND: Command that will run when buffering persists and a next stream is sent. (Default: no command provided)
  • CUSTOM_COMMAND_TIMEOUT: Time (in seconds) to wait for a command before terminating it. (Default:10)
  • FFMPEG_PATH: Path to your ffmpeg executable.
  • MAX_FFMPEG_MEMORY_MB: Max amount of memory (in MB) each FFmpeg process is allowed to consume before force restarting it. (Default: 150)
  • MODULE: Module name to use. (Default: Dispatcharr) (Accepted Values: Dispatcharr,Stream_Master,AIPTV)

Usage

  1. Start the script:
    python Stream-Master-Watchdog.py
  2. The script will:
    • Periodically query the StreamMaster API for active streams.
    • Monitor each stream's speed using FFmpeg.
    • Switch to the next stream if buffering persists.

Docker Compose Example

You can deploy Stream Watchdog using Docker Compose for easier setup and management.

version: "3.8"services:
streamwatchdog:
image: sergeantpanda/streamwatchdog:latestcontainer_name: StreamWatchdogenvironment:
- SERVER_URL=http://Dispatcharr:9191
- USERNAME= # Optional - Only needed if using authentication
- PASSWORD= # Optional - Only needed if using authentication
- QUERY_INTERVAL=5 # Optional
- USER_AGENT=Buffer Watchdog # Optional
- BUFFER_SPEED_THRESHOLD=1.0 # Optional
- BUFFER_TIME_THRESHOLD=30 # Optional
- BUFFER_EXTENSION_TIME=10 # Optional
- ERROR_THRESHOLD=0 # Optional (value higher than 0 enables error checking)
- CUSTOM_COMMAND= # Optional - Don't use quotes around entire command
- CUSTOM_COMMAND_TIMEOUT=10 # Optional
- FFMPEG_PATH=/usr/bin/ffmpeg # Optional - Don't change unless you know what you're doing
- MAX_FFMPEG_MEMORY_MB=150 # Optional
- MODULE=Dispatcharr # Optional
- TZ=US/Central # Optionalrestart: unless-stoppedlogging:
driver: "json-file"options:
max-size: "10m"max-file: "3"

Example Output

Starting stream watchdog monitor...
Started watchdog for channel ID: 101 - Sports Channel
Started watchdog for channel ID: 102 - Movie Channel
Started watchdog for channel ID: 103 - News Channel
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 0.8x - News Channel
Buffering detected on channel 103 - News Channel.
Channel ID: 103 - Current Speed: 0.6x - News Channel
Buffering persisted on channel 103 (News Channel) for 30.05 seconds.
Attempting to switch to the next stream for channel 103...
Switched to the next stream for channel 103. Added 10 seconds to buffer timer.
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 1.1x - News Channel (New Stream)
Buffering resolved on channel 103 - News Channel.

Contributing

Contributions are welcome! Feel free to submit issues or pull requests to improve this script.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

About

Stream Watchdog: A Python script to monitor streams, detect buffering issues, and ensure seamless streaming by automatically switching to the next stream when needed. Configurable, lightweight, and easy to deploy with Docker.

Resources

Stars

32 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Stream Watchdog

Stream Watchdog is a Python script designed to monitor streams in IPTV Proxy applications. It ensures uninterrupted streaming by detecting buffering issues and automatically switching to the next stream if buffering persists for a configurable period.

Features

  • Monitors streams for buffering issues in real-time.
  • Displays the current speed of each stream being monitored.
  • Detects buffering below a configurable speed threshold.
  • Automatically switches to the next stream after prolonged buffering.
  • Logs relevant messages to the console, including buffering detection and resolution status.

Requirements

  • FFMPEG
  • Python 3.8 or higher
  • Dependencies:
    • requests
    • psutil

Installation

  1. Clone this repository:
    git clone https://github.com/SergeantPanda/Stream-Watchdog.git
    cd Stream-Watchdog
  2. Install required Python dependencies:
    pip install requests
    pip install psutil
  3. Ensure ffmpeg is installed and available on your system.

Configuration

Update the following variables in the script to match your environment:

  • SERVER_URL: Base URL of your server (e.g., http://Dispatcharr:9191).
  • USERNAME: # Username you use to login to the web ui. (Default: none)
  • PASSWORD: # Password you use to login to the web ui. (Default: none)
  • USER_AGENT: Identifier used for the watchdog client. (Default: Buffer Watchdog)
  • QUERY_INTERVAL: Interval (in seconds) to query the API for stream updates. Setting this faster will not speed up buffer detection. (Default: 5)
  • BUFFER_SPEED_THRESHOLD: Speed threshold to detect buffering. (Default: 1.0)
  • BUFFER_TIME_THRESHOLD: Time (in seconds) to wait before switching streams when buffering. (Default: 30)
  • BUFFER_EXTENSION_TIME: Time (in seconds) to add to the buffer timeout after switching streams. (Default: 10)
  • ERROR_THRESHOLD: Number of errors before switching. (Default: 0 (disables error checking))
  • ERROR_SWITCH_COOLDOWN: Time (in seconds) between stream switches if errors trigger the switch. (Default: 10)
  • ERROR_RESET_TIME: Time (in seconds) to wait before error count resets to 0. (Default: 20)
  • CUSTOM_COMMAND: Command that will run when buffering persists and a next stream is sent. (Default: no command provided)
  • CUSTOM_COMMAND_TIMEOUT: Time (in seconds) to wait for a command before terminating it. (Default:10)
  • FFMPEG_PATH: Path to your ffmpeg executable.
  • MAX_FFMPEG_MEMORY_MB: Max amount of memory (in MB) each FFmpeg process is allowed to consume before force restarting it. (Default: 150)
  • MODULE: Module name to use. (Default: Dispatcharr) (Accepted Values: Dispatcharr,Stream_Master,AIPTV)

Usage

  1. Start the script:
    python Stream-Master-Watchdog.py
  2. The script will:
    • Periodically query the StreamMaster API for active streams.
    • Monitor each stream's speed using FFmpeg.
    • Switch to the next stream if buffering persists.

Docker Compose Example

You can deploy Stream Watchdog using Docker Compose for easier setup and management.

version: "3.8"services:
streamwatchdog:
image: sergeantpanda/streamwatchdog:latestcontainer_name: StreamWatchdogenvironment:
- SERVER_URL=http://Dispatcharr:9191
- USERNAME= # Optional - Only needed if using authentication
- PASSWORD= # Optional - Only needed if using authentication
- QUERY_INTERVAL=5 # Optional
- USER_AGENT=Buffer Watchdog # Optional
- BUFFER_SPEED_THRESHOLD=1.0 # Optional
- BUFFER_TIME_THRESHOLD=30 # Optional
- BUFFER_EXTENSION_TIME=10 # Optional
- ERROR_THRESHOLD=0 # Optional (value higher than 0 enables error checking)
- CUSTOM_COMMAND= # Optional - Don't use quotes around entire command
- CUSTOM_COMMAND_TIMEOUT=10 # Optional
- FFMPEG_PATH=/usr/bin/ffmpeg # Optional - Don't change unless you know what you're doing
- MAX_FFMPEG_MEMORY_MB=150 # Optional
- MODULE=Dispatcharr # Optional
- TZ=US/Central # Optionalrestart: unless-stoppedlogging:
driver: "json-file"options:
max-size: "10m"max-file: "3"

Example Output

Starting stream watchdog monitor...
Started watchdog for channel ID: 101 - Sports Channel
Started watchdog for channel ID: 102 - Movie Channel
Started watchdog for channel ID: 103 - News Channel
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 0.8x - News Channel
Buffering detected on channel 103 - News Channel.
Channel ID: 103 - Current Speed: 0.6x - News Channel
Buffering persisted on channel 103 (News Channel) for 30.05 seconds.
Attempting to switch to the next stream for channel 103...
Switched to the next stream for channel 103. Added 10 seconds to buffer timer.
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 1.1x - News Channel (New Stream)
Buffering resolved on channel 103 - News Channel.

Contributing

Contributions are welcome! Feel free to submit issues or pull requests to improve this script.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

About

Stream Watchdog: A Python script to monitor streams, detect buffering issues, and ensure seamless streaming by automatically switching to the next stream when needed. Configurable, lightweight, and easy to deploy with Docker.

Resources

Stars

32 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Stream Watchdog

Stream Watchdog is a Python script designed to monitor streams in IPTV Proxy applications. It ensures uninterrupted streaming by detecting buffering issues and automatically switching to the next stream if buffering persists for a configurable period.

Features

  • Monitors streams for buffering issues in real-time.
  • Displays the current speed of each stream being monitored.
  • Detects buffering below a configurable speed threshold.
  • Automatically switches to the next stream after prolonged buffering.
  • Logs relevant messages to the console, including buffering detection and resolution status.

Requirements

  • FFMPEG
  • Python 3.8 or higher
  • Dependencies:
    • requests
    • psutil

Installation

  1. Clone this repository:
    git clone https://github.com/SergeantPanda/Stream-Watchdog.git
    cd Stream-Watchdog
  2. Install required Python dependencies:
    pip install requests
    pip install psutil
  3. Ensure ffmpeg is installed and available on your system.

Configuration

Update the following variables in the script to match your environment:

  • SERVER_URL: Base URL of your server (e.g., http://Dispatcharr:9191).
  • USERNAME: # Username you use to login to the web ui. (Default: none)
  • PASSWORD: # Password you use to login to the web ui. (Default: none)
  • USER_AGENT: Identifier used for the watchdog client. (Default: Buffer Watchdog)
  • QUERY_INTERVAL: Interval (in seconds) to query the API for stream updates. Setting this faster will not speed up buffer detection. (Default: 5)
  • BUFFER_SPEED_THRESHOLD: Speed threshold to detect buffering. (Default: 1.0)
  • BUFFER_TIME_THRESHOLD: Time (in seconds) to wait before switching streams when buffering. (Default: 30)
  • BUFFER_EXTENSION_TIME: Time (in seconds) to add to the buffer timeout after switching streams. (Default: 10)
  • ERROR_THRESHOLD: Number of errors before switching. (Default: 0 (disables error checking))
  • ERROR_SWITCH_COOLDOWN: Time (in seconds) between stream switches if errors trigger the switch. (Default: 10)
  • ERROR_RESET_TIME: Time (in seconds) to wait before error count resets to 0. (Default: 20)
  • CUSTOM_COMMAND: Command that will run when buffering persists and a next stream is sent. (Default: no command provided)
  • CUSTOM_COMMAND_TIMEOUT: Time (in seconds) to wait for a command before terminating it. (Default:10)
  • FFMPEG_PATH: Path to your ffmpeg executable.
  • MAX_FFMPEG_MEMORY_MB: Max amount of memory (in MB) each FFmpeg process is allowed to consume before force restarting it. (Default: 150)
  • MODULE: Module name to use. (Default: Dispatcharr) (Accepted Values: Dispatcharr,Stream_Master,AIPTV)

Usage

  1. Start the script:
    python Stream-Master-Watchdog.py
  2. The script will:
    • Periodically query the StreamMaster API for active streams.
    • Monitor each stream's speed using FFmpeg.
    • Switch to the next stream if buffering persists.

Docker Compose Example

You can deploy Stream Watchdog using Docker Compose for easier setup and management.

version: "3.8"services:
streamwatchdog:
image: sergeantpanda/streamwatchdog:latestcontainer_name: StreamWatchdogenvironment:
- SERVER_URL=http://Dispatcharr:9191
- USERNAME= # Optional - Only needed if using authentication
- PASSWORD= # Optional - Only needed if using authentication
- QUERY_INTERVAL=5 # Optional
- USER_AGENT=Buffer Watchdog # Optional
- BUFFER_SPEED_THRESHOLD=1.0 # Optional
- BUFFER_TIME_THRESHOLD=30 # Optional
- BUFFER_EXTENSION_TIME=10 # Optional
- ERROR_THRESHOLD=0 # Optional (value higher than 0 enables error checking)
- CUSTOM_COMMAND= # Optional - Don't use quotes around entire command
- CUSTOM_COMMAND_TIMEOUT=10 # Optional
- FFMPEG_PATH=/usr/bin/ffmpeg # Optional - Don't change unless you know what you're doing
- MAX_FFMPEG_MEMORY_MB=150 # Optional
- MODULE=Dispatcharr # Optional
- TZ=US/Central # Optionalrestart: unless-stoppedlogging:
driver: "json-file"options:
max-size: "10m"max-file: "3"

Example Output

Starting stream watchdog monitor...
Started watchdog for channel ID: 101 - Sports Channel
Started watchdog for channel ID: 102 - Movie Channel
Started watchdog for channel ID: 103 - News Channel
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 0.8x - News Channel
Buffering detected on channel 103 - News Channel.
Channel ID: 103 - Current Speed: 0.6x - News Channel
Buffering persisted on channel 103 (News Channel) for 30.05 seconds.
Attempting to switch to the next stream for channel 103...
Switched to the next stream for channel 103. Added 10 seconds to buffer timer.
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 1.1x - News Channel (New Stream)
Buffering resolved on channel 103 - News Channel.

Contributing

Contributions are welcome! Feel free to submit issues or pull requests to improve this script.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

About

Stream Watchdog: A Python script to monitor streams, detect buffering issues, and ensure seamless streaming by automatically switching to the next stream when needed. Configurable, lightweight, and easy to deploy with Docker.

Resources

Stars

32 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Stream Watchdog

Stream Watchdog is a Python script designed to monitor streams in IPTV Proxy applications. It ensures uninterrupted streaming by detecting buffering issues and automatically switching to the next stream if buffering persists for a configurable period.

Features

  • Monitors streams for buffering issues in real-time.
  • Displays the current speed of each stream being monitored.
  • Detects buffering below a configurable speed threshold.
  • Automatically switches to the next stream after prolonged buffering.
  • Logs relevant messages to the console, including buffering detection and resolution status.

Requirements

  • FFMPEG
  • Python 3.8 or higher
  • Dependencies:
    • requests
    • psutil

Installation

  1. Clone this repository:
    git clone https://github.com/SergeantPanda/Stream-Watchdog.git
    cd Stream-Watchdog
  2. Install required Python dependencies:
    pip install requests
    pip install psutil
  3. Ensure ffmpeg is installed and available on your system.

Configuration

Update the following variables in the script to match your environment:

  • SERVER_URL: Base URL of your server (e.g., http://Dispatcharr:9191).
  • USERNAME: # Username you use to login to the web ui. (Default: none)
  • PASSWORD: # Password you use to login to the web ui. (Default: none)
  • USER_AGENT: Identifier used for the watchdog client. (Default: Buffer Watchdog)
  • QUERY_INTERVAL: Interval (in seconds) to query the API for stream updates. Setting this faster will not speed up buffer detection. (Default: 5)
  • BUFFER_SPEED_THRESHOLD: Speed threshold to detect buffering. (Default: 1.0)
  • BUFFER_TIME_THRESHOLD: Time (in seconds) to wait before switching streams when buffering. (Default: 30)
  • BUFFER_EXTENSION_TIME: Time (in seconds) to add to the buffer timeout after switching streams. (Default: 10)
  • ERROR_THRESHOLD: Number of errors before switching. (Default: 0 (disables error checking))
  • ERROR_SWITCH_COOLDOWN: Time (in seconds) between stream switches if errors trigger the switch. (Default: 10)
  • ERROR_RESET_TIME: Time (in seconds) to wait before error count resets to 0. (Default: 20)
  • CUSTOM_COMMAND: Command that will run when buffering persists and a next stream is sent. (Default: no command provided)
  • CUSTOM_COMMAND_TIMEOUT: Time (in seconds) to wait for a command before terminating it. (Default:10)
  • FFMPEG_PATH: Path to your ffmpeg executable.
  • MAX_FFMPEG_MEMORY_MB: Max amount of memory (in MB) each FFmpeg process is allowed to consume before force restarting it. (Default: 150)
  • MODULE: Module name to use. (Default: Dispatcharr) (Accepted Values: Dispatcharr,Stream_Master,AIPTV)

Usage

  1. Start the script:
    python Stream-Master-Watchdog.py
  2. The script will:
    • Periodically query the StreamMaster API for active streams.
    • Monitor each stream's speed using FFmpeg.
    • Switch to the next stream if buffering persists.

Docker Compose Example

You can deploy Stream Watchdog using Docker Compose for easier setup and management.

version: "3.8"services:
streamwatchdog:
image: sergeantpanda/streamwatchdog:latestcontainer_name: StreamWatchdogenvironment:
- SERVER_URL=http://Dispatcharr:9191
- USERNAME= # Optional - Only needed if using authentication
- PASSWORD= # Optional - Only needed if using authentication
- QUERY_INTERVAL=5 # Optional
- USER_AGENT=Buffer Watchdog # Optional
- BUFFER_SPEED_THRESHOLD=1.0 # Optional
- BUFFER_TIME_THRESHOLD=30 # Optional
- BUFFER_EXTENSION_TIME=10 # Optional
- ERROR_THRESHOLD=0 # Optional (value higher than 0 enables error checking)
- CUSTOM_COMMAND= # Optional - Don't use quotes around entire command
- CUSTOM_COMMAND_TIMEOUT=10 # Optional
- FFMPEG_PATH=/usr/bin/ffmpeg # Optional - Don't change unless you know what you're doing
- MAX_FFMPEG_MEMORY_MB=150 # Optional
- MODULE=Dispatcharr # Optional
- TZ=US/Central # Optionalrestart: unless-stoppedlogging:
driver: "json-file"options:
max-size: "10m"max-file: "3"

Example Output

Starting stream watchdog monitor...
Started watchdog for channel ID: 101 - Sports Channel
Started watchdog for channel ID: 102 - Movie Channel
Started watchdog for channel ID: 103 - News Channel
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 0.8x - News Channel
Buffering detected on channel 103 - News Channel.
Channel ID: 103 - Current Speed: 0.6x - News Channel
Buffering persisted on channel 103 (News Channel) for 30.05 seconds.
Attempting to switch to the next stream for channel 103...
Switched to the next stream for channel 103. Added 10 seconds to buffer timer.
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 1.1x - News Channel (New Stream)
Buffering resolved on channel 103 - News Channel.

Contributing

Contributions are welcome! Feel free to submit issues or pull requests to improve this script.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

About

Stream Watchdog: A Python script to monitor streams, detect buffering issues, and ensure seamless streaming by automatically switching to the next stream when needed. Configurable, lightweight, and easy to deploy with Docker.

Resources

Stars

32 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Stream Watchdog

Stream Watchdog is a Python script designed to monitor streams in IPTV Proxy applications. It ensures uninterrupted streaming by detecting buffering issues and automatically switching to the next stream if buffering persists for a configurable period.

Features

  • Monitors streams for buffering issues in real-time.
  • Displays the current speed of each stream being monitored.
  • Detects buffering below a configurable speed threshold.
  • Automatically switches to the next stream after prolonged buffering.
  • Logs relevant messages to the console, including buffering detection and resolution status.

Requirements

  • FFMPEG
  • Python 3.8 or higher
  • Dependencies:
    • requests
    • psutil

Installation

  1. Clone this repository:
    git clone https://github.com/SergeantPanda/Stream-Watchdog.git
    cd Stream-Watchdog
  2. Install required Python dependencies:
    pip install requests
    pip install psutil
  3. Ensure ffmpeg is installed and available on your system.

Configuration

Update the following variables in the script to match your environment:

  • SERVER_URL: Base URL of your server (e.g., http://Dispatcharr:9191).
  • USERNAME: # Username you use to login to the web ui. (Default: none)
  • PASSWORD: # Password you use to login to the web ui. (Default: none)
  • USER_AGENT: Identifier used for the watchdog client. (Default: Buffer Watchdog)
  • QUERY_INTERVAL: Interval (in seconds) to query the API for stream updates. Setting this faster will not speed up buffer detection. (Default: 5)
  • BUFFER_SPEED_THRESHOLD: Speed threshold to detect buffering. (Default: 1.0)
  • BUFFER_TIME_THRESHOLD: Time (in seconds) to wait before switching streams when buffering. (Default: 30)
  • BUFFER_EXTENSION_TIME: Time (in seconds) to add to the buffer timeout after switching streams. (Default: 10)
  • ERROR_THRESHOLD: Number of errors before switching. (Default: 0 (disables error checking))
  • ERROR_SWITCH_COOLDOWN: Time (in seconds) between stream switches if errors trigger the switch. (Default: 10)
  • ERROR_RESET_TIME: Time (in seconds) to wait before error count resets to 0. (Default: 20)
  • CUSTOM_COMMAND: Command that will run when buffering persists and a next stream is sent. (Default: no command provided)
  • CUSTOM_COMMAND_TIMEOUT: Time (in seconds) to wait for a command before terminating it. (Default:10)
  • FFMPEG_PATH: Path to your ffmpeg executable.
  • MAX_FFMPEG_MEMORY_MB: Max amount of memory (in MB) each FFmpeg process is allowed to consume before force restarting it. (Default: 150)
  • MODULE: Module name to use. (Default: Dispatcharr) (Accepted Values: Dispatcharr,Stream_Master,AIPTV)

Usage

  1. Start the script:
    python Stream-Master-Watchdog.py
  2. The script will:
    • Periodically query the StreamMaster API for active streams.
    • Monitor each stream's speed using FFmpeg.
    • Switch to the next stream if buffering persists.

Docker Compose Example

You can deploy Stream Watchdog using Docker Compose for easier setup and management.

version: "3.8"services:
streamwatchdog:
image: sergeantpanda/streamwatchdog:latestcontainer_name: StreamWatchdogenvironment:
- SERVER_URL=http://Dispatcharr:9191
- USERNAME= # Optional - Only needed if using authentication
- PASSWORD= # Optional - Only needed if using authentication
- QUERY_INTERVAL=5 # Optional
- USER_AGENT=Buffer Watchdog # Optional
- BUFFER_SPEED_THRESHOLD=1.0 # Optional
- BUFFER_TIME_THRESHOLD=30 # Optional
- BUFFER_EXTENSION_TIME=10 # Optional
- ERROR_THRESHOLD=0 # Optional (value higher than 0 enables error checking)
- CUSTOM_COMMAND= # Optional - Don't use quotes around entire command
- CUSTOM_COMMAND_TIMEOUT=10 # Optional
- FFMPEG_PATH=/usr/bin/ffmpeg # Optional - Don't change unless you know what you're doing
- MAX_FFMPEG_MEMORY_MB=150 # Optional
- MODULE=Dispatcharr # Optional
- TZ=US/Central # Optionalrestart: unless-stoppedlogging:
driver: "json-file"options:
max-size: "10m"max-file: "3"

Example Output

Starting stream watchdog monitor...
Started watchdog for channel ID: 101 - Sports Channel
Started watchdog for channel ID: 102 - Movie Channel
Started watchdog for channel ID: 103 - News Channel
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 0.8x - News Channel
Buffering detected on channel 103 - News Channel.
Channel ID: 103 - Current Speed: 0.6x - News Channel
Buffering persisted on channel 103 (News Channel) for 30.05 seconds.
Attempting to switch to the next stream for channel 103...
Switched to the next stream for channel 103. Added 10 seconds to buffer timer.
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 1.1x - News Channel (New Stream)
Buffering resolved on channel 103 - News Channel.

Contributing

Contributions are welcome! Feel free to submit issues or pull requests to improve this script.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

About

Stream Watchdog: A Python script to monitor streams, detect buffering issues, and ensure seamless streaming by automatically switching to the next stream when needed. Configurable, lightweight, and easy to deploy with Docker.

Resources

Stars

32 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Stream Watchdog

Stream Watchdog is a Python script designed to monitor streams in IPTV Proxy applications. It ensures uninterrupted streaming by detecting buffering issues and automatically switching to the next stream if buffering persists for a configurable period.

Features

  • Monitors streams for buffering issues in real-time.
  • Displays the current speed of each stream being monitored.
  • Detects buffering below a configurable speed threshold.
  • Automatically switches to the next stream after prolonged buffering.
  • Logs relevant messages to the console, including buffering detection and resolution status.

Requirements

  • FFMPEG
  • Python 3.8 or higher
  • Dependencies:
    • requests
    • psutil

Installation

  1. Clone this repository:
    git clone https://github.com/SergeantPanda/Stream-Watchdog.git
    cd Stream-Watchdog
  2. Install required Python dependencies:
    pip install requests
    pip install psutil
  3. Ensure ffmpeg is installed and available on your system.

Configuration

Update the following variables in the script to match your environment:

  • SERVER_URL: Base URL of your server (e.g., http://Dispatcharr:9191).
  • USERNAME: # Username you use to login to the web ui. (Default: none)
  • PASSWORD: # Password you use to login to the web ui. (Default: none)
  • USER_AGENT: Identifier used for the watchdog client. (Default: Buffer Watchdog)
  • QUERY_INTERVAL: Interval (in seconds) to query the API for stream updates. Setting this faster will not speed up buffer detection. (Default: 5)
  • BUFFER_SPEED_THRESHOLD: Speed threshold to detect buffering. (Default: 1.0)
  • BUFFER_TIME_THRESHOLD: Time (in seconds) to wait before switching streams when buffering. (Default: 30)
  • BUFFER_EXTENSION_TIME: Time (in seconds) to add to the buffer timeout after switching streams. (Default: 10)
  • ERROR_THRESHOLD: Number of errors before switching. (Default: 0 (disables error checking))
  • ERROR_SWITCH_COOLDOWN: Time (in seconds) between stream switches if errors trigger the switch. (Default: 10)
  • ERROR_RESET_TIME: Time (in seconds) to wait before error count resets to 0. (Default: 20)
  • CUSTOM_COMMAND: Command that will run when buffering persists and a next stream is sent. (Default: no command provided)
  • CUSTOM_COMMAND_TIMEOUT: Time (in seconds) to wait for a command before terminating it. (Default:10)
  • FFMPEG_PATH: Path to your ffmpeg executable.
  • MAX_FFMPEG_MEMORY_MB: Max amount of memory (in MB) each FFmpeg process is allowed to consume before force restarting it. (Default: 150)
  • MODULE: Module name to use. (Default: Dispatcharr) (Accepted Values: Dispatcharr,Stream_Master,AIPTV)

Usage

  1. Start the script:
    python Stream-Master-Watchdog.py
  2. The script will:
    • Periodically query the StreamMaster API for active streams.
    • Monitor each stream's speed using FFmpeg.
    • Switch to the next stream if buffering persists.

Docker Compose Example

You can deploy Stream Watchdog using Docker Compose for easier setup and management.

version: "3.8"services:
streamwatchdog:
image: sergeantpanda/streamwatchdog:latestcontainer_name: StreamWatchdogenvironment:
- SERVER_URL=http://Dispatcharr:9191
- USERNAME= # Optional - Only needed if using authentication
- PASSWORD= # Optional - Only needed if using authentication
- QUERY_INTERVAL=5 # Optional
- USER_AGENT=Buffer Watchdog # Optional
- BUFFER_SPEED_THRESHOLD=1.0 # Optional
- BUFFER_TIME_THRESHOLD=30 # Optional
- BUFFER_EXTENSION_TIME=10 # Optional
- ERROR_THRESHOLD=0 # Optional (value higher than 0 enables error checking)
- CUSTOM_COMMAND= # Optional - Don't use quotes around entire command
- CUSTOM_COMMAND_TIMEOUT=10 # Optional
- FFMPEG_PATH=/usr/bin/ffmpeg # Optional - Don't change unless you know what you're doing
- MAX_FFMPEG_MEMORY_MB=150 # Optional
- MODULE=Dispatcharr # Optional
- TZ=US/Central # Optionalrestart: unless-stoppedlogging:
driver: "json-file"options:
max-size: "10m"max-file: "3"

Example Output

Starting stream watchdog monitor...
Started watchdog for channel ID: 101 - Sports Channel
Started watchdog for channel ID: 102 - Movie Channel
Started watchdog for channel ID: 103 - News Channel
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 0.8x - News Channel
Buffering detected on channel 103 - News Channel.
Channel ID: 103 - Current Speed: 0.6x - News Channel
Buffering persisted on channel 103 (News Channel) for 30.05 seconds.
Attempting to switch to the next stream for channel 103...
Switched to the next stream for channel 103. Added 10 seconds to buffer timer.
Channel ID: 101 - Current Speed: 1.2x - Sports Channel
Channel ID: 102 - Current Speed: 1.0x - Movie Channel
Channel ID: 103 - Current Speed: 1.1x - News Channel (New Stream)
Buffering resolved on channel 103 - News Channel.

Contributing

Contributions are welcome! Feel free to submit issues or pull requests to improve this script.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.

About

Stream Watchdog: A Python script to monitor streams, detect buffering issues, and ensure seamless streaming by automatically switching to the next stream when needed. Configurable, lightweight, and easy to deploy with Docker.

Resources

Stars

32 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages