{#await schedulePromise} {:then scheduleResponse} {#if scheduleResponse} {#await scheduleResponse.text()} {:then untypedSchedule} {@const schedule = typeSchedule(parseScheduleHtml(untypedSchedule))} {#if schedule.lives.length === 0} {/if}
{#each schedule.lives .filter((live) => { const time = new Date(live.time); return time.getTime() > Date.now() - 12 * 60 * 60 * 1000 || time.getTime() > Date.now() || live.streaming; }) .sort((a, b) => { if (a.streaming && !b.streaming) { return -1; } else if (!a.streaming && b.streaming) { return 1; } const aTime = new Date(a.time).getTime(); if (aTime < Date.now() && new Date(b.time).getTime() > Date.now()) { return 1; } else if (aTime > Date.now() && new Date(b.time).getTime() < Date.now()) { return -1; } return aTime - new Date(b.time).getTime(); }) as live}

[{#if live.streaming} {$locale().hololive.live}{:else if new Date(live.time).getTime() < Date.now()} {$locale().hololive.ended}{:else} {$locale().hololive.upcoming}{/if}] {live.streamer} | {$locale().hololive.dateFormatter(new Date(live.time))} {#if live.guests.length > 0}
{$locale().hololive.with}{live.guests .join($locale().hololive.comma) .replace( new RegExp( `${$locale().hololive.comma}([^${$locale().hololive.commaNoSpace}]+)$`, 'g' ), `${$locale().hololive.comma}${$locale().hololive.ampersand}$1` )} {/if}

Stream Thumbnail
{/each}
{:catch} {$locale().hololive.parseError} location.reload()}>Try again? {/await} {:else} {/if} {:catch} {$locale().hololive.loadError} Please location.reload()}>try again later. {/await}