diff --git a/internal/static/index.html b/internal/static/index.html index 4f9d22233b88e24bfdde24bfc352809f39641057..738b40cd0cc9bb6b5882067eb6a1e7520fc2bf23 100644 --- a/internal/static/index.html +++ b/internal/static/index.html @@ -1,33 +1,34 @@ <!DOCTYPE html> <html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Stream Server</title> + <head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <title>Stream Server</title> - <script src="https://player.twitch.tv/js/embed/v1.js"></script> <!-- twitch embed --> + <!-- twitch embed --> + <script src="https://player.twitch.tv/js/embed/v1.js"></script> - <link rel="stylesheet" href="style.css"> -</head> -<body> - <div id="large-player" class="hidden"> - <div id="small-player-container"> - <div id="small-player" class="hidden"></div> - </div> - </div> - <iframe id="chat" frameborder="0" scrolling="no" src="about:blank"></iframe> + <link rel="stylesheet" href="style.css" /> + </head> + <body> + <div id="large-player" class="hidden"> + <div id="small-player-container"> + <div id="small-player" class="hidden"></div> + </div> + </div> + <iframe id="chat" frameborder="0" scrolling="no" src="about:blank"></iframe> - <div id="overlay"> - <h2>Loading...</h2> - <p> - <a href="https://stream-server.h-da.io">Documentation</a> · - <a href="https://stream-server.h-da.io/reference">Reference</a> - </p> - <small> - <a href="javascript:toggleFullscreen()">toggle fullscreen</a> - </small> - </div> + <div id="overlay"> + <h2>Loading...</h2> + <p> + <a href="https://stream-server.h-da.io">Documentation</a> · + <a href="https://stream-server.h-da.io/reference">Reference</a> + </p> + <small> + <a href="javascript:toggleFullscreen()">toggle fullscreen</a> + </small> + </div> - <script src="main.js"></script> -</body> -</html> \ No newline at end of file + <script src="main.js"></script> + </body> +</html> diff --git a/internal/static/main.js b/internal/static/main.js index 85442b8d8a36d9752e444cdbc0235a21bdafc605..9dd6b0031cdd960b5dc8fa0aa5e4cf54f901d14a 100644 --- a/internal/static/main.js +++ b/internal/static/main.js @@ -1,164 +1,167 @@ "use strict"; -var large_player; -var small_player; +let large_player; +let small_player; function newLargePlayer(channel) { - return new Twitch.Player('large-player', { - channel: channel, - width: '', - height: '', - controls: false, - muted: false - }); + return new Twitch.Player("large-player", { + channel: channel, + width: "", + height: "", + controls: false, + muted: false + }); } function newSmallPlayer(channel) { - return new Twitch.Player('small-player', { - channel: channel, - width: '', - height: '', - controls: false, - muted: true - }); + return new Twitch.Player("small-player", { + channel: channel, + width: "", + height: "", + controls: false, + muted: true + }); } -const large_player_elem = document.getElementById('large-player'); -const small_player_elem = document.getElementById('small-player'); -const overlay_elem = document.getElementById('overlay'); -const chat_elem = document.getElementById('chat'); +const large_player_elem = document.getElementById("large-player"); +const small_player_elem = document.getElementById("small-player"); +const overlay_elem = document.getElementById("overlay"); +const chat_elem = document.getElementById("chat"); const defaultState = { - large_channel: '', - small_channel: '', - volume: 0.5, - small_scale: 0.3, - show_chat: false + large_channel: "", + small_channel: "", + volume: 0.5, + small_scale: 0.3, + show_chat: false }; let state = defaultState; function updateState(newState) { - state = newState; - - console.log('State:', state); - - // large player: - - // we need to destroy the player - if (state.large_channel == '' && large_player) { - large_player.destroy(); - large_player = undefined; - chat_elem.src = 'about:blank'; + state = newState; + + console.log("State:", state); + + // large player: + + // we need to destroy the player + if (state.large_channel == "" && large_player) { + large_player.destroy(); + large_player = undefined; + chat_elem.src = "about:blank"; + } + + // we should be playing something + if (state.large_channel != "") { + function update() { + // the volume needs to be changed + if (large_player.getVolume() != state.volume) { + large_player.setVolume(state.volume); + } + + // the channel needs to be changed + if (large_player.getChannel() != state.large_channel) { + large_player.setChannel(state.large_channel); + } } - // we should be playing something - if (state.large_channel != '') { - - function update() { - // the volume needs to be changed - if (large_player.getVolume() != state.volume) { - large_player.setVolume(state.volume); - } - - // the channel needs to be changed - if (large_player.getChannel() != state.large_channel) { - large_player.setChannel(state.large_channel); - } - } - - // we need to create the large player - if (!large_player) { - large_player = newLargePlayer(state.large_channel); - large_player.addEventListener(Twitch.Player.READY, update); - large_player.addEventListener(Twitch.Player.PLAY, update); - } else { - update(); - } - - var chat_elem_src = 'https://www.twitch.tv/embed/' + state.large_channel + '/chat?darkpopout'; - - if (chat_elem_src != chat_elem.src) { - chat_elem.src = chat_elem_src; - } + // we need to create the large player + if (!large_player) { + large_player = newLargePlayer(state.large_channel); + large_player.addEventListener(Twitch.Player.READY, update); + large_player.addEventListener(Twitch.Player.PLAY, update); + } else { + update(); } - // small player: - - // we need to destroy the player - if (state.small_channel == '' && small_player) { - small_player.destroy(); - small_player = undefined; - } + let chat_elem_src = + "https://www.twitch.tv/embed/" + state.large_channel + "/chat?darkpopout"; - // we should be playing something - if (state.small_channel != '') { - - function update() { - // the channel needs to be changed - if (small_player.getChannel() != state.small_channel) { - small_player.setChannel(state.small_channel); - } - } - - // we need to create the small player - if (!small_player) { - small_player = newSmallPlayer(state.small_channel); - - small_player.addEventListener(Twitch.Player.READY, update); - small_player.addEventListener(Twitch.Player.PLAY, update); - } else { - update(); - } + if (chat_elem_src != chat_elem.src) { + chat_elem.src = chat_elem_src; + } + } + + // small player: + + // we need to destroy the player + if (state.small_channel == "" && small_player) { + small_player.destroy(); + small_player = undefined; + } + + // we should be playing something + if (state.small_channel != "") { + function update() { + // the channel needs to be changed + if (small_player.getChannel() != state.small_channel) { + small_player.setChannel(state.small_channel); + } } - const small_player_size = state.small_scale * 100 + '%'; - small_player_elem.style.width = small_player_size; - small_player_elem.style.height = small_player_size; + // we need to create the small player + if (!small_player) { + small_player = newSmallPlayer(state.small_channel); + small_player.addEventListener(Twitch.Player.READY, update); + small_player.addEventListener(Twitch.Player.PLAY, update); + } else { + update(); + } + } + + const small_player_size = state.small_scale * 100 + "%"; + small_player_elem.style.width = small_player_size; + small_player_elem.style.height = small_player_size; - small_player_elem.className = (state.small_channel == '') ? 'hidden' : ''; - large_player_elem.className = (state.large_channel == '') ? 'hidden' : ''; - overlay_elem.className = (state.large_channel != '' || state.small_channel != '') ? 'hidden' : ''; + small_player_elem.className = state.small_channel == "" ? "hidden" : ""; + large_player_elem.className = state.large_channel == "" ? "hidden" : ""; + overlay_elem.className = + state.large_channel != "" || state.small_channel != "" ? "hidden" : ""; - document.body.className = state.show_chat ? 'with-chat' : ''; + document.body.className = state.show_chat ? "with-chat" : ""; } if (!window.EventSource) { - overlay_elem.firstElementChild.innerText = 'Your browser (probably IE / Edge) does not support EventSource. Please try any other modern browser.'; + overlay_elem.firstElementChild.innerText = + "Your browser (probably IE / Edge) does not support EventSource. Please try any other modern browser."; } else { - const events = new EventSource('/display'); + const events = new EventSource("/display"); - events.onmessage = m => { - updateState(JSON.parse(m.data)); - }; + events.onmessage = m => { + updateState(JSON.parse(m.data)); + }; - events.onopen = () => { - overlay_elem.firstElementChild.innerText = 'Nothing playing'; - }; + events.onopen = () => { + overlay_elem.firstElementChild.innerText = "Nothing playing"; + }; - events.onerror = err => { - console.error(err); + events.onerror = err => { + console.error(err); - updateState(defaultState); - overlay_elem.firstElementChild.innerText = 'Connection to stream-server failed. Make sure it\'s running.'; - }; + updateState(defaultState); + overlay_elem.firstElementChild.innerText = + "Connection to stream-server failed. Make sure it's running."; + }; } function toggleFullscreen() { - if (!document.fullscreenElement) { // we are not in fullscreen - document.documentElement.requestFullscreen() - } else { - if (document.exitFullscreen) { - document.exitFullscreen(); - } + if (!document.fullscreenElement) { + // we are not in fullscreen + document.documentElement.requestFullscreen(); + } else { + if (document.exitFullscreen) { + document.exitFullscreen(); } + } } -large_player_elem.addEventListener('mousedown', (event) => { - if (event.detail > 1) { // double click - toggleFullscreen(); +large_player_elem.addEventListener("mousedown", event => { + if (event.detail > 1) { + // double click + toggleFullscreen(); - event.preventDefault(); - } -}); \ No newline at end of file + event.preventDefault(); + } +}); diff --git a/internal/static/style.css b/internal/static/style.css index 421fc818fdfa8d228e59712655fa313d9d8bb113..b590bd51a5bccdf37728704aa6f2751cadbf5f52 100644 --- a/internal/static/style.css +++ b/internal/static/style.css @@ -1,81 +1,92 @@ body { - display: flex; + display: flex; - margin: 0; - padding: 0; - height: 100vh; - width: calc(100vw + 21.25rem); /* without chat the body is 21.25rem (the size of the chat) wider */ + margin: 0; + padding: 0; + height: 100vh; - background-color: black; - overflow: hidden; - transition: width 0.3s; /* width changes are animated */ + /* without chat the body is 21.25rem (the size of the chat) wider */ + width: calc(100vw + 21.25rem); + + background-color: black; + overflow: hidden; + transition: width 0.3s; /* width changes are animated */ } body.with-chat { - width: 100vw; /* with chat the width is the normal 100vw */ + width: 100vw; /* with chat the width is the normal 100vw */ } #large-player { - position: relative; /* while this 'relative' has no impact for #large-player it is the reference point for the #small-player-container which is positioned absolute to this element */ - display: flex; - flex-grow: 1; /* #large-player fills remaining space while #chat does not */ + /* while this 'relative' has no impact for #large-player it is the reference point for the */ + /* #small-player-container which is positioned absolute to this element */ + position: relative; + display: flex; + flex-grow: 1; /* #large-player fills remaining space while #chat does not */ } -#small-player-container { /* this container is necessary for the #small-player to keep an 16:9 aspect ratio */ - position: absolute; - width: 100%; - height: 0; - padding-top: 56.25%; /* this is the trick that keeps the child in a 16:9 ratio - read more here https://www.w3schools.com/howto/howto_css_aspect_ratio.asp */ +#small-player-container { + /* this container is necessary for the #small-player to keep an 16:9 aspect ratio */ + position: absolute; + width: 100%; + height: 0; + + /* this is the trick that keeps the child in a 16:9 ratio - read more here https://www.w3schools.com/howto/howto_css_aspect_ratio.asp */ + padding-top: 56.25%; } #small-player { - position: absolute; - top: 0; /* pin small player to the top right */ - right: 0; - - /* Note: the width and height property get set via script */ - - transition: width 0.3s, height 0.3s; /* width and height changes are animated */ - display: flex; + position: absolute; + top: 0; /* pin small player to the top right */ + right: 0; + + /* Note: the width and height property get set via script */ + + transition: width 0.3s, height 0.3s; /* width and height changes are animated */ + display: flex; } #small-player > iframe, -#large-player > iframe { /* the iframes always grow to the parents size */ - flex-grow: 1; +#large-player > iframe { + /* the iframes always grow to the parents size */ + flex-grow: 1; - pointer-events: none; + pointer-events: none; } .hidden > iframe { - display: none; + display: none; } #overlay { - font-family: Roboto, Helvetica, Arial, sans-serif; - color: white; - - /* center the content */ - - position: fixed; - top: 0; - right: 0; - left: 0; - bottom: 0; - - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; + font-family: Roboto, Helvetica, Arial, sans-serif; + color: white; + + /* center the content */ + + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; } #overlay.hidden { - display: none; + display: none; } #chat { - width: 21.25rem; + width: 21.25rem; } -a:link, a:active, a:visited, a:hover { - color: inherit; -} \ No newline at end of file +a:link, +a:active, +a:visited, +a:hover { + color: inherit; +}