Add environment variable support, documentation, and security improvements
- Update main.rs to use environment variables for paths (required) - Add comprehensive README.md with setup and usage instructions - Add MIT LICENSE file - Enhance .gitignore to exclude sensitive files and common artifacts - Add .env.example template for configuration
This commit is contained in:
parent
aeb5f8702e
commit
c5bb088c79
52
.gitignore
vendored
52
.gitignore
vendored
|
@ -1 +1,53 @@
|
||||||
|
# Rust build artifacts
|
||||||
/target
|
/target
|
||||||
|
**/*.rs.bk
|
||||||
|
*.pdb
|
||||||
|
|
||||||
|
# Environment files
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
*.env
|
||||||
|
|
||||||
|
# IDE and editor files
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Log files
|
||||||
|
*.log
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
*.tmp
|
||||||
|
*.temp
|
||||||
|
.syncthing.*
|
||||||
|
|
||||||
|
# System files
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Backup files
|
||||||
|
*.bak
|
||||||
|
*.backup
|
||||||
|
|
||||||
|
# Configuration files with sensitive data
|
||||||
|
config.toml
|
||||||
|
config.yaml
|
||||||
|
config.json
|
||||||
|
settings.toml
|
||||||
|
settings.yaml
|
||||||
|
settings.json
|
||||||
|
|
||||||
|
# Private keys and certificates
|
||||||
|
*.key
|
||||||
|
*.pem
|
||||||
|
*.crt
|
||||||
|
*.pfx
|
||||||
|
|
||||||
|
# Video files (if you don't want to commit them)
|
||||||
|
*.mp4
|
||||||
|
*.avi
|
||||||
|
*.mov
|
||||||
|
*.mkv
|
||||||
|
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Rockville Tolland SDA Church
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
119
README.md
Normal file
119
README.md
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Automatic detection of new MP4 files in the watch directory
|
||||||
|
- Efficient video conversion using FFmpeg
|
||||||
|
- Preserves audio quality while optimizing video for streaming
|
||||||
|
- Automatic file organization with date-based naming
|
||||||
|
- Syncthing-aware (ignores temporary sync files)
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Rust (latest stable version)
|
||||||
|
- FFmpeg installed and available in PATH
|
||||||
|
- Sufficient disk space for video processing
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Clone the repository:
|
||||||
|
```bash
|
||||||
|
git clone <your-repository-url>
|
||||||
|
cd sermon-converter
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Build the project:
|
||||||
|
```bash
|
||||||
|
cargo build --release
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
The service uses environment variables for configuration:
|
||||||
|
|
||||||
|
- `SERMON_WATCH_PATH`: Directory to monitor for new sermon videos
|
||||||
|
- `SERMON_OUTPUT_PATH`: Directory where converted videos will be saved
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```bash
|
||||||
|
export SERMON_WATCH_PATH="/path/to/watch/directory"
|
||||||
|
export SERMON_OUTPUT_PATH="/path/to/output/directory"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Run the service:
|
||||||
|
```bash
|
||||||
|
cargo run --release
|
||||||
|
```
|
||||||
|
|
||||||
|
Or run the built binary:
|
||||||
|
```bash
|
||||||
|
./target/release/sermon_converter
|
||||||
|
```
|
||||||
|
|
||||||
|
The service will:
|
||||||
|
1. Process any existing MP4 files in the watch directory
|
||||||
|
2. Continue monitoring for new files
|
||||||
|
3. Automatically convert new MP4 files as they appear
|
||||||
|
|
||||||
|
## Running as a System Service
|
||||||
|
|
||||||
|
To run as a systemd service, create a service file at `/etc/systemd/system/sermon-converter.service`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Sermon Video Converter Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=<your-username>
|
||||||
|
Environment="SERMON_WATCH_PATH=/path/to/watch/directory"
|
||||||
|
Environment="SERMON_OUTPUT_PATH=/path/to/output/directory"
|
||||||
|
ExecStart=/path/to/sermon_converter
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
Enable and start the service:
|
||||||
|
```bash
|
||||||
|
sudo systemctl enable sermon-converter
|
||||||
|
sudo systemctl start sermon-converter
|
||||||
|
```
|
||||||
|
|
||||||
|
## Video Conversion Details
|
||||||
|
|
||||||
|
The service converts videos using the following FFmpeg settings:
|
||||||
|
- Video codec: H.264 (libx264)
|
||||||
|
- Audio codec: AAC
|
||||||
|
- Video preset: medium
|
||||||
|
- Constant Rate Factor (CRF): 23
|
||||||
|
- Pixel format: yuv420p
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- **FFmpeg not found**: Ensure FFmpeg is installed and in your system PATH
|
||||||
|
- **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
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
See LICENSE file for details.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions are welcome! Please submit pull requests or issues through the repository.
|
|
@ -1,4 +1,5 @@
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use std::env;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use notify::{Watcher, RecursiveMode, Event, EventKind};
|
use notify::{Watcher, RecursiveMode, Event, EventKind};
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
|
@ -8,8 +9,12 @@ use services::sermon_converter::VideoConverter;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
let watch_path = PathBuf::from("/home/rockvilleav/Sync/Sermons");
|
let watch_path = PathBuf::from(
|
||||||
let output_path = PathBuf::from("/media/archive/jellyfin/sermons");
|
env::var("SERMON_WATCH_PATH").expect("SERMON_WATCH_PATH environment variable must be set")
|
||||||
|
);
|
||||||
|
let output_path = PathBuf::from(
|
||||||
|
env::var("SERMON_OUTPUT_PATH").expect("SERMON_OUTPUT_PATH environment variable must be set")
|
||||||
|
);
|
||||||
|
|
||||||
// Ensure directories exist
|
// Ensure directories exist
|
||||||
if !watch_path.exists() {
|
if !watch_path.exists() {
|
||||||
|
|
Loading…
Reference in a new issue