Automated Archiving Service
- Change dependency from video_processing to church-core - Use correct git URL: https://git.rockvilletollandsda.church/RTSDA/church-core.git - Enable video_processing feature flag |
||
|---|---|---|
| src | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| deploy.sh.example | ||
| LICENSE | ||
| livestream-archiver.service.example | ||
| README.md | ||
Livestream Archiver
A Rust application that monitors a directory for livestream recordings and processes them with hardware-accelerated transcoding using an event-driven architecture.
Features
- Event-Driven Architecture: Uses filesystem events for instant file detection
- Automatic Detection: Monitors a configured directory for new MP4 files
- Smart Processing: Waits for files to be completely written before processing
- Hardware Acceleration: Converts files to AV1 using Intel QSV hardware acceleration
- Organized Storage: Creates date-based directory structure (Jellyfin-compatible)
- Metadata Generation: Creates NFO files for media servers
- Service Integration: Runs as a systemd service with automatic restart
- Environment Configuration: Uses .env file for easy configuration management
Prerequisites
- Rust toolchain (1.70 or later)
ffmpegwith Intel QSV support
Installation
Building from Source
# Clone the repository
git clone <repository-url>
cd livestream-archiver
# Build release binary
cargo build --release
# Binary will be at target/release/livestream_archiver
Quick Deploy
- Copy and customize the example files:
cp .env.example .env
cp livestream-archiver.service.example livestream-archiver.service
cp deploy.sh.example deploy.sh
# Edit all files with your specific configuration
- Run the deployment:
./deploy.sh
Configuration
Environment Variables (.env file)
Create a .env file in the project root with the following variables:
INPUT_DIR: Directory to monitor for new MP4 filesOUTPUT_DIR: Local output directory for processed files
Example .env file:
INPUT_DIR=/path/to/input/directory
OUTPUT_DIR=/path/to/output/directory
Service Configuration
- Copy the example service file:
cp livestream-archiver.service.example livestream-archiver.service
- Edit the service file with your configuration:
- Update
UserandGroup - Set correct paths for
WorkingDirectoryandExecStart - Ensure the service can access your
.envfile
- Install and start the service:
sudo cp livestream-archiver.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable livestream-archiver
sudo systemctl start livestream-archiver
Usage
Running Manually
# Run directly (uses .env file automatically)
cargo run
# Or run the compiled binary
./target/release/livestream_archiver
Running as a Service
# Check service status
sudo systemctl status livestream-archiver
# View logs
sudo journalctl -u livestream-archiver -f
# Restart service
sudo systemctl restart livestream-archiver
How It Works
The application uses an event-driven architecture for efficient file monitoring:
- Event Monitoring: Uses filesystem events to detect new files instantly (no polling)
- File Validation: Waits for files to be completely written before processing
- Hardware Processing: Converts to AV1 format using Intel QSV hardware acceleration
- Smart Organization: Creates date-based directory structure for processed files
- Metadata Generation: Creates NFO files for media server compatibility
- Original Preservation: Preserves original files after successful processing
Directory Structure
Output files are organized by date for easy browsing:
<output-directory>/
├── 2024/
│ ├── 01-January/
│ │ ├── Recording - January 01 2024.mp4
│ │ ├── Recording - January 01 2024.nfo
│ │ └── ...
│ └── 02-February/
│ └── ...
└── 2025/
└── ...
Troubleshooting
Service not starting
- Check logs:
journalctl -u livestream-archiver -f - Verify
.envfile exists and has correct permissions - Ensure all paths exist and have proper permissions
- Verify ffmpeg has QSV support:
ffmpeg -hwaccels | grep qsv
Processing issues
- Ensure Intel QSV drivers are installed
- Check available disk space in both input and output directories
- Verify file permissions in input/output directories
- Test hardware acceleration:
ffmpeg -hwaccel qsv -i input.mp4 -c:v av1_qsv output.mp4
Files not detected
- Ensure the input directory exists and is accessible
- Check that the application has read permissions on the input directory
- Verify filesystem events are working (may not work on some network filesystems)
Development
Running Tests
cargo test
Building for Debug
cargo build
Development Environment
# Copy example env for development
cp .env.example .env
# Edit .env with your development paths
# Run with debug output
RUST_LOG=debug cargo run
Performance Notes
- Uses filesystem events instead of polling for better performance
- Hardware acceleration significantly reduces CPU usage during transcoding
- Processes files as they arrive rather than batch processing
- Minimal memory footprint due to streaming processing approach
License
This project is licensed under the MIT License - see the LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.