123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- <!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}}
- <p>Please visit this page from your local network to view detailed startup logs.</p>
- {{/ELSE}}
- {{/IF}}
- </div>
- </body>
- {{^IF isInReportingMode}}
- <script>
- setTimeout(() => {
- window.location.reload();
- }, {{ retryValue.TotalMilliseconds }});
- </script>
- {{/IF}}
- </html>
|