Skip to content

Commit 14b1fa0

Browse files
committed
Implement playlist versioning and watcher thread
Introduces a versioned playlist with thread-safe updates and a background watcher for live rotation content changes. Updates API to return playlist version and items, refactors config for scan interval, and improves player.js to handle playlist updates and robust media advancement. Removes unused video extension, updates styles, and cleans up rotation demo files. Took 1 hour 27 minutes
1 parent d41bfbf commit 14b1fa0

File tree

12 files changed

+309
-258
lines changed

12 files changed

+309
-258
lines changed

README.md

Lines changed: 57 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -1,233 +1,101 @@
1-
# 🖥️ Kiosk Rotation Engine (MVP)
1+
# 🖥️ Kiosk Rotation Engine
22

3-
> **A dead‑simple, self‑hosted rotation engine for view‑only screens**
4-
> Built for factory floors, TVs, kiosks, and any display where *scrolling and
5-
> clicking are illegal*.
3+
A lightweight, self‑hosted digital signage engine for kiosk displays.
64

7-
This project provides a **fire‑and‑forget kiosk server** that automatically
8-
discovers content from disk and rotates it fullscreen in a browser.
9-
10-
No accounts. No editors. No cloud. No vendor lock‑in.
11-
12-
Just drop content in a folder and let it play.
5+
Drop files in a folder. Screens update automatically. No cloud. No accounts.
6+
No nonsense.
137

148
---
159

16-
## 🎯 What this is
17-
18-
This is **not** a full digital signage platform.
19-
20-
It is:
21-
- A **local kiosk server**
22-
- With **filesystem‑driven content discovery**
23-
- Designed for **non‑interactive TVs / monitors**
24-
- Optimized for **industrial / factory environments**
10+
## ✨ Features
2511

26-
The goal is simple:
27-
28-
> **If it’s a webpage, image, or HTML file — it can be shown on a screen.**
12+
* 📂 Folder‑based rotation (images, videos, HTML)
13+
* 🔄 Live updates — viewers refresh automatically
14+
* 🧠 Playlist versioning (safe, flicker‑free updates)
15+
* 🖥️ Fullscreen kiosk player (browser‑based)
16+
* 🛡️ Fault‑tolerant (missing files won’t crash playback)
17+
* ⚙️ Simple YAML configuration
18+
* 🐧 Works on Linux, Windows, Raspberry Pi
2919

3020
---
3121

32-
## 🧠 Design philosophy (KISS, intentionally)
33-
34-
- The **screen is dumb** (just a browser)
35-
- The **rotation logic is simple**
36-
- The **content owns itself**
37-
- Humans should be able to add content **without touching Python**
38-
39-
This avoids:
40-
- Over‑engineering
41-
- Vendor lock‑in
42-
- UI builders nobody likes
43-
- Becoming “the TV admin guy”
22+
## 🚀 Quick Start
4423

45-
---
46-
47-
## 📁 Core concept: the `rotation/` folder
48-
49-
The kiosk automatically scans a folder and turns its contents into
50-
fullscreen views.
51-
52-
```
53-
rotation/
54-
├── onsite.url
55-
├── production.url
56-
├── safety.html
57-
├── christmas.html
58-
├── announcement.png
59-
├── map.jpg
60-
├── maintenance/
61-
│ └── index.html
24+
```bash
25+
git clone https://github.com/ProtoXCode/Kiosk-Rotation-Engine.git
26+
cd kiosk-rotation-engine
27+
pip install -r requirements.txt
28+
python run.py
6229
```
6330

64-
Anything placed here becomes part of the rotation.
65-
66-
No restart required (depending on scan interval).
67-
68-
---
69-
70-
## 🧩 Supported content types (MVP)
71-
72-
### 🌐 `.url` files → Web dashboards
73-
74-
A text file containing a single URL:
31+
Open in a browser:
7532

7633
```
77-
http://onsite.local/onsite
34+
http://<host>:8080
7835
```
7936

80-
Rendered as:
81-
- Fullscreen iframe
82-
83-
Perfect for:
84-
- Dash dashboards
85-
- ERP views
86-
- Grafana
87-
- Internal tools
37+
(Use fullscreen / kiosk mode for production screens.)
8838

8939
---
9040

91-
### 📄 `.html` files → Static pages
41+
## 📁 Adding Content
9242

93-
Dropped directly into `rotation/`.
43+
Put files into the **rotation directory** (default: `rotation/`).
9444

95-
Rendered as:
96-
- Fullscreen iframe
45+
Supported formats:
9746

98-
Supports:
99-
- CSS
100-
- JavaScript
101-
- Animations
102-
- Videos
47+
* Images: `.jpg`, `.png`, `.jpeg`
48+
* HEIC / HEIF: `.heic`, `.heif` (auto‑converted to JPEG)
49+
* Video: `.mp4`, `.webm`
50+
* HTML: `.html` (rendered via iframe)
51+
* URL: `'.url` (rendered via iframe, target site must allow to be built in)
10352

104-
Ideal for:
105-
- Safety notices
106-
- Announcements
107-
- Event info
53+
Changes are picked up automatically — no reload, no restart.
10854

10955
---
11056

111-
### 🖼 Images (`.png`, `.jpg`, `.webp`) → Posters
57+
## ⚙️ Configuration (`config.yaml`)
11258

113-
Rendered as:
114-
- Fullscreen, centered image
59+
Example:
11560

116-
Ideal for:
117-
- Posters
118-
- Floor maps
119-
- Evacuation plans
120-
- One‑off announcements
121-
122-
---
123-
124-
### 📁 Folders with `index.html`
125-
126-
```
127-
rotation/maintenance/index.html
61+
```yaml
62+
rotation:
63+
media_directory: /srv/kiosk/rotation
64+
default_duration: 10
65+
image_duration: 10
66+
playlist_scan: 60
67+
video_mute: true
12868
```
12969
130-
Rendered as:
131-
- Fullscreen mini‑site
132-
133-
Allows multi‑file HTML content with assets.
70+
* **media_directory** – Folder watched for content
71+
* **default_duration** – Fallback duration (seconds)
72+
* **image_duration** – Image display time
73+
* **playlist_scan** – Backend rescan interval (seconds)
74+
* **video_mute** – Start videos muted
13475
13576
---
13677
137-
## 🔁 Rotation behavior (MVP)
78+
## 🧠 How It Works (Short Version)
13879
139-
- Content rotates automatically
140-
- Fixed duration per view (configurable)
141-
- Fullscreen only
142-
- No scrolling
143-
- No user input
80+
* Backend scans the rotation folder on a fixed interval
81+
* Builds a versioned playlist
82+
* Viewers fetch the playlist and play it sequentially
83+
* Updates are applied cleanly on the next loop
14484
145-
The kiosk is **view‑only by design**.
85+
No polling storms. No race conditions. No broken screens.
14686
14787
---
14888
149-
## 🖥️ Intended usage
89+
## ⚠️ Design Notes
15090
151-
- Factory floor TVs
152-
- Production overview screens
153-
- Safety / evacuation displays
154-
- Office status boards
155-
- Any screen that should *just show things*
156-
157-
The kiosk runs via:
158-
- Browser (Chrome / Edge / Firefox)
159-
- Kiosk / fullscreen mode recommended
160-
161-
---
162-
163-
## 🚧 What this MVP does NOT include (by design)
164-
165-
Not included **yet**:
166-
- UI manager
167-
- Authentication
168-
- User roles
169-
- Screen grouping
170-
- Per‑view schedules
171-
- Remote control
172-
173-
These are **explicitly postponed** to keep the MVP clean.
174-
175-
---
176-
177-
## 🛣️ Planned next steps (post‑MVP)
178-
179-
Once the rotation engine is stable:
180-
181-
### 🧑‍💼 Manager UI (NiceGUI 3.0)
182-
- CRUD for rotation content
183-
- Upload / delete files
184-
- Enable / disable views
185-
- Adjust rotation timing
186-
187-
### 📱 Remote control mode
188-
- Use phone/tablet to temporarily take control
189-
- Select a specific view (e.g. team meeting)
190-
- Return to auto‑rotation
191-
192-
### 🚨 Emergency override
193-
- Force evacuation / safety view
194-
- Pause rotation
195-
196-
All of these builds **on top of the MVP**, not inside it.
197-
198-
---
199-
200-
## 🧠 Why this exists
201-
202-
Most digital signage solutions:
203-
- Are cloud‑locked
204-
- Cost per screen
205-
- Don’t integrate cleanly with ERP systems
206-
- Are painful to maintain long‑term
207-
208-
This project exists to provide:
209-
- A local‑first alternative
210-
- With clean system boundaries
211-
- That scales without turning into a platform monster
212-
213-
---
214-
215-
## 🧑‍💻 Author
216-
217-
Built by **Tom Erik Harnes**
218-
Focused on practical, industrially grounded software that survives
219-
real environments.
91+
* No authentication (intended for trusted networks)
92+
* No admin UI — filesystem is the source of truth
93+
* Not designed for public internet exposure
22094
22195
---
22296
223-
## 🏄‍♂️ Final note
224-
225-
This project is intentionally boring.
97+
## 📜 License
22698
227-
Boring means:
228-
- Stable
229-
- Predictable
230-
- Easy to explain
231-
- Hard to replace
99+
MIT License
232100
233-
That’s exactly what you want on a factory wall.
101+
Use it, break it, improve it — just don’t put it behind a paywall 😎

0 commit comments

Comments
 (0)