diff options
| author | Fuwn <[email protected]> | 2023-09-12 21:16:01 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-09-12 21:16:01 -0700 |
| commit | 79ea82525cb374014458828ec249ebfc43d4f4a2 (patch) | |
| tree | 539b577e0644c51e92295db804d0c651922f5015 /src | |
| parent | feat(manga-update): types (diff) | |
| download | due.moe-79ea82525cb374014458828ec249ebfc43d4f4a2.tar.xz due.moe-79ea82525cb374014458828ec249ebfc43d4f4a2.zip | |
feat(manga-updates): light novel support
Diffstat (limited to 'src')
| -rw-r--r-- | src/routes/+layout.svelte | 2 | ||||
| -rw-r--r-- | src/routes/api/novel-updates/+server.ts | 3 | ||||
| -rw-r--r-- | src/routes/literature-updates/+page.svelte | 105 | ||||
| -rw-r--r-- | src/routes/manga-updates/+page.svelte | 57 |
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> |