50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import path from 'node:path';
|
|
import { openSqlite, type SqlDatabase } from '../sqlite';
|
|
import { importLegacyFiles } from './legacy';
|
|
|
|
export type { SqlDatabase };
|
|
|
|
export const lastfmDataDirectory = path.resolve(process.env.LASTFM_DATA_DIR ?? 'data/lastfm');
|
|
const databasePath = path.join(lastfmDataDirectory, 'lastfm.db');
|
|
|
|
const schema = `
|
|
CREATE TABLE IF NOT EXISTS scrobbles (
|
|
played_at INTEGER NOT NULL,
|
|
artist TEXT NOT NULL,
|
|
track TEXT NOT NULL,
|
|
album TEXT NOT NULL,
|
|
UNIQUE (played_at, artist, track)
|
|
);
|
|
CREATE INDEX IF NOT EXISTS scrobbles_played_at ON scrobbles (played_at);
|
|
CREATE TABLE IF NOT EXISTS album_covers (
|
|
artist TEXT NOT NULL,
|
|
album TEXT NOT NULL,
|
|
image TEXT NOT NULL,
|
|
PRIMARY KEY (artist, album)
|
|
);
|
|
CREATE TABLE IF NOT EXISTS track_covers (
|
|
artist TEXT NOT NULL,
|
|
track TEXT NOT NULL,
|
|
image TEXT NOT NULL,
|
|
PRIMARY KEY (artist, track)
|
|
);
|
|
CREATE TABLE IF NOT EXISTS cover_images (
|
|
id TEXT PRIMARY KEY,
|
|
content_type TEXT NOT NULL,
|
|
data BLOB NOT NULL
|
|
);
|
|
`;
|
|
|
|
let opening: Promise<SqlDatabase> | null = null;
|
|
|
|
async function openLastfmDatabase(): Promise<SqlDatabase> {
|
|
const database = await openSqlite(databasePath, schema);
|
|
await importLegacyFiles(database, lastfmDataDirectory);
|
|
return database;
|
|
}
|
|
|
|
export function lastfmDatabase(): Promise<SqlDatabase> {
|
|
opening ??= openLastfmDatabase();
|
|
return opening;
|
|
}
|