aboutsummaryrefslogtreecommitdiff
path: root/src/routes/literature-updates
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/routes/literature-updates
parentfeat(manga-update): types (diff)
downloaddue.moe-79ea82525cb374014458828ec249ebfc43d4f4a2.tar.xz
due.moe-79ea82525cb374014458828ec249ebfc43d4f4a2.zip
feat(manga-updates): light novel support
Diffstat (limited to 'src/routes/literature-updates')
-rw-r--r--src/routes/literature-updates/+page.svelte105
1 files changed, 105 insertions, 0 deletions
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>