A Docker-based application that creates a unified streaming interface for LiveBarn hockey rink cameras with EPG (Electronic Program Guide) integration from local ice rink schedules.
- 🎥 Stream Management: Browse and favorite LiveBarn venue streams
- 📺 M3U Playlist: Generate M3U playlists compatible with Channels DVR, Plex, and other media servers
- 📋 EPG Integration: Automatic schedule fetching from:
- OhioHealth Chiller ice rinks
- Lou & Gib Reese Ice Arena (LGRIA)
- 🔄 Auto-Refresh: Daily schedule updates at 3:00 AM
- 🌐 Web UI: Manage favorites and view streams through a clean web interface
- 🔗 Streamlink Proxy: Direct video streaming without tokens expiring
The web interface allows you to:
- Browse all available LiveBarn venues
- Add/remove favorites
- View real-time stream status
- Get M3U playlist and XMLTV URLs
- Docker and Docker Compose (or Portainer)
- LiveBarn account credentials
- Network access to LiveBarn streams
-
Access Portainer and navigate to Stacks → Add Stack
-
Configure the Stack:
- Name:
livebarn-manager - Build method: Repository
- Repository URL:
https://github.com/kineticman/LivebarnScrape.git - Compose path:
docker-compose.yml
- Name:
-
Set Environment Variables:
Click on "Environment variables" and add:
Variable Value Description LIVEBARN_EMAILyour@email.com Your LiveBarn account email LIVEBARN_PASSWORDyourpassword Your LiveBarn account password LAN_IP192.168.1.100 Your server's LAN IP (optional, auto-detected) SERVER_PORT5000 External web interface port (optional, default: 5000) LOG_LEVELINFO Logging level (optional, default: INFO) Note:
PUBLIC_PORTis automatically derived fromSERVER_PORTin Docker/Portainer installs. You usually don’t need to set it manually. -
Deploy the Stack:
- Click Deploy the stack
- Wait for the container to start
-
Access the Application:
- Web UI:
http://YOUR_SERVER_IP:SERVER_PORT - M3U Playlist:
http://YOUR_SERVER_IP:SERVER_PORT/playlist.m3u - XMLTV EPG:
http://YOUR_SERVER_IP:SERVER_PORT/xmltv
For example, with the default
SERVER_PORT=5000:- Web UI:
http://YOUR_SERVER_IP:5000 - M3U Playlist:
http://YOUR_SERVER_IP:5000/playlist.m3u - XMLTV EPG:
http://YOUR_SERVER_IP:5000/xmltv
- Web UI:
-
Clone the repository:
git clone https://github.com/kineticman/LivebarnScrape.git cd LivebarnScrape -
Create
.envfile:cat > .env << EOF LIVEBARN_EMAIL=your@email.com LIVEBARN_PASSWORD=yourpassword LAN_IP=192.168.1.100 SERVER_PORT=5000 # External port you’ll use in the browser/M3U/XMLTV URLs LOG_LEVEL=INFO EOF
-
Start the container:
docker-compose up -d
-
View logs:
docker-compose logs -f
docker run -d \
--name livebarn-manager \
-p 5000:5000 \
-v livebarn-data:/data \
-e LIVEBARN_EMAIL=your@email.com \
-e LIVEBARN_PASSWORD=yourpassword \
-e LAN_IP=192.168.1.100 \
-e PUBLIC_PORT=5000 \
--restart unless-stopped \
ghcr.io/kineticman/livebarn-manager:latestIf you want to expose the app on a different host port (e.g. 8653):
docker run -d \
--name livebarn-manager \
-p 8653:5000 \
-v livebarn-data:/data \
-e LIVEBARN_EMAIL=your@email.com \
-e LIVEBARN_PASSWORD=yourpassword \
-e LAN_IP=192.168.1.100 \
-e PUBLIC_PORT=8653 \
--restart unless-stopped \
ghcr.io/kineticman/livebarn-manager:latestNo manual setup required! The container automatically builds the venue catalog on first startup.
-
Deploy the container using one of the installation methods above
-
First startup (takes 1-2 minutes):
🔨 Building venue catalog (first-time setup)... This may take 1-2 minutes... ✅ Catalog build complete! -
Access Web Interface:
- Open
http://YOUR_SERVER_IP:5000in your browser
- Open
-
Add Favorites:
- Browse available venues
- Click "Add to Favorites" on rinks you want to monitor
- Favorites automatically appear in your M3U playlist
-
Refresh Streams:
- Click "Refresh All Streams" to capture current stream URLs
- This happens automatically but can be triggered manually
-
Open Channels DVR Settings
-
Add Custom Channel:
- Go to Settings → TV Sources → Custom Channels
- Click Add Source
-
Configure Source:
- Nickname: LiveBarn Streams
- Stream Format: HLS
- Source: M3U Playlist
- M3U URL:
http://YOUR_SERVER_IP:5000/playlist.m3u - Refresh: Every 24 hours
-
Add EPG Guide:
- XMLTV URL:
http://YOUR_SERVER_IP:5000/xmltv - Refresh: Every 12 hours
- XMLTV URL:
-
Save and Scan
Your LiveBarn streams will now appear as channels in Channels DVR with full EPG data showing rink schedules!
The system uses a modular provider architecture to automatically fetch schedules from multiple sources:
- Chiller Dublin (Rinks 1 & 2)
- Chiller Easton (Rinks 1 & 2)
- Chiller North (Rinks 1, 2, & 3)
- Chiller Ice Haus
- Chiller Ice Works
- NTPRD Chiller
- Lou & Gib Reese Ice Arena (Newark, OH)
- Real Events: Shows actual scheduled events (games, practices, public skate)
- Gap Filling: Fills unscheduled time with "Open Ice" placeholders
- Auto-Refresh: Schedules update daily at 3:00 AM
- Time Range: Covers today and next 2 days
- Modular System: Easy to add new rinks without modifying core code
The system uses a modular provider architecture that makes adding new rinks simple:
-
Copy the provider template:
cp schedule_providers/example_provider.py schedule_providers/your_rink_provider.py
-
Implement 3 methods:
name- Display name for your rinksurface_mappings- Map rink IDs to LiveBarn surface IDsfetch_schedule()- Fetch and parse schedule data
-
Register your provider: Add it to
ALL_PROVIDERSinschedule_providers/__init__.py -
Restart the container:
docker-compose restart
That's it! No changes to core code needed.
📖 Detailed guide: See ADDING_PROVIDERS.md for step-by-step instructions and examples.
# schedule_providers/icepalace_provider.py
from .base_provider import ScheduleProvider, ScheduleEvent
class IcePalaceProvider(ScheduleProvider):
SCHEDULE_URL = "https://icepalace.com/api/schedule"
SURFACE_MAPPINGS = {"main": 9999} # LiveBarn surface ID
@property
def name(self) -> str:
return "Ice Palace Arena"
@property
def surface_mappings(self):
return self.SURFACE_MAPPINGS
def fetch_schedule(self, start_date, end_date):
# Your implementation here
passSee existing providers in schedule_providers/ for complete examples.
| Variable | Default | Description |
|---|---|---|
LIVEBARN_EMAIL |
required | LiveBarn account email |
LIVEBARN_PASSWORD |
required | LiveBarn account password |
LAN_IP |
auto-detect | Server's LAN IP address |
SERVER_PORT |
5000 | Port the web server listens on (and external port in Docker/Portainer examples) |
PUBLIC_PORT |
auto | Public/external port used in generated URLs (defaults to SERVER_PORT) |
LOG_LEVEL |
INFO | Logging verbosity (DEBUG, INFO, WARNING, ERROR) |
DB_PATH |
/data/livebarn.db | SQLite database path |
- 5000: Web interface and API endpoints
/data: Persistent storage for database and stream cache
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Web interface |
/api/venues |
GET | List all venues |
/api/favorites |
GET | List favorite surfaces |
/api/favorites |
POST | Add surface to favorites |
/api/favorites/<id> |
DELETE | Remove surface from favorites |
/api/refresh-all |
POST | Refresh all favorite streams |
/api/refresh-surface/<id> |
POST | Refresh single surface stream |
/playlist.m3u |
GET | M3U playlist of favorites |
/xmltv |
GET | XMLTV EPG data |
/stream/<surface_id> |
GET | Direct HLS stream proxy |
Check logs:
docker logs livebarn-managerCommon issues:
- Missing credentials in environment variables
- Port 5000 already in use
- Database permissions issues
- First startup taking longer than expected (catalog building)
The container automatically builds the venue catalog on first startup. If the catalog is empty:
- Check startup logs for catalog build success
- Manually rebuild catalog:
docker exec livebarn-manager python build_catalog.py - Verify credentials are correct
- Check network connectivity to LiveBarn
- Verify credentials are correct
- Check LiveBarn website - can you log in normally?
- Refresh streams manually via web UI
- Check logs for authentication errors
- Verify XMLTV URL is accessible:
http://YOUR_SERVER_IP:5000/xmltv - Check schedule cache: Look for "Schedule refreshed" in logs
- Wait for refresh: Initial fetch happens at 3:00 AM or on container start
- Force refresh: Restart the container to trigger immediate fetch
- Check provider logs: Each provider logs its fetch status separately
Provider not fetching:
# Check logs for provider-specific errors
docker logs livebarn-manager | grep "OhioHealth Chiller"
docker logs livebarn-manager | grep "Lou & Gib Reese"Add a new provider:
- See ADDING_PROVIDERS.md for complete guide
- Providers are in
schedule_providers/directory - No core code changes needed
- LiveBarn streams can be unstable depending on rink connectivity
- Token expiration is handled automatically (re-authentication)
- Check your network connection to LiveBarn
LivebarnScrape/
├── livebarn_manager.py # Main Flask application
├── schedule_utils.py # Schedule utility functions
├── schedule_providers/ # Modular schedule providers
│ ├── __init__.py # Provider registry
│ ├── base_provider.py # Abstract base class
│ ├── chiller_provider.py # OhioHealth Chiller
│ ├── lgria_provider.py # Lou & Gib Reese
│ └── example_provider.py # Template for new providers
├── build_catalog.py # Venue catalog builder
├── refresh_single.py # Single stream refresh utility
├── Dockerfile # Container image definition
├── docker-compose.yml # Docker Compose configuration
├── entrypoint.sh # Container startup script
├── requirements.txt # Python dependencies
├── README.md # This file
└── ADDING_PROVIDERS.md # Guide for adding new rinks
-
Install Python dependencies:
pip install -r requirements.txt
-
Set environment variables:
export LIVEBARN_EMAIL=your@email.com export LIVEBARN_PASSWORD=yourpassword export DB_PATH=./livebarn.db
-
Build initial venue catalog:
python build_catalog.py
-
Run the application:
python livebarn_manager.py
-
Test a schedule provider:
python -c " from schedule_providers import lgria_provider from datetime import datetime, timedelta events = lgria_provider.fetch_schedule(datetime.now(), datetime.now() + timedelta(days=2)) print(f'Found {len(events)} events') "
docker build -t livebarn-manager .Contributions are welcome! The modular architecture makes it easy to contribute:
- ✅ Add schedule providers for new rinks (see ADDING_PROVIDERS.md)
- ✅ Improve existing providers with better parsing or error handling
- ✅ Add tests for providers or core functionality
- Advanced filtering/search in web UI
- Recording/DVR functionality
- Multi-user support with authentication
- Mobile app or responsive design improvements
- Notifications for favorite teams/games
- Provider health monitoring dashboard
- Configuration UI for managing providers
- Support for more streaming protocols
The easiest way to contribute is by adding support for your local rink:
- Fork the repository
- Create a new provider in
schedule_providers/ - Follow the template in
example_provider.py - Test it locally
- Submit a pull request
See ADDING_PROVIDERS.md for detailed instructions.
Please open an issue or pull request on GitHub.
This project is for personal use only. LiveBarn content is subject to their Terms of Service. This tool does not bypass any security measures or violate copyright - it simply provides a unified interface for streams you already have access to via your LiveBarn subscription.
- LiveBarn for providing the streaming service
- Channels DVR for excellent DVR software
- OhioHealth Chiller for public schedule API
- Lou & Gib Reese Ice Arena for public schedule data
For issues, questions, or feature requests:
- GitHub Issues: https://github.com/kineticman/LivebarnScrape/issues
This is an unofficial tool and is not affiliated with, endorsed by, or connected to LiveBarn, Streaming Sports Productions LLC, OhioHealth, or any ice rink facilities. Use at your own risk. You must have a valid LiveBarn subscription to use this tool.