diff --git a/.gitignore b/.gitignore index 5ddfabc..242fd79 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ public/assets/fonts/cache .idea static/audio temp_audio -.stfolder \ No newline at end of file +.stfolder +storage/ \ No newline at end of file diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index ddf336b..a79b138 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -6,6 +6,8 @@ services: dockerfile: deploy/Dockerfile.web ports: - "127.0.0.1:3000:3000" + volumes: + - ./data/storage:/app/storage environment: - ORIGIN=http://localhost:3000 - MONGO_URL=mongodb://cat:meow@db:27017/amaoke?authSource=admin diff --git a/src/lib/server/songs.ts b/src/lib/server/songs.ts index a2c09f2..4c4f0f7 100644 --- a/src/lib/server/songs.ts +++ b/src/lib/server/songs.ts @@ -8,10 +8,10 @@ import type { ObjectId } from 'mongodb' import '../ext' import { promises as fs } from 'fs' import path from 'path' -import { waitFor } from '../utils' import { separateSong } from './separator' -const CACHE_DIR = path.resolve('static/audio') +const CACHE_DIR = path.resolve('storage/audio') +export const getAudioFile = (songId: string, filename: string) => path.join(CACHE_DIR, songId, filename) const neCookie = async () => (await dbs.serverProps .findOne({ name: 'global_settings' }))?.netease_login_cookie diff --git a/src/routes/audio/[songId]/[file]/+server.ts b/src/routes/audio/[songId]/[file]/+server.ts new file mode 100644 index 0000000..f2c7ab2 --- /dev/null +++ b/src/routes/audio/[songId]/[file]/+server.ts @@ -0,0 +1,30 @@ +import { getAudioFile } from '$lib/server/songs'; +import { error } from '@sveltejs/kit'; +import fs from 'fs/promises'; +import path from 'path'; +import type { RequestHandler } from './$types'; + +export const GET: RequestHandler = async ({ params }) => { + const { songId, file } = params; + const filePath = getAudioFile(songId, file); + + try { + await fs.access(filePath); + } catch { + throw error(404, 'File not found'); + } + + const ext = path.extname(file).toLowerCase(); + let contentType = 'application/octet-stream'; + if (ext === '.mp3') contentType = 'audio/mpeg'; + if (ext === '.opus') contentType = 'audio/ogg'; + + const buffer = await fs.readFile(filePath); + + return new Response(buffer, { + headers: { + 'Content-Type': contentType, + 'Cache-Control': 'public, max-age=31536000' + } + }); +};