half decent album list with art

This commit is contained in:
austinried
2021-06-21 22:39:10 +09:00
parent ff94889644
commit b4fee0aff4
18 changed files with 1964 additions and 90 deletions

View File

@@ -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);
}
}

View File

@@ -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
]);
}
});
}