Update README.md

This commit is contained in:
Benjamin Slingo 2025-09-08 12:58:34 -04:00
parent 1c5933b06d
commit 77d9bd5e10

184
README.md
View file

@ -1,26 +1,29 @@
# Sermon Converter # Sermon Converter
A Rust-based service that automatically monitors a directory for new sermon video files and converts them to an optimized format for streaming. An event-driven Rust service that automatically detects and converts sermon video files for efficient storage and streaming. Uses the shared `video_processing` crate for optimal performance.
## Features ## Features
- Automatic detection of new MP4 files in the watch directory - **Event-driven file detection** - No polling, instant response to new files
- Efficient video conversion using FFmpeg - **AV1 video conversion** with Intel QSV hardware acceleration
- Preserves audio quality while optimizing video for streaming - **Preserves original filenames** - Backend handles metadata parsing
- Automatic file organization with date-based naming - **File stability checking** - Ensures files are fully written before processing
- Syncthing-aware (ignores temporary sync files) - **Syncthing-aware** - Ignores temporary sync files
- **Efficient disk space usage** with modern compression
- **Configurable via environment variables**
## Prerequisites ## Prerequisites
- Rust (latest stable version) - Rust (latest stable version)
- FFmpeg installed and available in PATH - FFmpeg with AV1 support (or configure different codec)
- Intel Media SDK (for QSV acceleration, optional)
- Sufficient disk space for video processing - Sufficient disk space for video processing
## Installation ## Installation
1. Clone the repository: 1. Clone the repository:
```bash ```bash
git clone <your-repository-url> git clone <repository-url>
cd sermon-converter cd sermon-converter
``` ```
@ -31,15 +34,40 @@ cargo build --release
## Configuration ## Configuration
The service uses environment variables for configuration: Create a `.env` file based on `.env.example`:
- `SERMON_WATCH_PATH`: Directory to monitor for new sermon videos
- `SERMON_OUTPUT_PATH`: Directory where converted videos will be saved
Example:
```bash ```bash
export SERMON_WATCH_PATH="/path/to/watch/directory" cp .env.example .env
export SERMON_OUTPUT_PATH="/path/to/output/directory" nano .env
```
### Required Environment Variables
```bash
# Directory paths (REQUIRED)
SERMON_WATCH_PATH=/path/to/watch/sermons
SERMON_OUTPUT_PATH=/path/to/output/sermons
# FFmpeg Configuration
FFMPEG_BINARY=ffmpeg
VIDEO_CODEC=av1_qsv # or libx264, libx265, etc.
HW_ACCEL=qsv # hardware acceleration
HW_DEVICE=qsv=hw
FFMPEG_PRESET=4
VIDEO_BITRATE=6M
MAX_BITRATE=12M
BUFFER_SIZE=24M
AUDIO_CODEC=libopus # or copy, aac, etc.
AUDIO_BITRATE=192k
# File Stability Settings
STABILITY_CHECK_INTERVAL=1 # seconds between stability checks
STABILITY_REQUIRED_CHECKS=30 # consecutive stable checks required
MAX_STABILITY_WAIT_HOURS=0.5 # maximum time to wait for stability
# Directory Settings
CREATE_YEAR_MONTH_DIRS=true # organize by date (unused currently)
PRESERVE_ORIGINAL_FILES=false # delete original after conversion
``` ```
## Usage ## Usage
@ -56,12 +84,27 @@ Or run the built binary:
The service will: The service will:
1. Process any existing MP4 files in the watch directory 1. Process any existing MP4 files in the watch directory
2. Continue monitoring for new files 2. Watch for new files using efficient event-driven detection
3. Automatically convert new MP4 files as they appear 3. Wait for file stability before processing
4. Convert to optimized format with same filename
5. Output converted files for backend metadata handling
## Expected File Format
Sermon files should follow the naming convention:
```
Title - Speaker Month Day Year.mp4
```
Examples:
- `God's People in the Time of the End - Pastor John Smith December 28 2024.mp4`
- `The Great Hope - Elder Jane Doe January 15 2025.mp4`
The backend will parse this format automatically for metadata.
## Running as a System Service ## Running as a System Service
To run as a systemd service, create a service file at `/etc/systemd/system/sermon-converter.service`: Create a systemd service file at `/etc/systemd/system/sermon-converter.service`:
```ini ```ini
[Unit] [Unit]
@ -70,10 +113,23 @@ After=network.target
[Service] [Service]
Type=simple Type=simple
User=<your-username> User=rockvilleav
Environment="SERMON_WATCH_PATH=/path/to/watch/directory" Group=rockvilleav
Environment="SERMON_OUTPUT_PATH=/path/to/output/directory" ExecStart=/usr/local/bin/sermon_converter
ExecStart=/path/to/sermon_converter WorkingDirectory=/home/rockvilleav/sermon-converter
# Load environment variables from .env file
EnvironmentFile=/home/rockvilleav/sermon-converter/.env
# System environment variables
Environment=HOME=/home/rockvilleav
Environment=USER=rockvilleav
# Intel Media Stack (if using QSV)
Environment=LIBVA_DRIVER_NAME=iHD
Environment=LIBVA_DRIVERS_PATH=/opt/intel/media/lib64
Environment=LD_LIBRARY_PATH=/opt/intel/media/lib64
Restart=always Restart=always
RestartSec=10 RestartSec=10
@ -85,30 +141,78 @@ Enable and start the service:
```bash ```bash
sudo systemctl enable sermon-converter sudo systemctl enable sermon-converter
sudo systemctl start sermon-converter sudo systemctl start sermon-converter
sudo systemctl status sermon-converter
``` ```
View logs:
```bash
sudo journalctl -u sermon-converter -f
```
## Architecture
This service uses a clean, event-driven architecture:
- **Event Detection**: Uses `inotify` for instant file detection (no polling)
- **File Stability**: Ensures files are completely written before processing
- **Shared Logic**: Uses `video_processing` crate for common functionality
- **Simple Processing**: Convert file, keep same name, let backend handle metadata
- **Resource Efficient**: Only uses CPU/disk when actually processing files
## Video Conversion Details ## Video Conversion Details
The service converts videos using the following FFmpeg settings: Default settings (configurable via .env):
- Video codec: H.264 (libx264) - **Video Codec**: AV1 with Intel QSV acceleration
- Audio codec: AAC - **Audio Codec**: Opus (high efficiency)
- Video preset: medium - **Hardware Acceleration**: Intel Quick Sync Video
- Constant Rate Factor (CRF): 23 - **Video Bitrate**: 6Mbps (configurable)
- Pixel format: yuv420p - **Audio Bitrate**: 192kbps (configurable)
- Audio bitrate: 128k
- Audio sample rate: 44100 Hz
## File Naming Convention
Converted files are named based on the original filename's date pattern:
- Input: `YYYY-MM-DD_sermon.mp4`
- Output: `YYYY-MM-DD_sermon_converted.mp4`
## Troubleshooting ## Troubleshooting
- **FFmpeg not found**: Ensure FFmpeg is installed and in your system PATH ### Common Issues
- **Permission denied**: Check that the service has read/write permissions for both watch and output directories
- **Files not detected**: Verify the watch directory path and that files are complete before processing **Service fails to start:**
```bash
# Check if .env file exists and has correct paths
ls -la /home/rockvilleav/sermon-converter/.env
# Verify directories exist and are accessible
ls -la /path/to/watch/sermons
ls -la /path/to/output/sermons
```
**FFmpeg errors:**
```bash
# Test FFmpeg with your codec
ffmpeg -encoders | grep av1
ffmpeg -hwaccels | grep qsv
# Check Intel Media SDK installation
vainfo
```
**Files not being detected:**
```bash
# Check logs for file events
sudo journalctl -u sermon-converter -f
# Verify file permissions
ls -la /path/to/watch/sermons/
```
**Out of disk space:**
```bash
# Service checks for 5GB minimum free space
df -h /path/to/output/sermons
```
### Log Analysis
The service provides detailed logging:
- `INFO` level: Normal operation, file detection, conversion progress
- `WARN` level: Non-fatal issues (low disk space, sync failures)
- `ERROR` level: Conversion failures, configuration errors
## License ## License
@ -116,4 +220,4 @@ See LICENSE file for details.
## Contributing ## Contributing
Contributions are welcome! Please submit pull requests or issues through the repository. Contributions are welcome! This service is part of a larger church media processing system.