rustream/templates/
session.rs

1/// Get the HTML content to render the session expired/invalid page.
2///
3/// # See Also
4///
5/// - This page is served as a response for all the content delivery entry points,
6/// when the user's `session_token` is invalid or expired.
7///
8/// # Returns
9///
10/// A `String` version of the HTML, CSS and JS content.
11pub fn get_content() -> String {
12    r###"<!DOCTYPE html>
13<html lang="en">
14<head>
15    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
16    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
17    <meta http-equiv="Pragma" content="no-cache">
18    <meta http-equiv="Expires" content="0">
19    <title>RuStream - Self-hosted Streaming Engine - v{{ version }}</title>
20    <meta property="og:type" content="MediaStreaming">
21    <meta name="keywords" content="Python, streaming, fastapi, JavaScript, HTML, CSS">
22    <meta name="author" content="Vignesh Rao">
23    <meta content="width=device-width, initial-scale=1" name="viewport">
24    <!-- Favicon.ico and Apple Touch Icon -->
25    <link rel="icon" href="https://thevickypedia.github.io/open-source/images/logo/actix.ico">
26    <link rel="apple-touch-icon" href="https://thevickypedia.github.io/open-source/images/logo/actix.png">
27    <style>
28        /* Google fonts with a backup alternative */
29        @import url('https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;500;700&display=swap');
30        * {
31            font-family: 'Ubuntu', 'PT Serif', sans-serif;
32        }
33        img {
34            display: block;
35            margin-left: auto;
36            margin-right: auto;
37        }
38
39        :is(h1, h2, h3, h4, h5, h6) {
40            text-align: center;
41            color: #F0F0F0;
42        }
43
44        button {
45            width: 100px;
46            margin: 0 auto;
47            display: block;
48        }
49
50        body {
51            background-color: #151515;
52        }
53    </style>
54    <noscript>
55        <style>
56            body {
57                width: 100%;
58                height: 100%;
59                overflow: hidden;
60            }
61        </style>
62        <div style="position: fixed; text-align:center; height: 100%; width: 100%; background-color: #151515">
63            <h2 style="margin-top:5%">This page requires JavaScript
64                to be enabled.
65                <br><br>
66                Please refer <a href="https://www.enable-javascript.com/">enable-javascript</a> for how to.
67            </h2>
68            <form>
69                <button type="submit" onClick="<meta httpEquiv='refresh' content='0'>">RETRY</button>
70            </form>
71        </div>
72    </noscript>
73</head>
74<body>
75<h2 style="margin-top:5%">{{ reason }}</h2>
76<h3>Authentication doesn't last forever ¯\_(ツ)_/¯ </h3>
77<p>
78    <img src="https://thevickypedia.github.io/open-source/images/gif/shattered_fusion.gif"
79        onerror="this.src='https://vigneshrao.com/open-source/images/gif/shattered_fusion.gif'"
80        width="200" height="200" alt="Image" class="center">
81</p>
82<button style="text-align:center" onClick="window.location.href = '/';">LOGIN</button>
83<br>
84<button style="text-align:center" onClick="alert('Forgot Password?\n\nRelax and try to remember your password.');">HELP
85</button>
86<h4>Click <a href="https://vigneshrao.com/contact">HERE</a> to reach out.</h4>
87</body>
88<!-- control the behavior of the browser's navigation without triggering a full page reload -->
89<script>
90    document.addEventListener('DOMContentLoaded', function() {
91        history.pushState(null, document.title, location.href);
92        window.addEventListener('popstate', function (event) {
93            history.pushState(null, document.title, location.href);
94        });
95    });
96</script>
97</html>
98"###.to_string()
99}