mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-05-25 18:16:56 +01:00
236 lines
6.0 KiB
HTML
236 lines
6.0 KiB
HTML
<!DOCTYPE html>
|
||
<html>
|
||
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<title>
|
||
{{#IF isInReportingMode}}
|
||
❌
|
||
{{/IF}}
|
||
Jellyfin Startup
|
||
</title>
|
||
<style>
|
||
* {
|
||
font-family: sans-serif;
|
||
}
|
||
|
||
.flex-row {
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
justify-content: center;
|
||
align-items: center;
|
||
align-content: normal;
|
||
}
|
||
|
||
.flex-col {
|
||
display: flex;
|
||
flex-direction: column;
|
||
flex-wrap: nowrap;
|
||
justify-content: center;
|
||
align-items: center;
|
||
align-content: normal;
|
||
}
|
||
|
||
header {
|
||
height: 5rem;
|
||
width: 100%;
|
||
}
|
||
|
||
header svg {
|
||
height: 3rem;
|
||
width: 9rem;
|
||
margin-right: 1rem;
|
||
}
|
||
|
||
/* ol.action-list {
|
||
list-style-type: none;
|
||
position: relative;
|
||
} */
|
||
|
||
ol.action-list * {
|
||
font-family: monospace;
|
||
font-weight: 300;
|
||
font-size: clamp(18px, 100vw / var(--width), 20px);
|
||
font-feature-settings: 'onum', 'pnum';
|
||
line-height: 1.8;
|
||
-webkit-text-size-adjust: none;
|
||
}
|
||
|
||
/*
|
||
ol.action-list li {
|
||
padding-top: .5rem;
|
||
}
|
||
|
||
ol.action-list li::before {
|
||
position: absolute;
|
||
left: -0.8em;
|
||
font-size: 1.1em;
|
||
} */
|
||
|
||
/* Attribution as heavily inspired by: https://iamkate.com/code/tree-views/ */
|
||
.action-list {
|
||
--spacing: 1.4rem;
|
||
--radius: 14px;
|
||
}
|
||
|
||
.action-list li {
|
||
display: block;
|
||
position: relative;
|
||
padding-left: calc(2 * var(--spacing) - var(--radius) - 1px);
|
||
}
|
||
|
||
.action-list ul {
|
||
margin-left: calc(var(--radius) - var(--spacing));
|
||
padding-left: 0;
|
||
}
|
||
|
||
.action-list ul li {
|
||
border-left: 2px solid #ddd;
|
||
}
|
||
|
||
.action-list ul li:last-child {
|
||
border-color: transparent;
|
||
}
|
||
|
||
.action-list ul li::before {
|
||
content: '';
|
||
display: block;
|
||
position: absolute;
|
||
top: calc(var(--spacing) / -2);
|
||
left: -2px;
|
||
width: calc(var(--spacing) + 2px);
|
||
height: calc(var(--spacing) + 1px);
|
||
border: solid #ddd;
|
||
border-width: 0 0 2px 2px;
|
||
}
|
||
|
||
.action-list summary {
|
||
display: block;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.action-list summary::marker,
|
||
.action-list summary::-webkit-details-marker {
|
||
display: none;
|
||
}
|
||
|
||
.action-list summary:focus {
|
||
outline: none;
|
||
}
|
||
|
||
.action-list summary:focus-visible {
|
||
outline: 1px dotted #000;
|
||
}
|
||
|
||
.action-list li::after,
|
||
.action-list summary::before {
|
||
content: '';
|
||
display: block;
|
||
position: absolute;
|
||
top: calc(var(--spacing) / 2 - var(--radius) + 4px);
|
||
left: calc(var(--spacing) - var(--radius) - -5px);
|
||
}
|
||
|
||
.action-list summary::before {
|
||
z-index: 1;
|
||
/* background: #696 url('expand-collapse.svg') 0 0; */
|
||
}
|
||
|
||
.action-list details[open]>summary::before {
|
||
background-position: calc(-2 * var(--radius)) 0;
|
||
}
|
||
|
||
.action-list li.danger-item::after,
|
||
.action-list li.danger-strong-item::after {
|
||
content: '❌';
|
||
}
|
||
|
||
ol.action-list li span.danger-strong-item {
|
||
text-decoration-style: solid;
|
||
text-decoration-color: red;
|
||
text-decoration-line: underline;
|
||
}
|
||
|
||
ol.action-list li.warn-item::after {
|
||
content: '⚠️';
|
||
}
|
||
|
||
ol.action-list li.success-item::after {
|
||
content: '✅';
|
||
}
|
||
|
||
ol.action-list li.info-item::after {
|
||
content: '🔹';
|
||
}
|
||
|
||
/* End Attribution */
|
||
</style>
|
||
</head>
|
||
|
||
<body>
|
||
<div>
|
||
<header class="flex-row">
|
||
|
||
{{^IF isInReportingMode}}
|
||
<p>Jellyfin Server still starting. Please wait.</p>
|
||
{{#ELSE}}
|
||
<p>Jellyfin Server has encountered an error and was not able to start.</p>
|
||
{{/ELSE}}
|
||
{{/IF}}
|
||
|
||
{{#IF localNetworkRequest}}
|
||
<p style="margin-left: 1rem;">You can download the current log file <a href='/startup/logger'
|
||
target="_blank">here</a>.</p>
|
||
{{/IF}}
|
||
</header>
|
||
|
||
{{#DECLARE LogEntry |--}}
|
||
{{#LET children = Children}}
|
||
<li class="{{FormatLogLevel(children).ToString()}}-item">
|
||
{{--| #IF children.Count > 0}}
|
||
<details open>
|
||
<summary>{{DateOfCreation}} - {{Content}}</summary>
|
||
<ul class="action-list">
|
||
{{--| #EACH children.Reverse() |-}}
|
||
{{#IMPORT 'LogEntry'}}
|
||
{{--| /EACH |-}}
|
||
</ul>
|
||
</details>
|
||
{{--| #ELSE |-}}
|
||
<span class="{{FormatLogLevel(children).ToString()}}-item">{{DateOfCreation}} - {{Content}}</span>
|
||
{{--| /ELSE |--}}
|
||
{{--| /IF |-}}
|
||
</li>
|
||
{{--| /DECLARE}}
|
||
|
||
{{#IF localNetworkRequest}}
|
||
<div class="flex-col">
|
||
<ol class="action-list">
|
||
{{#FOREACH log IN logs.Reverse()}}
|
||
{{#IMPORT 'LogEntry' #WITH log}}
|
||
{{/FOREACH}}
|
||
</ol>
|
||
</div>
|
||
{{#ELSE}}
|
||
{{#IF networkManagerReady}}
|
||
<p>Please visit this page from your local network to view detailed startup logs.</p>
|
||
{{#ELSE}}
|
||
<p>Initializing network settings. Please wait.</p>
|
||
{{/ELSE}}
|
||
{{/IF}}
|
||
{{/ELSE}}
|
||
{{/IF}}
|
||
</div>
|
||
</body>
|
||
|
||
{{^IF isInReportingMode}}
|
||
<script>
|
||
setTimeout(() => {
|
||
window.location.reload();
|
||
}, {{ retryValue.TotalMilliseconds }});
|
||
</script>
|
||
{{/IF}}
|
||
|
||
</html>
|