新增“不喜欢歌曲”功能&新增“收藏歌曲”、“取消收藏”、“不喜欢该歌曲”快捷键设置
This commit is contained in:
@@ -70,6 +70,23 @@ export default () => {
|
||||
return global.lx.worker.dbService.musicInfoOtherSourceCount()
|
||||
})
|
||||
|
||||
// =========================不喜欢的歌曲=========================
|
||||
mainHandle<LX.Dislike.DislikeInfo>(WIN_MAIN_RENDERER_EVENT_NAME.get_dislike_music_infos, async() => {
|
||||
return global.lx.worker.dbService.getDislikeListInfo()
|
||||
})
|
||||
mainHandle<LX.Dislike.DislikeMusicInfo[]>(WIN_MAIN_RENDERER_EVENT_NAME.add_dislike_music_infos, async({ params: infos }) => {
|
||||
await global.lx.worker.dbService.dislikeInfoAdd(infos)
|
||||
})
|
||||
mainHandle<string>(WIN_MAIN_RENDERER_EVENT_NAME.overwrite_dislike_music_infos, async({ params: rules }) => {
|
||||
await global.lx.worker.dbService.dislikeInfoOverwrite(rules)
|
||||
})
|
||||
// mainHandle<string[]>(WIN_MAIN_RENDERER_EVENT_NAME.remove_dislike_music_infos, async({ params: ids }) => {
|
||||
// await global.lx.worker.dbService.dislikeInfoRemove(ids)
|
||||
// })
|
||||
// mainHandle(WIN_MAIN_RENDERER_EVENT_NAME.clear_dislike_music_infos, async() => {
|
||||
// await global.lx.worker.dbService.dislikeInfoClear()
|
||||
// })
|
||||
|
||||
|
||||
// =========================我的列表=========================
|
||||
// mainHandle<boolean>(WIN_MAIN_RENDERER_EVENT_NAME.get_playlist, async({ params: isIgnoredError = false }) => {
|
||||
|
||||
Vendored
+1
@@ -12,3 +12,4 @@ import '@common/types/desktop_lyric'
|
||||
import '@common/types/theme'
|
||||
import '@common/types/ipc_main'
|
||||
import '@common/types/sound_effect'
|
||||
import '@common/types/dislike_list'
|
||||
|
||||
Vendored
+6
@@ -74,6 +74,12 @@ declare namespace LX {
|
||||
position: number
|
||||
}
|
||||
|
||||
interface DislikeInfo {
|
||||
// type: 'music'
|
||||
content: string
|
||||
// meta: string | null
|
||||
}
|
||||
|
||||
interface MusicInfoOtherSource extends Omit<MusicInfoOnline, 'listId'> {
|
||||
source_id: string
|
||||
}
|
||||
|
||||
@@ -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;')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user