Make twitch/youtube chat widget

This commit is contained in:
Joey Yakimowich-Payne 2026-01-07 12:47:09 -07:00
commit 0842dccf73
22 changed files with 3787 additions and 45 deletions

197
DISTRIBUTION.md Normal file
View file

@ -0,0 +1,197 @@
# Distribution Guide
## How the Config System Works with PyInstaller
### Architecture Overview
The application uses a **two-location** file system:
1. **Bundled Files (Read-Only)** - Inside the .exe
- Python source code
- Web assets (`app/assets/web/`)
- Everything compiled into the executable
2. **User Data Directory (Read-Write)** - User's local machine
- Configuration: `%LOCALAPPDATA%\StreamerWidgets\config.json`
- OAuth Tokens: `%LOCALAPPDATA%\StreamerWidgets\tokens.json`
- Album Art: `%LOCALAPPDATA%\StreamerWidgets\art\`
### Why This Works Well
**Benefits:**
- ✅ **No hardcoded credentials** in the .exe
- ✅ **Survives updates** - User config persists when you release new versions
- ✅ **User-specific** - Each user has their own OAuth credentials
- ✅ **Secure** - Credentials never in source control or distributed executable
- ✅ **Easy to find** - Standard Windows application data location
**User Experience:**
1. User downloads and runs `streamer-widgets.exe`
2. App creates `config.json` automatically on first run
3. User visits http://127.0.0.1:8765/config
4. Clicks "Open Config Directory" button
5. Edits `config.json` with their OAuth credentials
6. Restarts the app
7. OAuth authentication works!
## Building the Executable
### Build Command
```bash
uv sync --group build
pyinstaller --noconsole --onefile --name streamer-widgets ^
--add-data "app/assets/web;app/assets/web" ^
run_tray.py
```
### What Gets Bundled
- All Python code
- `app/assets/web/` directory (HTML, CSS, JS for widgets)
- Python dependencies
### What Does NOT Get Bundled
- `config.json` - Created at runtime in user directory
- `tokens.json` - Created when user authenticates
- `config.example.json` - Template file (not needed in .exe)
## Distribution Checklist
When distributing the application:
- [ ] Build the executable with PyInstaller
- [ ] Test the .exe on a clean machine (no Python installed)
- [ ] Verify config directory creation works
- [ ] Test "Open Config Directory" button in web UI
- [ ] Include `CHAT_SETUP.md` or link to documentation
- [ ] Provide example OAuth setup instructions
## User Setup Instructions (for README/docs)
### For End Users
**First Run:**
1. Run `streamer-widgets.exe`
2. The app creates a configuration file automatically
3. Open http://127.0.0.1:8765/config in your browser
**Setting Up Chat Authentication:**
1. In the config UI, you'll see a warning if OAuth is not configured
2. Click the **"📁 Open Config Directory"** button
3. This opens: `C:\Users\YourName\AppData\Local\StreamerWidgets\`
4. Edit `config.json` with your OAuth credentials:
- Get Twitch credentials from https://dev.twitch.tv/console/apps
- Get YouTube credentials from https://console.cloud.google.com/
5. Save the file
6. **Restart the application**
7. Return to http://127.0.0.1:8765/config and click "Login with Twitch/YouTube"
**Example config.json:**
```json
{
"twitch_oauth": {
"client_id": "your_twitch_client_id_here",
"client_secret": "your_twitch_client_secret_here",
"redirect_uri": "http://localhost:8765/auth/twitch/callback"
},
"youtube_oauth": {
"client_id": "your_youtube_client_id.apps.googleusercontent.com",
"client_secret": "your_youtube_client_secret_here",
"redirect_uri": "http://localhost:8765/auth/youtube/callback"
},
"server_host": "127.0.0.1",
"server_port": 8765
}
```
## Troubleshooting for Users
### "I can't find the config file"
1. Visit http://127.0.0.1:8765/config
2. The warning box shows the exact path
3. Or click "Open Config Directory" to open it directly
### "OAuth isn't working"
1. Check that `client_id` and `client_secret` are filled in (not placeholders)
2. Make sure you **restarted the app** after editing config.json
3. Verify the redirect URIs match in both:
- Your Twitch/YouTube developer console
- The `config.json` file
### "Config directory won't open"
The path is always: `%LOCALAPPDATA%\StreamerWidgets\`
In Windows:
1. Press `Win + R`
2. Type: `%LOCALAPPDATA%\StreamerWidgets`
3. Press Enter
## Updates and Versioning
When you release a new version:
1. Users download the new `.exe`
2. **Config persists** - No need to reconfigure OAuth
3. **Tokens persist** - Users stay authenticated
4. Just replace the old .exe with the new one
The config directory is **separate from the executable**, so updates are seamless.
## Security Considerations
**What's Safe:**
- Distribute `streamer-widgets.exe` publicly
- Share the source code on GitHub
- Include `config.example.json` as a template
**What to NEVER Distribute:**
- Actual `config.json` with real credentials
- `tokens.json` files
- Real OAuth Client IDs/Secrets
**User Responsibility:**
- Users must obtain their own OAuth credentials
- Credentials are stored locally on their machine only
- Never share `config.json` or `tokens.json` files
## Advantages Over Alternatives
### Why Not Environment Variables?
❌ Hard for non-technical users
❌ Doesn't work well with PyInstaller .exe
❌ Difficult to edit and manage
### Why Not Hardcoded Credentials?
❌ Security risk
❌ Every user would use the same credentials
❌ Would hit OAuth rate limits
❌ Can't distribute publicly
### Why Config File in User Directory?
✅ Standard practice for desktop apps
✅ Survives application updates
✅ User-specific credentials
✅ Easy to locate and edit
✅ Secure (local machine only)
✅ Works perfectly with PyInstaller
## Summary
The config system is **production-ready for distribution**:
1. **No code changes needed** by end users
2. **Auto-creates config** on first run
3. **Easy to find** via UI button
4. **Persists across updates**
5. **Secure** - no credentials in .exe
6. **User-friendly** - clear instructions in UI
Just build the .exe and distribute it. Users will be guided through the setup process by the web UI.