Prva verzija mini web serverja (flask). Hvala, Github Copilot.

This commit is contained in:
2026-03-05 18:15:27 +01:00
parent 9e32e58c4c
commit 6ed45d2ebc
13 changed files with 1164 additions and 5 deletions

153
README.md Normal file
View File

@@ -0,0 +1,153 @@
# Projektor pesmi (Song Projector)
A Tkinter-based song projector application with optional Flask web interface for remote control.
## Features
- **Tkinter GUI**: Full-screen song display with customizable fonts, colors, and sizing
- **Song Database**: SQLite database with lyrics and metadata
- **Web Interface** (optional): Control the projector via web browser
- Load songs by number or search by title
- Navigate between lyrics pages
- Toggle uppercase display
- Clear/dim the screen
- **Keyboard Shortcuts**: Quick navigation and screen control
- **Settings**: JSON-based configuration for fonts, colors, and display options
## Project Structure
```
Projekcija/
├── projector.py # Main Tkinter application
├── nastavitve.py # Settings defaults and initialization
├── add_song.py # Utility to import songs into database
├── songs.db # SQLite database with lyrics
├── settings.json # User configuration
├── web/ # Flask web server package
│ ├── __init__.py
│ ├── server.py # Flask app and API endpoints
│ ├── static/ # Web assets
│ │ ├── styles.css
│ │ └── script.js
│ └── templates/
│ └── index.html
├── tests/ # Test suite
│ ├── test_api.py
│ ├── test_integration.py
│ └── test_mock.py
└── startup.bat # Windows batch launcher
```
## Installation
### Requirements
- Python 3.8+
- Flask (for web interface)
- sqlite3 (included with Python)
### Setup
```bash
# Install Flask
pip install flask
# Create or import songs into database (optional)
python add_song.py
```
## Usage
### Launch the Application
```bash
python projector.py
```
Or use the batch file:
```bash
startup.bat
```
### Keyboard Shortcuts
- **Enter**: Load song by number (when typing in keyboard mode)
- **+** (plus): Clear/dim the screen
- **-** (minus): Previous page
- **/** (slash): Search songs by title
### Configuration
Edit `settings.json` to customize:
- Font name, size, and color
- Background color
- Display width percentage
- **web_port**: Set to a port number (e.g., 5000) to enable web interface, or 0 to disable
Example `settings.json`:
```json
{
"font_name": "Times New Roman",
"font_size": 32,
"fg_color": "#FFFFFF",
"bg_color": "#000000",
"screen_width_percent": 60,
"font_bold": true,
"web_port": 5000
}
```
### Web Interface
If `web_port` is configured and > 0, the web interface opens automatically:
```
http://127.0.0.1:<web_port>/
```
Features:
- **Load by Number**: Input song ID and press "Naloži"
- **Search**: Find songs by keyword
- **Navigation**: Next/Previous buttons to flip pages
- **Case Toggle**: "velikE črke" button for uppercase
- **Clear Screen**: "Zatemniti ekran" button to dim display
## Testing
Run the integration test to verify the web server:
```bash
python -m tests.test_integration
```
This starts a mock projector, launches the Flask server, and exercises all API endpoints.
## Architecture
### Database Schema
- `songs` table: `id, title, lyrics`
- Read-only mode (no modifications via web interface)
### API Endpoints
- `GET /` HTML interface
- `GET /api/state` Current projector state (text, page, navigation flags)
- `POST /api/load_song` Load a song
- `POST /api/next_page` Next page
- `POST /api/prev_page` Previous page
- `POST /api/clear_screen` Clear display
- `POST /api/toggle_caps` Toggle uppercase
- `POST /api/search_songs` Find songs by title
### Threading
- Web server runs in a daemon thread
- Safe SQLite access with `check_same_thread=False`
## Notes
- The web interface is optional; disable it by setting `web_port: 0` in settings
- HTML, CSS, and JavaScript are stored in separate files under `web/`
- For production deployment, use a WSGI server (Gunicorn, uWSGI) instead of Flask development server
- Songs database is read-only via web interface; add songs using admin tools or direct SQL
## License
[Add your license here]