mirror of
https://github.com/GiriNeko/YesPlayMusic.git
synced 2025-12-18 06:07:48 +00:00
feat: 缓存歌单封面颜色
This commit is contained in:
parent
766e866497
commit
1591586735
10 changed files with 506 additions and 396 deletions
157
src/main/db.ts
157
src/main/db.ts
|
|
@ -7,110 +7,127 @@ import { createFileIfNotExist } from './utils'
|
|||
|
||||
const isDev = process.env.NODE_ENV === 'development'
|
||||
|
||||
logger.info('[db] Initializing database...')
|
||||
|
||||
export enum Tables {
|
||||
TRACK = 'track',
|
||||
ALBUM = 'album',
|
||||
ARTIST = 'artist',
|
||||
PLAYLIST = 'playlist',
|
||||
ARTIST_ALBUMS = 'artist_album',
|
||||
LYRIC = 'lyric',
|
||||
Track = 'track',
|
||||
Album = 'album',
|
||||
Artist = 'artist',
|
||||
Playlist = 'playlist',
|
||||
ArtistAlbum = 'artist_album',
|
||||
Lyric = 'lyric',
|
||||
|
||||
// Special tables
|
||||
ACCOUNT_DATA = 'account_data',
|
||||
AUDIO = 'audio',
|
||||
AccountData = 'account_data',
|
||||
Audio = 'audio',
|
||||
CoverColor = 'cover_color',
|
||||
}
|
||||
|
||||
const dbFilePath = path.resolve(
|
||||
app.getPath('userData'),
|
||||
'./api_cache/db.sqlite'
|
||||
)
|
||||
createFileIfNotExist(dbFilePath)
|
||||
|
||||
const sqlite = new SQLite3(dbFilePath, {
|
||||
nativeBinding: path.join(__dirname, `./better_sqlite3_${process.arch}.node`),
|
||||
})
|
||||
sqlite.pragma('auto_vacuum = FULL')
|
||||
|
||||
// Init tables if not exist
|
||||
const trackTable = sqlite
|
||||
.prepare("SELECT * FROM sqlite_master WHERE name='track' and type='table'")
|
||||
.get()
|
||||
if (!trackTable) {
|
||||
const migration = fs.readFileSync(
|
||||
isDev
|
||||
? path.join(process.cwd(), './src/main/migrations/init.sql')
|
||||
: path.join(__dirname, './migrations/init.sql'),
|
||||
'utf8'
|
||||
class DB {
|
||||
sqlite: SQLite3.Database
|
||||
dbFilePath: string = path.resolve(
|
||||
app.getPath('userData'),
|
||||
'./api_cache/db.sqlite'
|
||||
)
|
||||
sqlite.exec(migration)
|
||||
}
|
||||
|
||||
export const db = {
|
||||
find: (table: Tables, key: number | string) => {
|
||||
return sqlite
|
||||
constructor() {
|
||||
logger.info('[db] Initializing database...')
|
||||
|
||||
createFileIfNotExist(this.dbFilePath)
|
||||
|
||||
this.sqlite = new SQLite3(this.dbFilePath, {
|
||||
nativeBinding: path.join(
|
||||
__dirname,
|
||||
`./better_sqlite3_${process.arch}.node`
|
||||
),
|
||||
})
|
||||
this.sqlite.pragma('auto_vacuum = FULL')
|
||||
this.initTables()
|
||||
|
||||
logger.info('[db] Database initialized')
|
||||
}
|
||||
|
||||
initTables() {
|
||||
const migration = fs.readFileSync(
|
||||
isDev
|
||||
? path.join(process.cwd(), './src/main/migrations/init.sql')
|
||||
: path.join(__dirname, './migrations/init.sql'),
|
||||
'utf8'
|
||||
)
|
||||
this.sqlite.exec(migration)
|
||||
}
|
||||
|
||||
find(table: Tables, key: number | string) {
|
||||
return this.sqlite
|
||||
.prepare(`SELECT * FROM ${table} WHERE id = ? LIMIT 1`)
|
||||
.get(key)
|
||||
},
|
||||
findMany: (table: Tables, keys: number[] | string[]) => {
|
||||
}
|
||||
|
||||
findMany(table: Tables, keys: number[] | string[]) {
|
||||
const idsQuery = keys.map(key => `id = ${key}`).join(' OR ')
|
||||
return sqlite.prepare(`SELECT * FROM ${table} WHERE ${idsQuery}`).all()
|
||||
},
|
||||
findAll: (table: Tables) => {
|
||||
return sqlite.prepare(`SELECT * FROM ${table}`).all()
|
||||
},
|
||||
create: (table: Tables, data: any, skipWhenExist: boolean = true) => {
|
||||
return this.sqlite.prepare(`SELECT * FROM ${table} WHERE ${idsQuery}`).all()
|
||||
}
|
||||
|
||||
findAll(table: Tables) {
|
||||
return this.sqlite.prepare(`SELECT * FROM ${table}`).all()
|
||||
}
|
||||
|
||||
create(table: Tables, data: any, skipWhenExist: boolean = true) {
|
||||
if (skipWhenExist && db.find(table, data.id)) return
|
||||
return sqlite.prepare(`INSERT INTO ${table} VALUES (?)`).run(data)
|
||||
},
|
||||
createMany: (table: Tables, data: any[], skipWhenExist: boolean = true) => {
|
||||
return this.sqlite.prepare(`INSERT INTO ${table} VALUES (?)`).run(data)
|
||||
}
|
||||
|
||||
createMany(table: Tables, data: any[], skipWhenExist: boolean = true) {
|
||||
const valuesQuery = Object.keys(data[0])
|
||||
.map(key => `:${key}`)
|
||||
.join(', ')
|
||||
const insert = sqlite.prepare(
|
||||
const insert = this.sqlite.prepare(
|
||||
`INSERT ${
|
||||
skipWhenExist ? 'OR IGNORE' : ''
|
||||
} INTO ${table} VALUES (${valuesQuery})`
|
||||
)
|
||||
const insertMany = sqlite.transaction((rows: any[]) => {
|
||||
const insertMany = this.sqlite.transaction((rows: any[]) => {
|
||||
rows.forEach((row: any) => insert.run(row))
|
||||
})
|
||||
insertMany(data)
|
||||
},
|
||||
upsert: (table: Tables, data: any) => {
|
||||
}
|
||||
|
||||
upsert(table: Tables, data: any) {
|
||||
const valuesQuery = Object.keys(data)
|
||||
.map(key => `:${key}`)
|
||||
.join(', ')
|
||||
return sqlite
|
||||
return this.sqlite
|
||||
.prepare(`INSERT OR REPLACE INTO ${table} VALUES (${valuesQuery})`)
|
||||
.run(data)
|
||||
},
|
||||
upsertMany: (table: Tables, data: any[]) => {
|
||||
}
|
||||
|
||||
upsertMany(table: Tables, data: any[]) {
|
||||
const valuesQuery = Object.keys(data[0])
|
||||
.map(key => `:${key}`)
|
||||
.join(', ')
|
||||
const upsert = sqlite.prepare(
|
||||
const upsert = this.sqlite.prepare(
|
||||
`INSERT OR REPLACE INTO ${table} VALUES (${valuesQuery})`
|
||||
)
|
||||
const upsertMany = sqlite.transaction((rows: any[]) => {
|
||||
const upsertMany = this.sqlite.transaction((rows: any[]) => {
|
||||
rows.forEach((row: any) => upsert.run(row))
|
||||
})
|
||||
upsertMany(data)
|
||||
},
|
||||
delete: (table: Tables, key: number | string) => {
|
||||
return sqlite.prepare(`DELETE FROM ${table} WHERE id = ?`).run(key)
|
||||
},
|
||||
deleteMany: (table: Tables, keys: number[] | string[]) => {
|
||||
}
|
||||
|
||||
delete(table: Tables, key: number | string) {
|
||||
return this.sqlite.prepare(`DELETE FROM ${table} WHERE id = ?`).run(key)
|
||||
}
|
||||
|
||||
deleteMany(table: Tables, keys: number[] | string[]) {
|
||||
const idsQuery = keys.map(key => `id = ${key}`).join(' OR ')
|
||||
return sqlite.prepare(`DELETE FROM ${table} WHERE ${idsQuery}`).run()
|
||||
},
|
||||
truncate: (table: Tables) => {
|
||||
return sqlite.prepare(`DELETE FROM ${table}`).run()
|
||||
},
|
||||
vacuum: () => {
|
||||
return sqlite.prepare('VACUUM').run()
|
||||
},
|
||||
return this.sqlite.prepare(`DELETE FROM ${table} WHERE ${idsQuery}`).run()
|
||||
}
|
||||
|
||||
truncate(table: Tables) {
|
||||
return this.sqlite.prepare(`DELETE FROM ${table}`).run()
|
||||
}
|
||||
|
||||
vacuum() {
|
||||
return this.sqlite.prepare('VACUUM').run()
|
||||
}
|
||||
}
|
||||
|
||||
logger.info('[db] Database initialized')
|
||||
export const db = new DB()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue