mirror of
https://github.com/austinried/subtracks.git
synced 2026-02-11 15:22:43 +01:00
half decent album list with art
This commit is contained in:
@@ -4,6 +4,7 @@ SQLite.enablePromise(true);
|
||||
|
||||
export abstract class DbStorage {
|
||||
private dbParams: DatabaseParams;
|
||||
private db: SQLiteDatabase | undefined;
|
||||
|
||||
constructor(dbParams: DatabaseParams) {
|
||||
this.dbParams = dbParams;
|
||||
@@ -36,36 +37,23 @@ export abstract class DbStorage {
|
||||
return results[0].rows.length > 0;
|
||||
}
|
||||
|
||||
private async openDb(): Promise<SQLiteDatabase> {
|
||||
return await SQLite.openDatabase({ ...this.dbParams });
|
||||
async openDb(): Promise<void> {
|
||||
this.db = await SQLite.openDatabase({ ...this.dbParams });
|
||||
}
|
||||
|
||||
async deleteDb(): Promise<void> {
|
||||
if (this.db) {
|
||||
await this.db.close();
|
||||
}
|
||||
await SQLite.deleteDatabase({ ...this.dbParams });
|
||||
}
|
||||
|
||||
async executeSql(sql: string, params?: any[]): Promise<[ResultSet]> {
|
||||
const db = await this.openDb();
|
||||
try {
|
||||
// https://github.com/andpor/react-native-sqlite-storage/issues/410
|
||||
return await db.executeSql(sql, params);
|
||||
} catch (err) {
|
||||
try { await db.close(); } catch {}
|
||||
throw err;
|
||||
} finally {
|
||||
try { await db.close(); } catch {}
|
||||
}
|
||||
// https://github.com/andpor/react-native-sqlite-storage/issues/410
|
||||
return await (this.db as SQLiteDatabase).executeSql(sql, params);
|
||||
}
|
||||
|
||||
async transaction(scope: (tx: Transaction) => void): Promise<void> {
|
||||
const db = await this.openDb();
|
||||
try {
|
||||
await db.transaction(scope);
|
||||
} catch (err) {
|
||||
try { await db.close(); } catch {}
|
||||
throw err;
|
||||
} finally {
|
||||
try { await db.close(); } catch {}
|
||||
}
|
||||
await (this.db as SQLiteDatabase).transaction(scope);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,8 @@ export class MusicDb extends DbStorage {
|
||||
CREATE TABLE albums (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
starred TEXT
|
||||
starred TEXT,
|
||||
coverArt TEXT
|
||||
);
|
||||
`);
|
||||
});
|
||||
@@ -32,6 +33,7 @@ export class MusicDb extends DbStorage {
|
||||
`))[0].rows.raw().map(x => ({
|
||||
id: x.id,
|
||||
name: x.name,
|
||||
starred: x.starred ? new Date(x.starred) : undefined,
|
||||
coverArt: x.coverArt || undefined,
|
||||
}));
|
||||
}
|
||||
@@ -43,20 +45,56 @@ export class MusicDb extends DbStorage {
|
||||
`);
|
||||
for (const a of artists) {
|
||||
tx.executeSql(`
|
||||
INSERT INTO artists (id, name, starred, coverArt)
|
||||
INSERT INTO artists (
|
||||
id,
|
||||
name,
|
||||
starred,
|
||||
coverArt
|
||||
)
|
||||
VALUES (?, ?, ?, ?);
|
||||
`, [a.id, a.name, null, a.coverArt || null]);
|
||||
`, [
|
||||
a.id,
|
||||
a.name,
|
||||
a.starred ? a.starred.toISOString() : null,
|
||||
a.coverArt || null
|
||||
]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async getAlbums(): Promise<Album[]> {
|
||||
return (await this.executeSql(`
|
||||
SELECT * FROM albums;
|
||||
`))[0].rows.raw().map(x => ({
|
||||
async getAlbum(id: string): Promise<Album> {
|
||||
const results = await this.executeSql(`
|
||||
SELECT * FROM albums
|
||||
WHERE id = ?;
|
||||
`, [id]);
|
||||
|
||||
const rows = results[0].rows.raw();
|
||||
return rows.map(x => ({
|
||||
id: x.id,
|
||||
name: x.name,
|
||||
}));
|
||||
starred: x.starred ? new Date(x.starred) : undefined,
|
||||
coverArt: x.coverArt || undefined,
|
||||
}))[0];
|
||||
}
|
||||
|
||||
async getAlbumIds(): Promise<string[]> {
|
||||
return (await this.executeSql(`
|
||||
SELECT id FROM albums;
|
||||
`))[0].rows.raw().map(x => x.id);
|
||||
}
|
||||
|
||||
async getAlbums(): Promise<{[id: string]: Album}> {
|
||||
return (await this.executeSql(`
|
||||
SELECT * FROM albums;
|
||||
`))[0].rows.raw().reduce((acc, x) => {
|
||||
acc[x.id] = {
|
||||
id: x.id,
|
||||
name: x.name,
|
||||
starred: x.starred ? new Date(x.starred) : undefined,
|
||||
coverArt: x.coverArt || undefined,
|
||||
};
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
|
||||
async updateAlbums(albums: Album[]): Promise<void> {
|
||||
@@ -66,9 +104,19 @@ export class MusicDb extends DbStorage {
|
||||
`);
|
||||
for (const a of albums) {
|
||||
tx.executeSql(`
|
||||
INSERT INTO albums (id, name, starred)
|
||||
VALUES (?, ?, ?);
|
||||
`, [a.id, a.name, null]);
|
||||
INSERT INTO albums (
|
||||
id,
|
||||
name,
|
||||
starred,
|
||||
coverArt
|
||||
)
|
||||
VALUES (?, ?, ?, ?);
|
||||
`, [
|
||||
a.id,
|
||||
a.name,
|
||||
a.starred ? a.starred.toISOString() : null,
|
||||
a.coverArt || null
|
||||
]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user