Files
R3ap3r 3178b8f4f7 Aurora SpotiRip desktop and web app
- Spotify playlist, library, album and artist browsing with in-app playback
- Song, playlist and album downloads via spotdl with YouTube and Bandcamp fallbacks
- Electron desktop app (castLabs Widevine) with a permanent sidebar layout
- Linux and Windows packaging scripts
2026-09-25 23:20:57 -05:00

228 lines
8.7 KiB
TypeScript

import "./loadEnv.js";
import { Hono } from 'hono'
import { serveStatic } from '@hono/node-server/serve-static'
import { serve } from '@hono/node-server';
const app = new Hono();
app.post('_api/identify',async c => {
try {
const { handle } = await import("./endpoints/identify_POST.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.get('_api/spotify-auth',async c => {
try {
const { handle } = await import("./endpoints/spotify-auth_GET.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.post('_api/spotify-exchange',async c => {
try {
const { handle } = await import("./endpoints/spotify-exchange_POST.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.get('_api/spotify-session',async c => {
try {
const { handle } = await import("./endpoints/spotify-session_GET.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.post('_api/spotify-logout',async c => {
try {
const { handle } = await import("./endpoints/spotify-logout_POST.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.post('_api/spotify-playlist',async c => {
try {
const { handle } = await import("./endpoints/spotify-playlist_POST.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.get('_api/spotify-playlists',async c => {
try {
const { handle } = await import("./endpoints/spotify-playlists_GET.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.post('_api/metadata-enrich',async c => {
try {
const { handle } = await import("./endpoints/metadata-enrich_POST.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.post('_api/lyrics',async c => {
try {
const { handle } = await import("./endpoints/lyrics_POST.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.get('_api/spotify-library',async c => {
try {
const { handle } = await import("./endpoints/spotify-library_GET.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.get('_api/spotify-artist-albums',async c => {
try {
const { handle } = await import("./endpoints/spotify-artist-albums_GET.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.get('_api/spotify-album',async c => {
try {
const { handle } = await import("./endpoints/spotify-album_GET.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.post('_api/spotify-download',async c => {
try {
const { handle } = await import("./endpoints/spotify-download_POST.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.get('_api/spotify-download-status',async c => {
try {
const { handle } = await import("./endpoints/spotify-download-status_GET.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.get('_api/spotify-download-file',async c => {
try {
const { handle } = await import("./endpoints/spotify-download-file_GET.js");
let request = c.req.raw;
const response = await handle(request);
if (!(response instanceof Response) && response.constructor.name !== "Response") {
return c.text("Invalid response format. handle should always return a Response object." + response.constructor.name, 500);
}
return response;
} catch (e) {
console.error(e);
return c.text("Error loading endpoint code " + e.message, 500)
}
})
app.use('/*', serveStatic({ root: './dist' }))
app.get("*", async (c, next) => {
const p = c.req.path;
if (p.startsWith("/_api")) {
return next();
}
return serveStatic({ path: "./dist/index.html" })(c, next);
});
serve({ fetch: app.fetch, port: 3333 });
console.log("Running at http://localhost:3333")