aquavox/src/routes/+page.svelte
2024-05-13 00:06:47 +08:00

95 lines
3.2 KiB
Svelte

<script lang="ts">
import extractFileName from '$lib/extractFileName';
import toHumanSize from '$lib/humanSize';
import localforage from '$lib/storage';
interface Song {
name: string;
singer?: string;
coverUrl?: string;
size?: number;
}
interface SongList {
[key: string]: Song;
}
let musicList: SongList = {};
let idList: string[] = [];
function extractId(key: string) {
const addons = ['-cover-cache', '-file', '-lyric', '-metadata', '-cover'];
let r = key;
for (const addon of addons) {
if (r.endsWith(addon)) {
return [r.substring(0, r.length - addon.length), addon.replace(/-/g, ' ').trim()];
}
}
return [r, ''];
}
localforage.iterate(function (value: File | Blob | any, key, iterationNumber) {
const [id, type] = extractId(key);
if (!type) return;
if (!musicList[id]) musicList[id] = { name: '' };
if (type === 'file') {
const v = value as File;
musicList[id].name = extractFileName(v.name);
musicList[id].size = v.size;
} else if (type === 'cover') {
const v = value as Blob;
musicList[id].coverUrl = URL.createObjectURL(v);
}
idList = Object.keys(musicList);
});
function clear() {
localforage.clear();
window.location.reload();
}
</script>
<svelte:head>
<title>Aquavox - 音乐库</title>
</svelte:head>
<div
class="absolute w-screen md:w-2/3 lg:w-1/2 left-0 md:left-[16.6667%] lg:left-1/4 px-[3%] md:px-0 top-16"
>
<h1>AquaVox</h1>
<h2>音乐库</h2>
<div>
<ul class="mt-4 relative w-full">
{#each idList as id}
<a class="!no-underline !text-black dark:!text-white" href={`/play/${id}`}>
<li
class="relative my-4 p-4 duration-150 bg-zinc-200 hover:bg-zinc-300 dark:bg-zinc-700 dark:hover:bg-zinc-600 rounded-lg"
>
<span class="font-bold">{musicList[id].name}</span> <br />
<span>{toHumanSize(musicList[id].size)}</span> ·
<a href={`/import/${id}/lyric`}>导入歌词</a>
{#if musicList[id].coverUrl}
<img
class="h-16 w-16 object-cover absolute rounded-lg right-2 top-2"
src={musicList[id].coverUrl}
alt=""
/>
{/if}
</li>
</a>
{/each}
</ul>
</div>
<p>
AquaVox 1.8.0 · 早期公开预览 · 源代码参见
<a href="https://github.com/alikia2x/aquavox">GitHub</a>
</p>
<a href="/import">导入音乐</a> <br />
<button
on:click={() => window.confirm('确定要删除本地数据库中所有内容吗?') && clear()}
class="text-white bg-red-500 px-4 py-2 mt-4 rounded-md">一键清除</button
>
</div>
<style lang="postcss">
a {
@apply text-red-500 hover:text-red-400 duration-150 underline;
}
</style>