18 Commits

Author SHA1 Message Date
1b1a40b094 Add auto-update for missing configuration settings
Implemented automatic config file updates to add missing settings
with default values on startup. This eliminates manual config
editing when upgrading to newer versions.

Features:
- Auto-updates config.json with missing settings
- Auto-updates user_config.json with missing user preferences
- Console logging shows which settings were added
- Preserves existing values - only adds missing keys
- Writes updated config back to file automatically
- Graceful error handling if write fails

System config (config.json):
- Comprehensive defaults for all sections
- GPIO, audio, paths, backup, web, system settings
- New settings like volume_greeting, volume_button, volume_beep

User config (user_config.json):
- Loop-based checking against default_config
- Automatic save when updates are detected
- Error logging for troubleshooting

Benefits:
- Seamless upgrades without manual config edits
- No breaking changes when new features are added
- Users see exactly what was added in console
- Backward compatible with old config files

Example console output:
  [CONFIG] Added missing setting: system.volume_beep = 70
  [CONFIG] Updated config.json with missing defaults
  [USER_CONFIG] Added missing setting: volume_button = 70
  [USER_CONFIG] Updated user_config.json with missing defaults

Updated README.md to document auto-update feature.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 16:02:50 +07:00
2ddba3f3e1 Replace multiple USB scripts with single interactive version
Consolidated all USB setup functionality into one script:
- setup_usb.sh (formerly setup_usb_interactive.sh)

Removed deprecated scripts:
- setup_usb_automount.sh
- setup_usb_final.sh
- old setup_usb.sh

New setup_usb.sh features:
- Interactive menu-driven interface
- Scans for all connected USB drives automatically
- Displays device info (label, size, UUID, filesystem)
- Let user select which drives to auto-mount
- Custom mount point names (usb0, usb1, backup, etc.)
- Creates systemd .mount and .automount units
- Handles cleanup and conflict resolution
- Proper permissions (uid/gid)
- Works with drives plugged in after boot

Updated README.md documentation to reflect new workflow.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 15:33:10 +07:00
30ac7e89e9 Add audio resampling utility and scipy dependency
- Created resample_audio.py utility script
  - Automatically reads target sample rate from config.json
  - Resamples all WAV files in sounds directory
  - Creates .backup files before modifying originals
  - Handles both mono and stereo audio
  - Uses scipy.signal.resample for high-quality resampling

- Added scipy>=1.7.0 dependency to pyproject.toml
- Updated Makefile sync command to include scipy
- Updated README.md with sample rate troubleshooting section
- Updated config example in README to show 48kHz default
- Added beep_sound configuration to README system section

This resolves sample rate mismatch errors when audio files
don't match the configured rate in config.json.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 13:02:39 +07:00
c68c8d2885 Add download all recordings as ZIP feature
- Add /download_all endpoint to create in-memory ZIP archive
- Include zipfile and io imports for ZIP creation
- Add "Download All as ZIP" button in web interface (only shows when recordings exist)
- ZIP filename includes timestamp: wedding_recordings_YYYYMMDD_HHMMSS.zip
- Only includes .wav files from recordings directory
- Update API documentation in README.md
- Document feature in CLAUDE.md

Allows users to quickly backup all guest recordings in a single download.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 12:24:17 +07:00
72e39f9515 Add production WSGI server and CLAUDE.md documentation
- Replace Flask development server with Waitress production WSGI server
- Add waitress>=2.1.0 dependency to pyproject.toml and Makefile
- Configure 4-thread server for better performance and stability
- Create comprehensive CLAUDE.md guide for future development
- Document architecture, deployment, testing, and common patterns
- Update README.md with production-ready feature and dependencies

Eliminates Flask development server warning and provides production-grade
web serving suitable for Raspberry Pi deployment.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 12:18:19 +07:00
6ff7664f31 Comprehensive documentation update - v1.2.0
**CHANGELOG.md Created:**
- Complete version history from 1.0.0 to 1.2.0
- Detailed changelog with all features, changes, fixes
- API endpoints documentation
- Configuration changes documentation
- Upgrade notes from 1.0.0 to 1.2.0
- Known issues and future enhancements

**README.md Enhanced:**
- Added Quick Start section at top
- Added comprehensive Table of Contents
- Updated Python version requirement (3.7 -> 3.8)
- Added UV and Make to software requirements
- Added new API endpoints (backup, delay)
- Expanded Contributing section with guidelines
- Added Version History section (current: v1.2.0)
- Enhanced License section with clear permissions
- Added Credits and Technologies Used sections
- Added Support & Community section
- Added proper closing with emoji
- Updated file structure with CHANGELOG.md
- Better file descriptions in structure

**Documentation Improvements:**
- Clear upgrade path from 1.0.0 to 1.2.0
- All new features documented
- All configuration changes documented
- Better organization with TOC
- More professional presentation
- Complete feature list
- Development guidelines for contributors

**Version Information:**
- Current version: 1.2.0
- Major features: USB backup, systemd service, UV support
- Breaking changes: Python 3.8+ required
- New scripts: setup_usb.sh, install_service.sh
- New commands: make start, make test, make sync

**Key Highlights:**
-  Professional documentation structure
-  Easy to navigate with TOC
-  Quick Start for new users
-  Complete changelog for upgrading
-  Clear contribution guidelines
-  Proper version tracking

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 17:19:31 +07:00
42041006b7 Fix USB backup permission issues
**Problem:**
- USB drives mounted as root were not writable by regular user
- Caused "Permission denied" errors on backup
- Required running application as root (not secure)

**Solution:**
- Better permission error messages with fix suggestions
- Try to create backup directory first (more flexible)
- Show helpful error: "run sudo chown -R \$USER /media/usb0"

**USB Setup Script (setup_usb.sh):**
- Interactive USB drive mounting
- Automatically detects USB devices
- Mounts with user ownership (uid/gid)
- Tests write permissions
- Shows free space
- Offers to add to /etc/fstab
- Color-coded output

**Documentation Updates:**
- Added 3 methods for mounting with permissions
- Recommended method: mount with uid/gid options
- Added fstab auto-mount example
- Added quick setup script example
- Clear instructions for each method

**Usage:**
```bash
# Easiest method
sudo ./setup_usb.sh

# Or manual mounting
sudo mount -o uid=$(id -u),gid=$(id -g) /dev/sda1 /media/usb0

# Or fix existing mount
sudo chown -R $USER /media/usb0
```

**Security:**
- No need to run wedding phone as root
- User-owned USB mount points
- Proper permission checking
- Clear error messages

**Web Interface:**
- Shows helpful permission error messages
- Includes fix command in error text
- Better UX for permission issues

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 17:04:21 +07:00
d0bbaf6d4e Fix UV build issues by removing build system
**Issues Fixed:**
- Removed hatchling build-backend (not needed for scripts)
- Changed to --no-project mode (no editable install)
- UV now runs scripts directly without building

**Makefile Updated:**
- Uses 'uv run --no-project' to skip build
- Added 'make sync' to install dependencies
- Simplified dependency installation
- No more build errors

**Install Script Updated:**
- Uses 'make sync' instead of 'uv pip install -e .'
- Faster installation, no build step

**Usage:**
```bash
# Install dependencies
make sync

# Run the system (no build needed)
make start

# Everything just works!
```

**Why This Works:**
- No build system = no build errors
- Direct script execution via UV
- Dependencies installed separately
- Simpler, more reliable

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 16:59:03 +07:00
bdeeb879cd Fix UV configuration and add Makefile
**Issues Fixed:**
- Removed [tool.uv.scripts] (not supported by UV)
- Updated requires-python from >=3.7 to >=3.8 (Flask requirement)
- Removed tool.uv.dev-dependencies (deprecated)

**Makefile Added:**
- make start - Run the wedding phone system
- make test - Run audio tests
- make install - Install dependencies
- make clean - Clean temporary files
- make help - Show available commands

**Service Updated:**
- Changed ExecStart from 'uv run start' to 'make start'
- Uses Makefile for proper UV execution

**Documentation Updated:**
- Primary method now uses Make commands
- Added UV direct commands as alternative
- Updated file structure to include Makefile

**Usage:**
```bash
# Recommended
make start

# Alternative
uv run python rotary_phone_web.py

# Service uses make internally
sudo systemctl start wedding-phone
```

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 16:54:37 +07:00
81731ce4a4 Add UV run support and systemd service installer
**UV Integration:**
- Updated pyproject.toml with [tool.uv.scripts]
- Added 'uv run start' to launch wedding phone
- Added 'uv run test' to run audio tests
- Refactored main code into main() function
- Added proper entry point for package installation

**Systemd Service:**
- Created wedding-phone.service template
- Service runs with UV for dependency management
- Automatic restart on failure
- Proper security hardening (NoNewPrivileges, PrivateTmp)
- GPIO and audio group access configured

**Service Installer:**
- Created install_service.sh automated installer
- Auto-detects project path and user
- Checks for UV installation and dependencies
- Configures service file with correct paths
- Option to enable and start immediately
- Provides helpful command reference

**Installer Features:**
- Validates config.json exists (creates from example if missing)
- Installs UV dependencies automatically
- Updates service file paths dynamically
- Color-coded output for clarity
- Error checking at each step
- Clean installation process

**Usage:**
```bash
# Run directly with UV
uv run start

# Install as system service
./install_service.sh

# Service management
sudo systemctl start wedding-phone
sudo systemctl stop wedding-phone
sudo journalctl -u wedding-phone -f
```

**Documentation:**
- Updated README with UV commands
- Added service installation guide
- Removed old manual systemd instructions
- Added service management commands
- Updated file structure documentation

**Benefits:**
- Easier to run (single command)
- Automatic startup on boot
- Better dependency management
- Professional service integration
- Simplified installation process

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 16:52:08 +07:00
d07cb82772 Add USB backup system with CRC32 verification
**USB Backup Features:**
- Automatic backup to multiple USB drives
- CRC32 checksum verification for data integrity
- Configurable backup paths in config.json
- Backup on write (recordings and greeting uploads)
- Corrupted backups automatically deleted
- Web interface for monitoring and testing

**Configuration:**
- Added backup section to config.example.json
- enabled: Enable/disable USB backup
- usb_paths: Array of USB mount points
- verify_crc: Enable CRC32 verification
- backup_on_write: Backup immediately after file write

**CRC32 Implementation:**
- calculate_crc32(): Compute file checksum
- 64KB chunk reading for memory efficiency
- Source and destination file verification
- Automatic cleanup of failed copies

**Backup Functions:**
- backup_file_to_usb(): Backup with verification
- get_usb_backup_status(): Check drive status
- Mount detection, write test, free space check
- Preserves directory structure on USB

**Web Interface:**
- USB Backup card with drive status display
- Green/Yellow/Red status indicators
- Free space monitoring
- Test backup button
- Real-time status refresh
- Detailed error reporting

**Integration:**
- Recordings backed up after save
- Greetings backed up after upload
- Backup results logged to console
- Non-blocking backup execution

**API Endpoints:**
- GET /api/backup/status - Drive status
- POST /api/backup/test - Test backup

**Documentation:**
- Complete USB backup guide in README
- Mount instructions for USB drives
- CRC verification explanation
- Backup directory structure
- Web interface usage guide

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 16:28:32 +07:00
4d608555cc Change extra button to only work during recording phase
- Extra button now only responds during actual recording
- Does not work during greeting playback or when on-hook
- Updated logic from checking off-hook status to checking recording status
- Updated README to reflect recording-only behavior

This allows guests to add sound effects to their recorded message
without interrupting the initial greeting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 15:41:25 +07:00
3b08c5f88b Fix greeting delay slider not appearing in web interface
- Delete old templates directory to force regeneration
- Templates are auto-generated on first run only
- Add note to README about regenerating templates
- Solution: Delete templates/ and restart script to get new features

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 15:39:17 +07:00
38eff5c2c8 Fix extra button to only work when OFF-hook and add greeting delay
Breaking Behavior Change:
- Extra button NOW only works when handset is OFF-hook (during call)
- Previous: worked when on-hook (idle) - REVERSED
- Reason: Button is for guests to trigger during their call/recording

New Feature - Greeting Delay:
- Add greeting_delay_seconds to config.json (0-10 seconds)
- Delays greeting playback after handset pickup
- Gives guests time to position phone comfortably
- Default: 0 (plays immediately, backward compatible)

Extra Button Logic:
- Only responds when phone_status == "off_hook"
- Ignored when phone is on-hook (idle)
- Can be pressed during greeting or recording
- Plays entire sound without interruption
- Useful for: "Press button to hear special message"

Greeting Delay Use Cases:
- Wedding: Give guests moment to settle in
- Events: Time to position phone comfortably
- Accessibility: Extra time for elderly guests
- Professional: Pause before message delivery

Configuration:
{
  "system": {
    "greeting_delay_seconds": 2,  // 2 second pause
    "extra_button_sound": "surprise.wav"
  }
}

Console Output:
- "Extra button ignored - phone is on hook" (when idle)
- "Waiting X seconds before greeting..." (delay active)
- "=== Extra button pressed ===" (during call)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 15:15:05 +07:00
2dde7d8e43 Add extra GPIO button support with custom sound playback
Features:
- Configurable extra button on any GPIO pin
- Upload and select custom sound for button press
- Non-blocking button operation (separate thread)
- Debounced to prevent double-triggers (0.5s)
- Works independently from phone handset
- Can be pressed anytime, even during recording

Configuration:
- gpio.extra_button_enabled: Enable/disable feature
- gpio.extra_button_pin: GPIO pin number (default: 27)
- gpio.extra_button_pressed_state: "LOW" or "HIGH"
- system.extra_button_sound: Default sound file

Web Interface:
- Display active button sound in alert
- "🔘 Set Button" action on greeting items
- Visual indicator (🔘) for active button sound
- Upload any WAV file and assign to button
- Play/preview button sounds in browser

Backend:
- RotaryPhone.play_extra_button_sound() method
- RotaryPhone.set_extra_button_sound() method
- Thread-based playback to not block main loop
- /set_extra_button_sound API endpoint
- Extra button sound tracked in user_config.json

Documentation:
- Extra button setup in README
- Configuration examples
- GPIO pin configuration
- Operation workflow

Use Cases:
- Play special message on button press
- Sound effects for wedding games
- Multiple interaction points
- Custom audio triggers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 14:57:31 +07:00
ef0373e60b Add external configuration file system
Breaking Changes:
- Configuration now via config.json instead of editing Python code
- Remove all hardcoded paths (no more /home/berwn)
- Separate system config (config.json) from runtime config (user_config.json)

Features:
- config.example.json with all configurable options
- GPIO pin and state configuration
- Audio device index configuration
- Customizable paths (relative or absolute)
- Web port and upload size settings
- No code editing required for deployment

Configuration Structure:
- gpio: hook_pin, hook_pressed_state
- audio: device_index, chunk_size, channels, sample_rate, max_record_seconds
- paths: base_dir, recordings_dir, sounds_dir
- web: port, max_upload_size_mb
- system: active_greeting, default_volume

Script automatically:
- Checks for config.json on startup
- Provides helpful error if missing
- Uses relative paths by default
- Loads test_complete.py config from same file

Updated Documentation:
- Complete configuration guide in README
- Setup instructions without hardcoded paths
- Troubleshooting for config errors
- Device index discovery command

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 14:48:43 +07:00
1657a242fd Add UV package management and volume control feature
Features:
- Add pyproject.toml for UV package management
- Volume control with real-time slider (0-100%)
- Backend volume adjustment with numpy audio scaling
- Volume setting persists in config.json
- Debounced API calls for smooth slider interaction
- Enhanced audio playback with volume multiplier
- Update README with UV installation instructions
- Add volume control documentation

API Changes:
- GET /api/volume - Get current volume setting
- POST /api/volume - Set volume level

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 14:43:57 +07:00
753b1bddfa Add .gitignore and comprehensive README
Changes:
- Add .gitignore to exclude __pycache__, .claude/, and data directories
- Remove cached files and Claude config from repository
- Create detailed README.md with:
  - Project overview and features
  - Installation and setup instructions
  - Usage guide for web interface and phone operation
  - Hardware and software requirements
  - Troubleshooting section
  - API documentation
  - Auto-start configuration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 14:39:56 +07:00