Add SQLite library with API, library desktop apps and MobyGames scraper
This commit is contained in:
1 parent
6674428346
commit
a16444451a
69 files changed
+2988
-1026
No files matched your search
@@ -0,0 +1,49 @@
|
||||
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;
|
||||
}
|
||||
Reference in new issue
Block a user