Automated system for processing sermon audio files and publishing to WordPress.
- WAV Upload: Web interface for uploading WAV audio files
- Audio Processing:
- Dynamic range compression
- Loudness normalization to -14 LUFS
- MP3 conversion at 128kbps stereo
- Automatic File Management:
- Uploads to FileBrowser organized by year
- Generates podcast URLs
- WordPress Integration:
- Creates draft posts automatically
- Custom post title format:
MM/DD/YYYY | Title | SUNDAY SERVICE - Assigns to "Podcasts" category
podcast-processor/
├── backend/
│ ├── Dockerfile
│ ├── package.json
│ └── server.js
├── frontend/
│ ├── Dockerfile
│ ├── nginx.conf
│ ├── package.json
│ └── src/
│ └── App.js
├── docker-compose.yml
├── setup.sh
└── README.md
- Docker and Docker Compose installed
- Linux server with
/mnt/user/appdata/directory - FileBrowser instance running
- WordPress site with REST API enabled
-
Clone or download this repository to your server
-
Run the setup script:
chmod +x setup.sh ./setup.sh
-
Start the application:
docker-compose up -d
-
Configure credentials (first time only):
- Open http://localhost:3000/auth.html in your browser
- Enter your FileBrowser credentials
- Enter your WordPress credentials
- Enter your podcast base URL
- Click "Test Connection" to verify
- Click "Save & Continue"
-
Access the web interface:
- Frontend: http://localhost:3000
- Backend API: http://localhost:3001
On first run, you must configure your credentials through the web interface:
-
Navigate to http://localhost:3000/auth.html
-
Fill in all required fields:
- FileBrowser URL: Your FileBrowser instance URL
- FileBrowser Username: Admin username
- FileBrowser Password: Admin password
- WordPress URL: Your WordPress site URL
- WordPress Username: Your WordPress username
- WordPress Application Password: Generate from WordPress Admin → Users → Profile → Application Passwords
- Podcast Base URL: Base URL where podcasts will be accessible
-
Click "Test Connection" to verify all credentials work
-
Click "Save & Continue" to store credentials securely
- Credentials are stored encrypted on the server in
/mnt/user/appdata/podcast-processor/data/credentials.json - Passwords are encrypted using AES-256-CBC
- The encryption key is auto-generated on first run (or set via
ENCRYPTION_KEYenvironment variable) - Credentials are never stored in code or environment variables visible in docker-compose.yml
- The credentials file is excluded from Git via
.gitignore
To update your credentials later:
- Visit http://localhost:3000/auth.html
- Modify any fields as needed
- Click "Save & Continue"
All configuration is managed through environment variables in docker-compose.yml (for non-sensitive settings only). Sensitive credentials are configured through the web interface.
- Open the web interface at http://localhost:3000
- Select a date for the sermon
- Enter the sermon title
- Upload one or more WAV files
- Click "Process & Publish"
- Monitor the real-time status updates
- Click "Edit Post" to review the WordPress draft
Processed MP3 files are named using the format:
YYYY-MM-DD_title.mp3
Example: 2025-12-23_sunday_morning_sermon.mp3
Post Title: MM/DD/YYYY | Title | SUNDAY SERVICE
Example: 12/23/2025 | Christmas Message | SUNDAY SERVICE
Post Content:
- Audio player embed
- Download link
- Note about Media-Input-Podcast custom field
Data is persisted in /mnt/user/appdata/podcast-processor/:
uploads/- Temporary storage for uploaded WAV filesdownloads/- Temporary storage for processed MP3 fileslogs/- Application logs
Check container status:
docker-compose psView logs:
docker-compose logs -fRestart services:
docker-compose restartRebuild after code changes:
docker-compose down
docker-compose build
docker-compose up -d- Credentials are encrypted using AES-256-CBC encryption on the server
- Never commit the
data/credentials.jsonfile (it's in .gitignore) - Application passwords are recommended for WordPress (not your main password)
- Consider using HTTPS in production with a reverse proxy (nginx/Traefik)
- The encryption key is auto-generated; you can set a custom one via the
ENCRYPTION_KEYenvironment variable - Credentials are only stored server-side; they never appear in frontend JavaScript or GitHub
For issues or questions, check the logs:
docker-compose logs backend
docker-compose logs frontendMIT License