{"id":432,"date":"2026-08-15T15:49:18","date_gmt":"2026-08-15T19:49:18","guid":{"rendered":"https:\/\/realrockrevival.com\/?page_id=432"},"modified":"2026-08-15T16:09:48","modified_gmt":"2026-08-15T20:09:48","slug":"rrr-player","status":"publish","type":"page","link":"https:\/\/realrockrevival.com\/index.php\/rrr-player\/","title":{"rendered":"RRR Player"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"432\" class=\"elementor elementor-432\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7504d4d e-flex e-con-boxed e-con e-parent\" data-id=\"7504d4d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-78bf870 elementor-widget elementor-widget-html\" data-id=\"78bf870\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* ==========================================================\n   REAL ROCK REVIVAL \u2014 STANDALONE PLAYER\n   ========================================================== *\/\n\n\/* ---------- PAGE CLEANUP ---------- *\/\n\nhtml,\nbody {\n    margin: 0 !important;\n    padding: 0 !important;\n    background: #070707 !important;\n    overflow-x: hidden;\n}\n\nbody {\n    min-height: 100vh;\n}\n\n.elementor,\n.elementor-section,\n.elementor-container,\n.elementor-widget-wrap,\n.elementor-widget-html,\n.elementor-widget-container {\n    background: transparent !important;\n}\n\n#rrr-player-page {\n    width: 100%;\n    min-height: 100vh;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    padding: 24px;\n\n    box-sizing: border-box;\n\n    background:\n        radial-gradient(\n            circle at top right,\n            rgba(204,30,32,.10),\n            transparent 38%\n        ),\n        #070707;\n}\n\n\n\/* ---------- PLAYER ---------- *\/\n\n#rrr-player {\n    --red: #cc1e20;\n    --red-bright: #ef2428;\n    --orange: #ff7600;\n    --yellow: #ffc20e;\n    --muted: #b8b8b8;\n\n    position: relative;\n\n    width: 100%;\n    max-width: 620px;\n\n    margin: 0 auto;\n    padding: 26px;\n\n    box-sizing: border-box;\n\n    background:\n        radial-gradient(\n            circle at top right,\n            rgba(204,30,32,.15),\n            transparent 35%\n        ),\n        linear-gradient(\n            145deg,\n            #181818,\n            #090909\n        );\n\n    border: 1px solid rgba(255,255,255,.10);\n    border-radius: 18px;\n\n    color: #ffffff;\n\n    font-family: Arial, Helvetica, sans-serif;\n\n    box-shadow:\n        0 24px 70px rgba(0,0,0,.60),\n        0 0 28px rgba(204,30,32,.15);\n}\n\n\n\/* ---------- WINDOW BUTTONS ---------- *\/\n\n.rrr-window-controls {\n    position: absolute;\n    top: 12px;\n    right: 14px;\n\n    z-index: 50;\n\n    display: flex;\n    gap: 7px;\n}\n\n.rrr-window-button {\n    width: 30px;\n    height: 30px;\n\n    padding: 0;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    border: 1px solid rgba(255,255,255,.10);\n    border-radius: 50%;\n\n    background: rgba(255,255,255,.045);\n    color: #aaaaaa;\n\n    font-size: 18px;\n    font-weight: 700;\n    line-height: 1;\n\n    cursor: pointer;\n\n    transition: .18s ease;\n}\n\n.rrr-window-button:hover {\n    color: #ffffff;\n    background: rgba(255,255,255,.11);\n    transform: scale(1.06);\n}\n\n#rrr-close:hover {\n    background: var(--red);\n    border-color: var(--red);\n}\n\n\n\/* ---------- LOGO ---------- *\/\n\n.rrr-player-logo {\n    text-align: center;\n    margin-bottom: 22px;\n}\n\n.rrr-player-logo img {\n    display: inline-block;\n\n    width: 260px;\n    max-width: 78%;\n\n    height: auto;\n}\n\n\n\/* ---------- MAIN AREA ---------- *\/\n\n.rrr-player-main {\n    display: grid;\n\n    grid-template-columns:\n        190px 1fr;\n\n    gap: 26px;\n\n    align-items: center;\n}\n\n\n\/* ---------- ALBUM ART ---------- *\/\n\n.rrr-art-frame {\n    width: 190px;\n    height: 190px;\n\n    padding: 4px;\n\n    box-sizing: border-box;\n\n    border-radius: 18px;\n\n    background:\n        linear-gradient(\n            135deg,\n            var(--red),\n            var(--orange) 45%,\n            var(--yellow) 75%,\n            #ffffff\n        );\n\n    box-shadow:\n        0 0 18px rgba(204,30,32,.35),\n        0 0 16px rgba(255,194,14,.15);\n}\n\n.rrr-art-frame img {\n    width: 100%;\n    height: 100%;\n\n    display: block;\n    object-fit: cover;\n\n    border-radius: 14px;\n\n    background: #080808;\n}\n\n\n\/* ---------- METADATA ---------- *\/\n\n.rrr-live-row {\n    display: flex;\n    align-items: center;\n\n    gap: 8px;\n\n    margin-bottom: 8px;\n}\n\n.rrr-live-dot {\n    width: 9px;\n    height: 9px;\n\n    border-radius: 50%;\n\n    background: var(--red-bright);\n\n    box-shadow:\n        0 0 5px var(--red),\n        0 0 12px rgba(239,36,40,.8);\n\n    animation:\n        rrrPulse\n        1.4s\n        ease-in-out\n        infinite;\n}\n\n.rrr-live-label {\n    color: var(--red-bright);\n\n    font-size: 13px;\n    font-weight: 900;\n\n    letter-spacing: 1.3px;\n\n    text-transform: uppercase;\n}\n\n.rrr-now-label {\n    margin-bottom: 6px;\n\n    color: var(--yellow);\n\n    font-size: 12px;\n    font-weight: 900;\n\n    letter-spacing: 1.3px;\n\n    text-transform: uppercase;\n}\n\n#rrr-artist {\n    margin: 0 0 5px;\n\n    color: #ffffff;\n\n    font-size: 27px;\n    line-height: 1.08;\n    font-weight: 900;\n\n    text-transform: uppercase;\n}\n\n#rrr-song {\n    margin: 0;\n\n    color: var(--muted);\n\n    font-size: 18px;\n    line-height: 1.3;\n    font-weight: 600;\n}\n\n\n\/* ==========================================================\n   FIXED LED ANALYZER\n   ========================================================== *\/\n\n.rrr-led-display {\n    height: 68px;\n\n    margin-top: 17px;\n    padding: 8px 10px;\n\n    display: flex;\n    align-items: stretch;\n    gap: 4px;\n\n    box-sizing: border-box;\n\n    overflow: hidden;\n\n    border-radius: 7px;\n\n    background:\n        linear-gradient(\n            to bottom,\n            #060606,\n            #101010\n        );\n\n    border:\n        1px solid rgba(255,255,255,.08);\n\n    box-shadow:\n        inset 0 0 18px rgba(0,0,0,.95),\n        0 0 12px rgba(204,30,32,.09);\n}\n\n.rrr-led-column {\n    flex: 1 1 0;\n\n    display: flex;\n    flex-direction: column-reverse;\n\n    gap: 2px;\n\n    min-width: 4px;\n}\n\n.rrr-led {\n    flex: 1 1 0;\n\n    min-height: 3px;\n\n    border-radius: 1px;\n\n    background: #261012;\n\n    opacity: .24;\n\n    transition:\n        background .04s linear,\n        opacity .04s linear,\n        box-shadow .04s linear;\n}\n\n.rrr-led.low.active {\n    background: #d91d24;\n\n    opacity: 1;\n\n    box-shadow:\n        0 0 3px rgba(217,29,36,.75);\n}\n\n.rrr-led.mid.active {\n    background: #ff7200;\n\n    opacity: 1;\n\n    box-shadow:\n        0 0 4px rgba(255,114,0,.72);\n}\n\n.rrr-led.high.active {\n    background: #ffc20e;\n\n    opacity: 1;\n\n    box-shadow:\n        0 0 5px rgba(255,194,14,.78);\n}\n\n\n\/* ---------- STATUS ---------- *\/\n\n#rrr-stream-status {\n    margin-top: 9px;\n\n    color: #777777;\n\n    font-size: 11px;\n    font-weight: 700;\n\n    letter-spacing: .8px;\n\n    text-transform: uppercase;\n}\n\n\n\/* ---------- CONTROLS ---------- *\/\n\n.rrr-controls {\n    margin-top: 26px;\n\n    padding: 16px 18px;\n\n    display: flex;\n    align-items: center;\n\n    gap: 18px;\n\n    background:\n        rgba(255,255,255,.045);\n\n    border:\n        1px solid rgba(255,255,255,.07);\n\n    border-radius: 14px;\n}\n\n#rrr-play {\n    width: 54px;\n    height: 54px;\n\n    flex: 0 0 auto;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    padding: 0;\n\n    border: none;\n    border-radius: 50%;\n\n    cursor: pointer;\n\n    background: var(--red-bright);\n    color: #ffffff;\n\n    font-size: 22px;\n\n    box-shadow:\n        0 0 17px rgba(204,30,32,.50);\n}\n\n#rrr-play:hover {\n    background: #ff3135;\n}\n\n.rrr-control-info {\n    flex: 1;\n}\n\n.rrr-control-title {\n    margin-bottom: 3px;\n\n    color: #ffffff;\n\n    font-size: 14px;\n    font-weight: 900;\n\n    text-transform: uppercase;\n}\n\n.rrr-control-subtitle {\n    color: #888888;\n\n    font-size: 11px;\n    font-weight: 700;\n}\n\n.rrr-volume-wrap {\n    display: flex;\n    align-items: center;\n\n    gap: 9px;\n\n    flex: 0 0 150px;\n}\n\n.rrr-volume-icon {\n    color: var(--yellow);\n\n    font-size: 18px;\n}\n\n#rrr-volume {\n    width: 115px;\n\n    accent-color: var(--yellow);\n\n    cursor: pointer;\n}\n\n\n\/* ---------- MINIMIZED PLAYER ---------- *\/\n\n#rrr-player.rrr-minimized {\n    width: 390px;\n    max-width: calc(100vw - 24px);\n\n    padding: 12px 14px;\n\n    border-radius: 12px;\n}\n\n#rrr-player.rrr-minimized .rrr-player-logo,\n#rrr-player.rrr-minimized .rrr-player-main {\n    display: none;\n}\n\n#rrr-player.rrr-minimized .rrr-controls {\n    margin: 0;\n\n    padding:\n        10px 90px 10px 10px;\n\n    border: none;\n\n    background: transparent;\n}\n\n#rrr-player.rrr-minimized #rrr-play {\n    width: 44px;\n    height: 44px;\n\n    font-size: 18px;\n}\n\n#rrr-player.rrr-minimized .rrr-control-subtitle,\n#rrr-player.rrr-minimized .rrr-volume-wrap {\n    display: none;\n}\n\n#rrr-player.rrr-minimized .rrr-window-controls {\n    top: 18px;\n    right: 14px;\n}\n\n#rrr-player-page.rrr-page-minimized {\n    align-items: flex-start;\n\n    padding: 12px;\n}\n\n\n\/* ---------- LIVE DOT ---------- *\/\n\n@keyframes rrrPulse {\n\n    0%,\n    100% {\n        opacity: 1;\n        transform: scale(1);\n    }\n\n    50% {\n        opacity: .45;\n        transform: scale(.78);\n    }\n}\n\n\n\/* ---------- MOBILE ---------- *\/\n\n@media (max-width: 600px) {\n\n    #rrr-player-page {\n        padding: 12px;\n        align-items: flex-start;\n    }\n\n    #rrr-player {\n        padding: 20px;\n    }\n\n    .rrr-player-logo img {\n        width: 220px;\n    }\n\n    .rrr-player-main {\n        grid-template-columns: 1fr;\n\n        text-align: center;\n    }\n\n    .rrr-art-frame {\n        width: 180px;\n        height: 180px;\n\n        margin: 0 auto;\n    }\n\n    .rrr-live-row {\n        justify-content: center;\n    }\n\n    #rrr-artist {\n        font-size: 24px;\n    }\n\n    #rrr-song {\n        font-size: 17px;\n    }\n\n    .rrr-controls {\n        flex-wrap: wrap;\n        justify-content: center;\n    }\n\n    .rrr-volume-wrap {\n        flex-basis: 100%;\n        justify-content: center;\n    }\n\n    #rrr-player.rrr-minimized {\n        width: calc(100vw - 24px);\n    }\n}\n<\/style>\n\n\n<div id=\"rrr-player-page\">\n\n    <div id=\"rrr-player\">\n\n\n        <!-- WINDOW CONTROLS -->\n\n        <div class=\"rrr-window-controls\">\n\n            <button\n                id=\"rrr-minimize\"\n                class=\"rrr-window-button\"\n                type=\"button\"\n                title=\"Minimize\"\n            >\n                \u2212\n            <\/button>\n\n            <button\n                id=\"rrr-close\"\n                class=\"rrr-window-button\"\n                type=\"button\"\n                title=\"Close Player\"\n            >\n                \u00d7\n            <\/button>\n\n        <\/div>\n\n\n        <!-- LOGO -->\n\n        <div class=\"rrr-player-logo\">\n\n            <img decoding=\"async\"\n                src=\"https:\/\/realrockrevival.com\/wp-content\/uploads\/2026\/08\/82a86fcb-5682-47c5-9dce-4bbdacd0c8a3.png\"\n                alt=\"Real Rock Revival\"\n            >\n\n        <\/div>\n\n\n        <!-- MAIN PLAYER AREA -->\n\n        <div class=\"rrr-player-main\">\n\n\n            <div class=\"rrr-art-frame\">\n\n                <img decoding=\"async\"\n                    id=\"rrr-art\"\n                    src=\"https:\/\/realrockrevival.com\/wp-content\/uploads\/2026\/08\/6b17152f-c6fd-4654-811c-87c133876acd.png\"\n                    alt=\"Now Playing Artwork\"\n                >\n\n            <\/div>\n\n\n            <div class=\"rrr-player-meta\">\n\n                <div class=\"rrr-live-row\">\n\n                    <span class=\"rrr-live-dot\"><\/span>\n\n                    <span class=\"rrr-live-label\">\n                        Live On Air\n                    <\/span>\n\n                <\/div>\n\n\n                <div class=\"rrr-now-label\">\n                    Now Playing\n                <\/div>\n\n\n                <h2 id=\"rrr-artist\">\n                    Real Rock Revival\n                <\/h2>\n\n\n                <p id=\"rrr-song\">\n                    Loading live song information...\n                <\/p>\n\n\n                <div\n                    id=\"rrr-led-display\"\n                    class=\"rrr-led-display\"\n                    aria-hidden=\"true\"\n                ><\/div>\n\n\n                <div id=\"rrr-stream-status\">\n                    Connecting to Real Rock Revival...\n                <\/div>\n\n            <\/div>\n\n        <\/div>\n\n\n        <!-- CONTROLS -->\n\n        <div class=\"rrr-controls\">\n\n            <button\n                id=\"rrr-play\"\n                type=\"button\"\n                title=\"Play \/ Pause\"\n            >\n                \u25b6\n            <\/button>\n\n\n            <div class=\"rrr-control-info\">\n\n                <div class=\"rrr-control-title\">\n                    Real Rock Revival\n                <\/div>\n\n                <div class=\"rrr-control-subtitle\">\n                    Real Rock \u2022 Real Radio \u2022 24\/7\n                <\/div>\n\n            <\/div>\n\n\n            <div class=\"rrr-volume-wrap\">\n\n                <span class=\"rrr-volume-icon\">\n                    \ud83d\udd0a\n                <\/span>\n\n                <input\n                    id=\"rrr-volume\"\n                    type=\"range\"\n                    min=\"0\"\n                    max=\"1\"\n                    step=\"0.01\"\n                    value=\"0.80\"\n                >\n\n            <\/div>\n\n        <\/div>\n\n\n        <audio\n            id=\"rrr-audio\"\n            preload=\"none\"\n        ><\/audio>\n\n\n    <\/div>\n\n<\/div>\n\n\n<script>\n(function () {\n\n    const STREAM_URL =\n        'https:\/\/stream.audiosourcestreams.com\/8022\/stream';\n\n    const METADATA_URL =\n        '\/wp-json\/real-rock-revival\/v1\/now-playing';\n\n    const FALLBACK_ART =\n        'https:\/\/realrockrevival.com\/wp-content\/uploads\/2026\/08\/6b17152f-c6fd-4654-811c-87c133876acd.png';\n\n\n    const page =\n        document.getElementById(\n            'rrr-player-page'\n        );\n\n    const player =\n        document.getElementById(\n            'rrr-player'\n        );\n\n    const audio =\n        document.getElementById(\n            'rrr-audio'\n        );\n\n    const playButton =\n        document.getElementById(\n            'rrr-play'\n        );\n\n    const volume =\n        document.getElementById(\n            'rrr-volume'\n        );\n\n    const artistElement =\n        document.getElementById(\n            'rrr-artist'\n        );\n\n    const songElement =\n        document.getElementById(\n            'rrr-song'\n        );\n\n    const artworkElement =\n        document.getElementById(\n            'rrr-art'\n        );\n\n    const statusElement =\n        document.getElementById(\n            'rrr-stream-status'\n        );\n\n    const ledDisplay =\n        document.getElementById(\n            'rrr-led-display'\n        );\n\n    const minimizeButton =\n        document.getElementById(\n            'rrr-minimize'\n        );\n\n    const closeButton =\n        document.getElementById(\n            'rrr-close'\n        );\n\n\n    \/* ======================================================\n       MINIMIZE \/ RESTORE\n       ====================================================== *\/\n\n    let minimized =\n        false;\n\n\n    minimizeButton.addEventListener(\n        'click',\n        function () {\n\n            minimized =\n                !minimized;\n\n\n            player.classList.toggle(\n                'rrr-minimized',\n                minimized\n            );\n\n            page.classList.toggle(\n                'rrr-page-minimized',\n                minimized\n            );\n\n\n            minimizeButton.textContent =\n                minimized\n                    ? '\u25a1'\n                    : '\u2212';\n\n\n            minimizeButton.title =\n                minimized\n                    ? 'Restore'\n                    : 'Minimize';\n\n\n            \/*\n             * resizeTo works when this page was\n             * opened with window.open().\n             *\n             * If the browser blocks resizing,\n             * the player itself still minimizes.\n             *\/\n\n            try {\n\n                if (minimized) {\n\n                    window.resizeTo(\n                        440,\n                        150\n                    );\n\n                } else {\n\n                    window.resizeTo(\n                        700,\n                        650\n                    );\n\n                }\n\n            } catch (error) {\n            }\n\n        }\n    );\n\n\n    \/* ======================================================\n       CLOSE WINDOW\n       ====================================================== *\/\n\n    closeButton.addEventListener(\n        'click',\n        function () {\n\n            audio.pause();\n\n            audio.removeAttribute(\n                'src'\n            );\n\n            audio.load();\n\n\n            \/*\n             * This works when the player was\n             * opened by our Listen Live button\n             * using window.open().\n             *\/\n\n            window.close();\n\n        }\n    );\n\n\n    \/* ======================================================\n       AUDIO\n       ====================================================== *\/\n\n    audio.src =\n        STREAM_URL;\n\n    audio.volume =\n        0.80;\n\n\n   playButton.addEventListener(\n    'click',\n    async function () {\n\n        if (audio.paused) {\n\n            try {\n\n                statusElement.textContent =\n                    'CONNECTING TO TRIPLE R...';\n\n                audio.src =\n                    STREAM_URL;\n\n                audio.load();\n\n                await audio.play();\n\n            } catch (error) {\n\n                console.error(\n                    'RRR playback error:',\n                    error\n                );\n\n                statusElement.textContent =\n                    'PLAYBACK ERROR \u2022 ' +\n                    (\n                        error.message ||\n                        'UNABLE TO START STREAM'\n                    );\n\n            }\n\n        } else {\n\n            audio.pause();\n\n        }\n\n    }\n);\n\n\n    volume.addEventListener(\n        'input',\n        function () {\n\n            audio.volume =\n                parseFloat(\n                    volume.value\n                );\n\n        }\n    );\n\n\n    audio.addEventListener(\n        'playing',\n        function () {\n\n            playButton.textContent =\n                '\u275a\u275a';\n\n            startMeters();\n\n        }\n    );\n\n\n    audio.addEventListener(\n        'pause',\n        function () {\n\n            playButton.textContent =\n                '\u25b6';\n\n            stopMeters();\n\n        }\n    );\n\n\n    audio.addEventListener(\n        'error',\n        function () {\n\n            statusElement.textContent =\n                'STREAM CONNECTION ERROR';\n\n        }\n    );\n\n\n    \/* ======================================================\n       LED ANALYZER\n       24 COLUMNS \/ 10 LIGHTS\n       ====================================================== *\/\n\n    const COLUMN_COUNT =\n        24;\n\n    const LED_COUNT =\n        10;\n\n\n    ledDisplay.innerHTML =\n        '';\n\n\n    const columns =\n        [];\n\n\n    for (\n        let columnIndex = 0;\n        columnIndex < COLUMN_COUNT;\n        columnIndex++\n    ) {\n\n        const column =\n            document.createElement(\n                'div'\n            );\n\n\n        column.className =\n            'rrr-led-column';\n\n\n        const leds =\n            [];\n\n\n        for (\n            let ledIndex = 0;\n            ledIndex < LED_COUNT;\n            ledIndex++\n        ) {\n\n            const led =\n                document.createElement(\n                    'span'\n                );\n\n\n            led.classList.add(\n                'rrr-led'\n            );\n\n\n            if (\n                ledIndex < 5\n            ) {\n\n                led.classList.add(\n                    'low'\n                );\n\n            }\n\n            else if (\n                ledIndex < 8\n            ) {\n\n                led.classList.add(\n                    'mid'\n                );\n\n            }\n\n            else {\n\n                led.classList.add(\n                    'high'\n                );\n\n            }\n\n\n            column.appendChild(\n                led\n            );\n\n\n            leds.push(\n                led\n            );\n\n        }\n\n\n        ledDisplay.appendChild(\n            column\n        );\n\n\n        columns.push(\n            leds\n        );\n\n    }\n\n\n    \/* ======================================================\n       METER MOVEMENT\n       ====================================================== *\/\n\n    let meterTimer =\n        null;\n\n    let tick =\n        0;\n\n\n    let levels =\n        new Array(\n            COLUMN_COUNT\n        ).fill(3);\n\n\n    function illuminateColumn(\n        columnIndex,\n        level\n    ) {\n\n        const leds =\n            columns[\n                columnIndex\n            ];\n\n\n        leds.forEach(\n            function (\n                led,\n                ledIndex\n            ) {\n\n                if (\n                    ledIndex <\n                    level\n                ) {\n\n                    led.classList.add(\n                        'active'\n                    );\n\n                } else {\n\n                    led.classList.remove(\n                        'active'\n                    );\n\n                }\n\n            }\n        );\n\n    }\n\n\n    function drawMeters() {\n\n        tick++;\n\n\n        for (\n            let i = 0;\n            i < COLUMN_COUNT;\n            i++\n        ) {\n\n            const wave1 =\n                Math.sin(\n                    tick * .18 +\n                    i * .48\n                );\n\n\n            const wave2 =\n                Math.sin(\n                    tick * .11 -\n                    i * .73\n                );\n\n\n            const wave3 =\n                Math.cos(\n                    tick * .07 +\n                    i * .29\n                );\n\n\n            let target =\n                4.3 +\n                wave1 * 1.4 +\n                wave2 * 1.0 +\n                wave3 * .7;\n\n\n            target +=\n                Math.random() *\n                2.2;\n\n\n            if (\n                Math.random() >\n                .92\n            ) {\n\n                target +=\n                    2 +\n                    Math.random() *\n                    2;\n\n            }\n\n\n            target =\n                Math.round(\n                    target\n                );\n\n\n            target =\n                Math.max(\n                    2,\n                    Math.min(\n                        LED_COUNT,\n                        target\n                    )\n                );\n\n\n            if (\n                target >\n                levels[i]\n            ) {\n\n                levels[i] +=\n                    Math.min(\n                        2,\n                        target -\n                        levels[i]\n                    );\n\n            }\n\n            else if (\n                target <\n                levels[i]\n            ) {\n\n                if (\n                    Math.random() >\n                    .22\n                ) {\n\n                    levels[i] -=\n                        1;\n\n                }\n\n            }\n\n\n            levels[i] =\n                Math.max(\n                    2,\n                    Math.min(\n                        LED_COUNT,\n                        levels[i]\n                    )\n                );\n\n\n            illuminateColumn(\n                i,\n                levels[i]\n            );\n\n        }\n\n    }\n\n\n    function startMeters() {\n\n        if (\n            meterTimer\n        ) {\n            return;\n        }\n\n\n        drawMeters();\n\n\n        meterTimer =\n            setInterval(\n                drawMeters,\n                110\n            );\n\n    }\n\n\n    function stopMeters() {\n\n        if (\n            meterTimer\n        ) {\n\n            clearInterval(\n                meterTimer\n            );\n\n\n            meterTimer =\n                null;\n\n        }\n\n\n        for (\n            let i = 0;\n            i < COLUMN_COUNT;\n            i++\n        ) {\n\n            levels[i] =\n                i % 5 === 0\n                    ? 2\n                    : 1;\n\n\n            illuminateColumn(\n                i,\n                levels[i]\n            );\n\n        }\n\n    }\n\n\n    stopMeters();\n\n\n    \/* ======================================================\n       ALBUM ART\n       ====================================================== *\/\n\n    async function updateArtwork(\n        artist,\n        song\n    ) {\n\n        artworkElement.src =\n            FALLBACK_ART;\n\n\n        if (\n            !artist ||\n            !song ||\n            artist ===\n            'Real Rock Revival'\n        ) {\n\n            return;\n\n        }\n\n\n        try {\n\n            const searchTerm =\n                encodeURIComponent(\n                    artist +\n                    ' ' +\n                    song\n                );\n\n\n            const response =\n                await fetch(\n\n                    'https:\/\/itunes.apple.com\/search' +\n\n                    '?term=' +\n                    searchTerm +\n\n                    '&entity=song' +\n\n                    '&limit=1'\n\n                );\n\n\n            const data =\n                await response.json();\n\n\n            if (\n                data.results &&\n                data.results.length\n            ) {\n\n                let artwork =\n                    data.results[0]\n                        .artworkUrl100;\n\n\n                if (\n                    artwork\n                ) {\n\n                    artwork =\n                        artwork.replace(\n                            '100x100bb',\n                            '600x600bb'\n                        );\n\n\n                    artworkElement.src =\n                        artwork;\n\n                }\n\n            }\n\n        }\n\n        catch (error) {\n\n            artworkElement.src =\n                FALLBACK_ART;\n\n        }\n\n    }\n\n\n    \/* ======================================================\n       METADATA\n       ====================================================== *\/\n\n    let previousSong =\n        '';\n\n\n    async function updateMetadata() {\n\n        try {\n\n            const response =\n                await fetch(\n\n                    METADATA_URL +\n                    '?cache=' +\n                    Date.now(),\n\n                    {\n                        cache:\n                            'no-store'\n                    }\n\n                );\n\n\n            const data =\n                await response.json();\n\n\n            const artist =\n                data.artist ||\n                'Real Rock Revival';\n\n\n            const song =\n                data.song ||\n                'Live Radio';\n\n\n            artistElement.textContent =\n                artist;\n\n\n            songElement.textContent =\n                song;\n\n\n            statusElement.textContent =\n                data.online\n                    ? 'LIVE \u2022 ' +\n                      (\n                          data.bitrate ||\n                          128\n                      ) +\n                      ' KBPS'\n                    : 'STREAM OFFLINE';\n\n\n            const currentSong =\n                artist +\n                ' - ' +\n                song;\n\n\n            if (\n                currentSong !==\n                previousSong\n            ) {\n\n                previousSong =\n                    currentSong;\n\n\n                updateArtwork(\n                    artist,\n                    song\n                );\n\n            }\n\n        }\n\n        catch (error) {\n\n            statusElement.textContent =\n                'REAL ROCK REVIVAL \u2022 LIVE RADIO';\n\n        }\n\n    }\n\n\n    updateMetadata();\n\n\n    setInterval(\n        updateMetadata,\n        12000\n    );\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u2212 \u00d7 Live On Air Now Playing Real Rock Revival Loading live song information&#8230; Connecting to Real Rock Revival&#8230; \u25b6 Real Rock Revival Real Rock \u2022 Real Radio \u2022 24\/7 \ud83d\udd0a<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-432","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/pages\/432","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/comments?post=432"}],"version-history":[{"count":10,"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/pages\/432\/revisions"}],"predecessor-version":[{"id":447,"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/pages\/432\/revisions\/447"}],"wp:attachment":[{"href":"https:\/\/realrockrevival.com\/index.php\/wp-json\/wp\/v2\/media?parent=432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}