aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-09-12 21:16:01 -0700
committerFuwn <[email protected]>2023-09-12 21:16:01 -0700
commit79ea82525cb374014458828ec249ebfc43d4f4a2 (patch)
tree539b577e0644c51e92295db804d0c651922f5015 /src
parentfeat(manga-update): types (diff)
downloaddue.moe-79ea82525cb374014458828ec249ebfc43d4f4a2.tar.xz
due.moe-79ea82525cb374014458828ec249ebfc43d4f4a2.zip
feat(manga-updates): light novel support
Diffstat (limited to 'src')
-rw-r--r--src/routes/+layout.svelte2
-rw-r--r--src/routes/api/novel-updates/+server.ts3
-rw-r--r--src/routes/literature-updates/+page.svelte105
-rw-r--r--src/routes/manga-updates/+page.svelte57
4 files changed, 109 insertions, 58 deletions
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 37625ba5..60e82044 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -81,7 +81,7 @@
<p />
<p>
- 「 <a href="/">Home</a> • <a href="/manga-updates">Manga Updates</a> •
+ 「 <a href="/">Home</a> • <a href="/literature-updates">Manga & LN Updates</a> •
<a href="/settings">Settings</a> 」
</p>
diff --git a/src/routes/api/novel-updates/+server.ts b/src/routes/api/novel-updates/+server.ts
new file mode 100644
index 00000000..1bedeab6
--- /dev/null
+++ b/src/routes/api/novel-updates/+server.ts
@@ -0,0 +1,3 @@
+export const GET = async () => {
+ return new Response((await fetch('https://api.syosetu.com/allnovel.Atom')).body);
+};
diff --git a/src/routes/literature-updates/+page.svelte b/src/routes/literature-updates/+page.svelte
new file mode 100644
index 00000000..d2d77101
--- /dev/null
+++ b/src/routes/literature-updates/+page.svelte
@@ -0,0 +1,105 @@
+<script lang="ts">
+ import { onMount } from 'svelte';
+ import RSSParser from 'rss-parser/dist/rss-parser.js';
+
+ type Feed = { items: { title: string; link: string }[] } | null | undefined;
+
+ let feed: Feed = undefined;
+ let novelFeed: Feed = undefined;
+
+ onMount(async () => {
+ let parser = new RSSParser();
+
+ parser.parseURL('/api/novel-updates', (e: Error, f: Feed) => {
+ if (e) {
+ novelFeed = null;
+
+ throw e;
+ }
+
+ novelFeed = f;
+ });
+
+ parser.parseURL('/api/manga-updates', (e: Error, f: Feed) => {
+ if (e) {
+ feed = null;
+
+ throw e;
+ }
+
+ feed = f;
+ });
+ });
+
+ const reformat = (title: string) => {
+ return title
+ .replace(/\[.*?\]\s/, '')
+ .replace(/c\.(\d+-\d+)/, 'Ch. $1')
+ .replace(/v\.(\d+)\s/, 'Vol. $1 ')
+ .replace(/c\.(\d+)/, 'Ch. $1');
+ };
+
+ function reformatChapters(title: string): string {
+ return title
+ .replace(/(Vol\. \d+ )?Ch\. \d+(-\d+(\.\d+)?)?$/, '')
+ .replace(/\? ~.*$/, '')
+ .trim();
+ }
+</script>
+
+<div id="list-container">
+ <div>
+ <details open>
+ <summary>Manga</summary>
+
+ <ul>
+ {#if feed === null}
+ <li>Failed to load feed</li>
+ {:else if feed !== undefined}
+ {#each feed.items as item}
+ <li>
+ <a
+ href={`https://anilist.co/search/manga?search=${reformatChapters(
+ reformat(item.title)
+ )}&sort=SEARCH_MATCH`}
+ >
+ {reformat(item.title)}
+ </a>
+ </li>
+ {/each}
+ {:else}
+ <li>Loading ...</li>
+ {/if}
+ </ul>
+ </details>
+ </div>
+
+ <div>
+ <details open>
+ <summary>Light Novels</summary>
+
+ <ul>
+ {#if novelFeed === null}
+ <li>Failed to load feed</li>
+ {:else if novelFeed !== undefined}
+ {#each novelFeed.items as item}
+ <li>
+ <a href={item.link}>
+ {reformat(item.title)}
+ </a>
+ </li>
+ {/each}
+ {:else}
+ <li>Loading ...</li>
+ {/if}
+ </ul>
+ </details>
+ </div>
+</div>
+
+<style>
+ #list-container {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+ }
+</style>
diff --git a/src/routes/manga-updates/+page.svelte b/src/routes/manga-updates/+page.svelte
deleted file mode 100644
index a52acdac..00000000
--- a/src/routes/manga-updates/+page.svelte
+++ /dev/null
@@ -1,57 +0,0 @@
-<script lang="ts">
- import { onMount } from 'svelte';
- import RSSParser from 'rss-parser/dist/rss-parser.js';
-
- type Feed = { items: { title: string }[] } | null | undefined;
-
- let feed: Feed = undefined;
-
- onMount(async () => {
- let parser = new RSSParser();
-
- parser.parseURL('/api/manga-updates', (e: Error, f: Feed) => {
- if (e) {
- feed = null;
-
- throw e;
- }
-
- feed = f;
- });
- });
-
- const reformat = (title: string) => {
- return title
- .replace(/\[.*?\]\s/, '')
- .replace(/c\.(\d+-\d+)/, 'Ch. $1')
- .replace(/v\.(\d+)\s/, 'Vol. $1 ')
- .replace(/c\.(\d+)/, 'Ch. $1');
- };
-
- function reformatChapters(title: string): string {
- return title
- .replace(/(Vol\. \d+ )?Ch\. \d+(-\d+(\.\d+)?)?$/, '')
- .replace(/\? ~.*$/, '')
- .trim();
- }
-</script>
-
-<ul>
- {#if feed === null}
- <li>Failed to load feed</li>
- {:else if feed !== undefined}
- {#each feed.items as item}
- <li>
- <a
- href={`https://anilist.co/search/manga?search=${reformatChapters(
- reformat(item.title)
- )}&sort=SEARCH_MATCH`}
- >
- {reformat(item.title)}
- </a>
- </li>
- {/each}
- {:else}
- <li>Loading ...</li>
- {/if}
-</ul>