Môj syn, má rad niekoľko playlistov, ktoré rád počúva pri uspávaní. Tak som sa rozhodol, nepoužívať youtube, ale vyskúšam urobiť vlastný MP3 prehrávač, ktorý by fungoval online. Zvolil so na to Docker a zadanie bolo následovné:

  • Sprístupniť niekoľko playlistov
  • pozadie, aby sa menilo každých 5 minút
  • playlisty, aby sa dali meniť
  • Hudba aby sa dala stišovať, zosiľňovať
  • Playlist, aby sa dal zastaviť a znova spustiť.
  • Chcel som, aby docker bežal na porte 3030

Postup:

Vytvoril som jeden priečinok pomenovaný matej.

Do neho som vložil 2 priečinky

  • MP3
  • JPG

Do jpg som nahodil obrázky a do MP3 playlisty, ktoré chcem aby sa dali spúšťať.

Vytvoril som súbory:

  • docker-compose.yaml
  • index.html
  • script.js
  • style.css

docker-compose.yaml

version: '3'
services:
  mato-player:
    image: nginx:alpine
    container_name: mato_container
    ports:
      - "3030:80"
    volumes:
      - ./mato:/usr/share/nginx/html
    restart: always

index.html

<!DOCTYPE html>
<html lang="sk">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mato Player</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <h1>🎵 Maťkov playlist</h1>

        <div class="controls-group">
            <label for="music-select">Vyber si zvuk/skladbu:</label>
            <select id="music-select">
                <option value="mp3/Brahms.mp3">Brahms - Uspávanka</option>
                <option value="mp3/mozart.mp3">Mozart - Klasika</option>
                <option value="mp3/voda.mp3">Šum vody</option>
                <option value="mp3/metal.mp3">Metal</option>
                <option value="mp3/vysavac.mp3">Biely šum (Vysávač)</option>
            </select>
        </div>

        <button id="music-btn" class="btn-paused" onclick="toggleMusic()">🎶 Spustiť</button>

        <div class="volume-container">
            <label for="volume-control">Hlasitosť</label>
            <input type="range" id="volume-control" min="0" max="1" step="0.1" value="0.5">
        </div>
    </div>

    <audio id="bg-music" loop>
        <source src="mp3/Brahms.mp3" type="audio/mpeg">
    </audio>

    <script src="script.js"></script>
</body>
</html>

script.js

document.addEventListener('DOMContentLoaded', () => {
    const audio = document.getElementById("bg-music");
    const volumeControl = document.getElementById("volume-control");
    const musicSelect = document.getElementById("music-select");
    const musicBtn = document.getElementById("music-btn");

    // --- 1. ROTÁCIA OBRÁZKOV (každých 5 minút) ---
    const images = [
        'astrobot.jpg', 'astrobot2.jpg', 'gumkaci.jpg', 'gumkaci2.jpg',
        'hlada_sa_nemo.jpg', 'macko_pu.jpg', 'paw_patrol.jpg', 
        'paw-patrol2.jpg', 'smolkovia.jpg'
    ];
    
    let currentImgIndex = Math.floor(Math.random() * images.length);

    const changeBg = () => {
        const imgName = images[currentImgIndex];
        document.body.style.backgroundImage = `url('jpg/${imgName}')`;
        console.log("Pozadie zmenené na: " + imgName);
        currentImgIndex = (currentImgIndex + 1) % images.length;
    };

    changeBg(); // Spustiť hneď
    setInterval(changeBg, 300000); // 300 000 ms = 5 minút


    // --- 2. OVLÁDANIE HUDBY ---
    if (audio && volumeControl) {
        audio.volume = 0.5;
        volumeControl.addEventListener('input', (e) => {
            audio.volume = e.target.value;
        });
    }

    if (musicSelect && audio) {
        musicSelect.addEventListener('change', () => {
            const isPlaying = !audio.paused;
            audio.src = musicSelect.value;
            if (isPlaying) {
                audio.play().catch(e => console.log("Čakám na interakciu..."));
            }
            // Reset tlačidla ak sa zmení skladba počas pauzy
            if (audio.paused) {
                musicBtn.innerText = "🎶 Spustiť: " + musicSelect.options[musicSelect.selectedIndex].text;
            }
        });
    }
});

function toggleMusic() {
    const audio = document.getElementById("bg-music");
    const btn = document.getElementById("music-btn");

    if (audio.paused) {
        audio.play().then(() => {
            btn.innerText = "⏸ Pozastaviť";
            btn.className = "btn-playing";
        }).catch(err => alert("Najprv kliknite niekde na stránku pre povolenie zvuku."));
    } else {
        audio.pause();
        btn.innerText = "🎶 Pokračovať";
        btn.className = "btn-paused";
    }
}

style.css

body {
    margin: 0;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    font-family: 'Arial', sans-serif;
    background-size: cover;
    background-position: center;
    transition: background-image 1.5s ease-in-out; /* Plynulá zmena obrázka */
}

.container {
    background: rgba(0, 0, 0, 0.6);
    padding: 30px;
    border-radius: 20px;
    color: white;
    text-align: center;
    width: 300px;
    backdrop-filter: blur(5px);
    border: 2px solid rgba(255, 255, 255, 0.2);
}

.controls-group { margin: 20px 0; }

select {
    width: 100%;
    padding: 10px;
    border-radius: 10px;
    background: #444;
    color: white;
    border: none;
}

#music-btn {
    width: 100%;
    padding: 15px;
    border-radius: 10px;
    border: none;
    font-weight: bold;
    cursor: pointer;
    color: white;
    font-size: 1rem;
}

.btn-paused { background-color: #d62828; }
.btn-playing { background-color: #28a745; }

.volume-container { margin-top: 20px; }

input[type="range"] { width: 100%; cursor: pointer; }

Spustil som docker

sudo docker-compose up -d

Prípadne, ak je potrebné urobiť zmeny tak je nutné docker zastaviť a znovu spustiť

sudo docker-compose down
sudo docker-compose up -d