ZADANIE TECHNICZNE
Opracowanie systemu Digital Signage dla sieci ekranów reklamowych
1. Ogólny opis systemu
System przeznaczony do zdalnego zarządzania treściami multimedialnymi (wideo, obrazy) w sieci telewizorów działających na Android TV.
Architektura:
- Backend / Panel sterowania (Admin): PHP (Laravel / Yii2 lub czysty PHP) + MySQL.
- Frontend (Odtwarzacz na TV): HTML5 / JavaScript (Aplikacja Jednostronicowa), uruchamiana na TV w trybie pełnoekranowym przez aplikację Fully Kiosk Browser.
2. Wymagania funkcjonalne: Panel sterowania (Admin na PHP)
2.1. Zarządzanie ekranami (Telewizorami)
- Możliwość dodawania/usuwania ekranów w systemie.
- Każdemu ekranowi przypisywana jest: Nazwa (geo-punkt), unikalny ID (device_token) oraz status (Online/Offline).
- Monitorowanie (Ping): Wyświetlanie statusu TV w czasie rzeczywistym. Jeśli TV nie wysyłał zapytań przez więcej niż 5 minut, status powinien być pomalowany na czerwono (Offline).
2.2. Zarządzanie treścią (Biblioteka mediów)
- Przesyłanie plików (wideo, obrazy) na serwer.
- Usuwanie plików (z automatycznym usunięciem fizycznego pliku z serwera).
- Możliwość przeglądania (i zmieniania), na których ekranach jest emitowany każdy pojedynczy plik multimedialny.
- Ustawienie kolejności odtwarzania plików.
2.3. API serwera (do komunikacji z TV)
Zrealizować REST API (JSON):
- POST /api/ping — przyjmuje od TV jego ID, rejestruje czas ostatniej aktywności (dla statusu Online) i zwraca aktualną wersję playlisty.
- GET /api/file/device_token — zwraca aktualną tablicę JSON z linkami do plików multimedialnych, ich kolejnością oraz ustawieniami czasu wyświetlania.
3. Wymagania funkcjonalne: Odtwarzacz kliencki (HTML5/JS na TV)
Odtwarzacz jest stroną internetową, która jest otwarta na TV. Główne zadanie klienta — autonomia.
3.1. Cache i synchronizacja (Praca bez internetu)
- Przy starcie odtwarzacz żąda playlisty przez API.
- Lokalne przechowywanie: Wszystkie pliki z playlisty (wideo/obrazy) JS powinien ładować do wewnętrznej pamięci przeglądarki (używając Cache API lub IndexedDB). Streaming (odtwarzanie bezpośrednio z internetu) jest zabroniony.
- Synchronizacja:
- Jeśli na serwerze dodano nową treść, odtwarzacz ładuje ją w tle, nie przerywając aktualnego pokazu. Po zakończeniu ładowania — dodaje do transmisji.
- Jeśli treść została usunięta na serwerze, odtwarzacz musi usunąć ją z lokalnej pamięci podręcznej TV, aby nie zapełniać pamięci urządzenia.
- Tryb offline: Przy całkowitym zniknięciu internetu odtwarzacz nieskończoność powtarza ostatnią pomyślnie załadowaną playlistę.
3.2. Odtwarzanie i rotacja
- Cykliczne odtwarzanie treści <video> i <img> zgodnie z ustaloną w adminie kolejnością.
- Dla obrazów należy ustawić czas wyświetlania w sekundach (domyślnie 10 sek).
- Przejścia między filmami powinny być płynne, bez czarnych ekranów i zauważalnego przeładowania strony.
3.3. Logowanie i kontrola błędów (Ochrona przed awariami)
- Obsługa uszkodzonych plików: Jeśli plik wideo jest uszkodzony i nie może być odtworzony, odtwarzacz powinien go pominąć i włączyć następny w kolejności, a nie zawieszać się na czarnym ekranie.
- Logi pokazów (Analiza): Odtwarzacz powinien zapisywać w lokalnej pamięci fakt każdego pomyślnego odtworzenia filmu. Po pojawieniu się internetu te dane są wysyłane na serwer (POST /api/logs), aby w adminie można było zobaczyć statystyki: "Film A na TV nr 3 był wyświetlany 450 razy w ciągu doby oraz 2365 razy łącznie".
4. Wymagania dotyczące optymalizacji pod Android TV
- Interfejs odtwarzacza nie powinien zawierać żadnych elementów sterujących (kursory, paski przewijania, przyciski). Tylko czysta treść na cały ekran.
- Kod JS musi być zoptymalizowany pod kątem pamięci (na czas usuwania nieużywanych elementów DOM i obiektowych URL), ponieważ budżetowe telewizory mają surowe ograniczenia dotyczące pamięci RAM i mogą awaryjnie zamykać kartę przy wycieku pamięci po 12-24 godzinach ciągłej pracy.