新增“不喜欢歌曲”功能&新增“收藏歌曲”、“取消收藏”、“不喜欢该歌曲”快捷键设置

This commit is contained in:
lyswhut
2023-09-04 14:13:47 +08:00
parent 3ca8f09971
commit baf69e397a
40 changed files with 861 additions and 26 deletions
+2 -2
View File
@@ -2,7 +2,7 @@ import Database from 'better-sqlite3'
import path from 'path'
import tables from './tables'
import verifyDB from './verifyDB'
// import migrateData from './migrate'
import migrateData from './migrate'
let db: Database.Database
@@ -37,7 +37,7 @@ export const init = (lxDataPath: string): boolean | null => {
dbFileExists = false
}
// if (dbFileExists) migrateData(db)
if (dbFileExists) migrateData(db)
// https://www.sqlite.org/pragma.html#pragma_optimize
if (dbFileExists) db.exec('PRAGMA optimize;')
+3 -2
View File
@@ -1,13 +1,13 @@
import { init } from './db'
import { exposeWorker } from '../utils/worker'
import { list, lyric, music_url, music_other_source, download } from './modules/index'
import { list, lyric, music_url, music_other_source, download, dislike_list } from './modules/index'
const common = {
init,
}
exposeWorker(Object.assign(common, list, lyric, music_url, music_other_source, download))
exposeWorker(Object.assign(common, list, lyric, music_url, music_other_source, download, dislike_list))
export type workerDBSeriveTypes = typeof common
& typeof list
@@ -15,3 +15,4 @@ export type workerDBSeriveTypes = typeof common
& typeof music_url
& typeof music_other_source
& typeof download
& typeof dislike_list
+29 -17
View File
@@ -1,24 +1,36 @@
import type Database from 'better-sqlite3'
// const migrateV1 = (db: Database.Database) => {
// const sql = `
// DROP TABLE "main"."download_list";
// CREATE TABLE "download_list" (
// "id" TEXT NOT NULL,
// "isComplate" INTEGER NOT NULL,
// "status" TEXT NOT NULL,
// "statusText" TEXT NOT NULL,
// "progress_downloaded" INTEGER NOT NULL,
// "progress_total" INTEGER NOT NULL,
// "url" TEXT,
// "quality" TEXT NOT NULL,
// "ext" TEXT NOT NULL,
// "fileName" TEXT NOT NULL,
// "filePath" TEXT NOT NULL,
// "musicInfo" TEXT NOT NULL,
// "position" INTEGER NOT NULL,
// PRIMARY KEY("id")
// );
// `
// db.exec(sql)
// db.prepare('UPDATE "main"."db_info" SET "field_value"=@value WHERE "field_name"=@name').run({ name: 'version', value: '2' })
// }
const migrateV1 = (db: Database.Database) => {
const sql = `
DROP TABLE "main"."download_list";
CREATE TABLE "download_list" (
"id" TEXT NOT NULL,
"isComplate" INTEGER NOT NULL,
"status" TEXT NOT NULL,
"statusText" TEXT NOT NULL,
"progress_downloaded" INTEGER NOT NULL,
"progress_total" INTEGER NOT NULL,
"url" TEXT,
"quality" TEXT NOT NULL,
"ext" TEXT NOT NULL,
"fileName" TEXT NOT NULL,
"filePath" TEXT NOT NULL,
"musicInfo" TEXT NOT NULL,
"position" INTEGER NOT NULL,
PRIMARY KEY("id")
CREATE TABLE "dislike_list" (
"type" TEXT NOT NULL,
"content" TEXT NOT NULL,
"meta" TEXT
);
`
db.exec(sql)
@@ -0,0 +1,76 @@
// import type Database from 'better-sqlite3'
import { getDB } from '../../db'
import {
createQueryStatement,
createInsertStatement,
// createDeleteStatement,
// createUpdateStatement,
createClearStatement,
} from './statements'
/**
* 查询不喜欢歌曲列表
*/
export const queryDislikeList = () => {
const queryStatement = createQueryStatement()
return queryStatement.all() as LX.DBService.DislikeInfo[]
}
/**
* 批量插入不喜欢歌曲并刷新顺序
* @param infos 列表
*/
export const inertDislikeList = async(infos: LX.DBService.DislikeInfo[]) => {
const db = getDB()
const insertStatement = createInsertStatement()
db.transaction((infos: LX.DBService.DislikeInfo[]) => {
for (const info of infos) insertStatement.run(info)
})(infos)
}
/**
* 覆盖并批量插入不喜欢歌曲并刷新顺序
* @param infos 列表
*/
export const overwirteDislikeList = async(infos: LX.DBService.DislikeInfo[]) => {
const db = getDB()
const clearStatement = createClearStatement()
const insertStatement = createInsertStatement()
db.transaction((infos: LX.DBService.DislikeInfo[]) => {
clearStatement.run()
for (const info of infos) insertStatement.run(info)
})(infos)
}
// /**
// * 批量删除不喜欢歌曲
// * @param ids 列表
// */
// export const deleteDislikeList = (ids: string[]) => {
// const db = getDB()
// const deleteStatement = createDeleteStatement()
// db.transaction((ids: string[]) => {
// for (const id of ids) deleteStatement.run(BigInt(id))
// })(ids)
// }
// /**
// * 批量更新不喜欢歌曲
// * @param urlInfo 列表
// */
// export const updateDislikeList = async(infos: LX.DBService.DislikeInfo[]) => {
// const db = getDB()
// const updateStatement = createUpdateStatement()
// db.transaction((infos: LX.DBService.DislikeInfo[]) => {
// for (const info of infos) updateStatement.run(info)
// })(infos)
// }
// /**
// * 清空不喜欢歌曲列表
// */
// export const clearDislikeList = () => {
// const clearStatement = createClearStatement()
// clearStatement.run()
// }
@@ -0,0 +1,100 @@
import { SPLIT_CHAR } from '@common/constants'
import {
queryDislikeList,
inertDislikeList,
overwirteDislikeList,
// updateDislikeList,
// deleteDislikeList,
// clearDislikeList,
} from './dbHelper'
// let dislikeInfo: LX.Dislike.DislikeInfo
const toDBDislikeInfo = (musicInfos: string[]): LX.DBService.DislikeInfo[] => {
const list: LX.DBService.DislikeInfo[] = []
for (const item of musicInfos) {
if (!item.trim()) continue
list.push({
content: item,
})
}
return list
}
const initDislikeList = () => {
const dislikeInfo: LX.Dislike.DislikeInfo = {
// musicIds: new Set<string>(),
names: new Set<string>(),
singerNames: new Set<string>(),
musicNames: new Set<string>(),
rules: '',
}
const list: string[] = []
for (const item of queryDislikeList()) {
if (!item) continue
let [name, singer] = item.content.split(SPLIT_CHAR.DISLIKE_NAME)
if (name) {
name = name.replaceAll(SPLIT_CHAR.DISLIKE_NAME, SPLIT_CHAR.DISLIKE_NAME_ALIAS).toLocaleLowerCase().trim()
if (singer) {
singer = singer.replaceAll(SPLIT_CHAR.DISLIKE_NAME, SPLIT_CHAR.DISLIKE_NAME_ALIAS).toLocaleLowerCase().trim()
const rule = `${name}${SPLIT_CHAR.DISLIKE_NAME}${singer}`
dislikeInfo.names.add(rule)
list.push(rule)
} else {
dislikeInfo.musicNames.add(name)
list.push(name)
}
} else if (singer) {
singer = singer.replaceAll(SPLIT_CHAR.DISLIKE_NAME, SPLIT_CHAR.DISLIKE_NAME_ALIAS).toLocaleLowerCase().trim()
dislikeInfo.singerNames.add(singer)
list.push(`${SPLIT_CHAR.DISLIKE_NAME}${singer}`)
}
}
dislikeInfo.rules = list.join('\n') + '\n'
return dislikeInfo
}
/**
* 获取不喜欢列表信息
* @returns 不喜欢列表信息
*/
export const getDislikeListInfo = (): LX.Dislike.DislikeInfo => {
// if (!dislikeInfo) initDislikeList()
return initDislikeList()
}
/**
* 添加信息
* @param lists 列表信息
*/
export const dislikeInfoAdd = async(lists: LX.Dislike.DislikeMusicInfo[]) => {
await inertDislikeList(lists.map(info => ({ content: `${info.name}${SPLIT_CHAR.DISLIKE_NAME}${info.singer}` })))
}
/**
* 覆盖列表信息
* @param rules 规则信息
*/
export const dislikeInfoOverwrite = async(rules: string) => {
await overwirteDislikeList(toDBDislikeInfo(rules.split('\n')))
}
// /**
// * 删除不喜欢列表
// * @param ids 歌曲id
// */
// export const dislikeInfoRemove = (ids: string[]) => {
// deleteDislikeList(ids)
// }
// /**
// * 清空不喜欢列表
// */
// export const dislikeInfoClear = () => {
// clearDislikeList()
// }
@@ -0,0 +1,62 @@
import { getDB } from '../../db'
/**
* 创建不喜欢列表查询语句
* @returns 查询语句
*/
export const createQueryStatement = () => {
const db = getDB()
return db.prepare<[]>(`
SELECT "content"
FROM dislike_list
WHERE "type"='music'
`)
}
/**
* 创建不喜欢记录插入语句
* @returns 插入语句
*/
export const createInsertStatement = () => {
const db = getDB()
return db.prepare<[LX.DBService.DislikeInfo]>(`
INSERT INTO "main"."dislike_list" ("type", "content")
VALUES ('music', @content)`)
}
/**
* 创建不喜欢记录清空语句
* @returns 清空语句
*/
export const createClearStatement = () => {
const db = getDB()
return db.prepare<[]>(`
DELETE FROM "main"."dislike_list"
`)
}
// /**
// * 创建不喜欢记录删除语句
// * @returns 删除语句
// */
// export const createDeleteStatement = () => {
// const db = getDB()
// return db.prepare<[bigint]>(`
// DELETE FROM "main"."dislike_list"
// WHERE "id"=?
// `)
// }
// /**
// * 创建不喜欢记录更新语句
// * @returns 更新语句
// */
// export const createUpdateStatement = () => {
// const db = getDB()
// return db.prepare<[LX.DBService.DislikeInfo]>(`
// UPDATE "main"."dislike_list"
// SET "name"=@name, "singer"=@singer
// WHERE "id"=@id
// `)
// }
@@ -4,3 +4,4 @@ export * as lyric from './lyric'
export * as music_url from './music_url'
export * as music_other_source from './music_other_source'
export * as download from './download'
export * as dislike_list from './dislike_list'
+7
View File
@@ -205,5 +205,12 @@ tables.set('download_list', `
PRIMARY KEY("id")
);
`)
tables.set('dislike_list', `
CREATE TABLE "dislike_list" (
"type" TEXT NOT NULL,
"content" TEXT NOT NULL,
"meta" TEXT
);
`)
export default tables