impl songs, whole library refresh

This commit is contained in:
austinried
2021-06-25 14:26:54 +09:00
parent c8ed5bf5cb
commit 50be0a6f85
15 changed files with 317 additions and 146 deletions

View File

@@ -1,4 +1,4 @@
import { Album, Artist } from '../models/music';
import { Album, Artist, Song } from '../models/music';
import { DbStorage } from './db';
export class MusicDb extends DbStorage {
@@ -19,11 +19,22 @@ export class MusicDb extends DbStorage {
tx.executeSql(`
CREATE TABLE albums (
id TEXT PRIMARY KEY NOT NULL,
artistId TEXT NOT NULL,
name TEXT NOT NULL,
starred TEXT,
coverArt TEXT
);
`);
tx.executeSql(`
CREATE TABLE songs (
id TEXT PRIMARY KEY NOT NULL,
albumId TEXT NOT NULL,
artistId TEXT NOT NULL,
name TEXT NOT NULL,
starred TEXT,
artist TEXT
);
`);
});
}
@@ -62,39 +73,16 @@ export class MusicDb extends DbStorage {
});
}
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 => ({
async getAlbums(): Promise<Album[]> {
return (await this.executeSql(`
SELECT * FROM albums;
`))[0].rows.raw().map(x => ({
id: x.id,
artistId: x.artistid,
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> {
@@ -106,18 +94,58 @@ export class MusicDb extends DbStorage {
tx.executeSql(`
INSERT INTO albums (
id,
artistId,
name,
starred,
coverArt
)
VALUES (?, ?, ?, ?);
VALUES (?, ?, ?, ?, ?);
`, [
a.id,
a.name,
a.starred ? a.starred.toISOString() : null,
a.id,
a.artistId,
a.name,
a.starred ? a.starred.toISOString() : null,
a.coverArt || null
]);
}
});
}
async getSongs(): Promise<Song[]> {
return (await this.executeSql(`
SELECT * FROM songs;
`))[0].rows.raw().map(x => ({
id: x.id,
artistId: x.artistid,
albumId: x.albumId,
name: x.name,
starred: x.starred ? new Date(x.starred) : undefined,
}));
}
async updateSongs(songs: Song[]): Promise<void> {
await this.transaction((tx) => {
tx.executeSql(`
DELETE FROM songs
`);
for (const x of songs) {
tx.executeSql(`
INSERT INTO songs (
id,
artistId,
albumId,
name,
starred
)
VALUES (?, ?, ?, ?, ?);
`, [
x.id,
x.artistId,
x.albumId,
x.name,
x.starred ? x.starred.toISOString() : null,
]);
}
});
}
}