From b2cd85ceddb1d39924b858cb198a9784954fd4c5 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 7 Feb 2024 01:07:34 -0800 Subject: feat(hololive): hololive schedule --- src/routes/+layout.svelte | 5 +- src/routes/api/hololive/+server.ts | 10 +++ src/routes/hololive/+page.svelte | 127 +++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 src/routes/api/hololive/+server.ts create mode 100644 src/routes/hololive/+page.svelte (limited to 'src/routes') diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index e8fb9f9b..cc09bb94 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -113,8 +113,9 @@ diff --git a/src/routes/api/hololive/+server.ts b/src/routes/api/hololive/+server.ts new file mode 100644 index 00000000..331d776a --- /dev/null +++ b/src/routes/api/hololive/+server.ts @@ -0,0 +1,10 @@ +import parseScheduleHtml from 'holo-schedule'; +import getScheduleHtml from 'holo-schedule/lib/getScheduleHtml'; + +export const GET = async () => + Response.json(parseScheduleHtml(await getScheduleHtml()), { + headers: { + 'Access-Control-Allow-Origin': 'https://due.moe', + 'Cache-Control': 'public, max-age=300, s-maxage=300' + } + }); diff --git a/src/routes/hololive/+page.svelte b/src/routes/hololive/+page.svelte new file mode 100644 index 00000000..bd49bbf8 --- /dev/null +++ b/src/routes/hololive/+page.svelte @@ -0,0 +1,127 @@ + + +{#await schedulePromise} + + + +{:then scheduleResponse} + {#if scheduleResponse} + {#await scheduleResponse.json()} + + + + {:then untypedSchedule} + {@const schedule = typeSchedule(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; + + if (!a.streaming && b.streaming) return 1; + + return new Date(a.time).getTime() - new Date(b.time).getTime(); + }) as live} +
+

+ [{#if live.streaming} + LIVE{:else} + Upcoming{/if}] + {live.streamer} | + {new Date(live.time).toLocaleString()} + {#if live.guests.length > 0} +
+ + With {live.guests.join(', ').replace(/, ([^,]+)$/, ', & $1')} + + {/if} +

+ + + Stream Preview + +
+ {/each} +
+ {:catch} + + {/await} + {:else} + + + + {/if} +{:catch} + +{/await} + + -- cgit v1.2.3