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

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
@@ -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'