YesPlayMusic/packages/electron/main/ipcMain.ts

178 lines
4.2 KiB
TypeScript
Raw Normal View History

import { BrowserWindow, ipcMain, app } from 'electron'
import { db, Tables } from './db'
2022-05-13 19:30:13 +08:00
import { IpcChannels, IpcChannelsParams } from '@/shared/IpcChannels'
2022-04-12 01:48:14 +08:00
import cache from './cache'
2022-04-16 13:30:25 +08:00
import log from './log'
2022-04-09 00:28:37 +08:00
import fs from 'fs'
2022-05-01 19:53:25 +08:00
import Store from 'electron-store'
import { TypedElectronStore } from './index'
2022-05-13 19:30:13 +08:00
import { APIs } from '@/shared/CacheAPIs'
import { YPMTray } from './tray'
import { Thumbar } from './windowsTaskbar'
2022-05-13 18:18:28 +08:00
import fastFolderSize from 'fast-folder-size'
import path from 'path'
import prettyBytes from 'pretty-bytes'
2022-04-16 21:14:03 +08:00
const on = <T extends keyof IpcChannelsParams>(
channel: T,
listener: (event: Electron.IpcMainEvent, params: IpcChannelsParams[T]) => void
) => {
ipcMain.on(channel, listener)
}
export function initIpcMain(
win: BrowserWindow | null,
tray: YPMTray | null,
2022-05-01 19:53:25 +08:00
thumbar: Thumbar | null,
store: Store<TypedElectronStore>
) {
initWindowIpcMain(win)
initTrayIpcMain(tray)
initTaskbarIpcMain(thumbar)
2022-05-01 19:53:25 +08:00
initStoreIpcMain(store)
initOtherIpcMain()
}
2022-04-09 00:28:37 +08:00
/**
* win对象的事件
* @param {BrowserWindow} win
*/
function initWindowIpcMain(win: BrowserWindow | null) {
2022-04-16 21:14:03 +08:00
on(IpcChannels.Minimize, () => {
2022-04-09 00:28:37 +08:00
win?.minimize()
})
2022-04-16 21:14:03 +08:00
on(IpcChannels.MaximizeOrUnmaximize, () => {
2022-04-09 00:28:37 +08:00
if (!win) return
win.isMaximized() ? win.unmaximize() : win.maximize()
})
2022-04-16 21:14:03 +08:00
on(IpcChannels.Close, () => {
2022-04-09 00:28:37 +08:00
app.exit()
})
2022-05-29 17:53:27 +08:00
on(IpcChannels.ResetWindowSize, () => {
if (!win) return
win?.setSize(1440, 1024, true)
})
}
/**
* tray对象的事件
* @param {YPMTray} tray
*/
function initTrayIpcMain(tray: YPMTray | null) {
on(IpcChannels.SetTrayTooltip, (e, { text }) => tray?.setTooltip(text))
2022-05-01 19:53:25 +08:00
on(IpcChannels.Like, (e, { isLiked }) => tray?.setLikeState(isLiked))
on(IpcChannels.Play, () => tray?.setPlayState(true))
on(IpcChannels.Pause, () => tray?.setPlayState(false))
on(IpcChannels.Repeat, (e, { mode }) => tray?.setRepeatMode(mode))
}
/**
* thumbar对象的事件
* @param {Thumbar} thumbar
*/
function initTaskbarIpcMain(thumbar: Thumbar | null) {
on(IpcChannels.Play, () => thumbar?.setPlayState(true))
on(IpcChannels.Pause, () => thumbar?.setPlayState(false))
}
2022-04-09 00:28:37 +08:00
/**
2022-05-01 19:53:25 +08:00
* electron-store的事件
* @param {Store<TypedElectronStore>} store
2022-04-09 00:28:37 +08:00
*/
2022-05-01 19:53:25 +08:00
function initStoreIpcMain(store: Store<TypedElectronStore>) {
/**
* Main
*/
on(IpcChannels.SyncSettings, (event, settings) => {
store.set('settings', settings)
})
}
2022-04-09 00:28:37 +08:00
/**
2022-05-01 19:53:25 +08:00
*
2022-04-09 00:28:37 +08:00
*/
2022-05-01 19:53:25 +08:00
function initOtherIpcMain() {
/**
* API缓存
*/
on(IpcChannels.ClearAPICache, () => {
db.truncate(Tables.Track)
db.truncate(Tables.Album)
db.truncate(Tables.Artist)
db.truncate(Tables.Playlist)
db.truncate(Tables.ArtistAlbum)
db.truncate(Tables.AccountData)
db.truncate(Tables.Audio)
db.vacuum()
})
2022-05-01 19:53:25 +08:00
/**
* Get API cache
*/
on(IpcChannels.GetApiCacheSync, (event, args) => {
const { api, query } = args
const data = cache.get(api, query)
event.returnValue = data
})
2022-04-12 01:48:14 +08:00
2022-05-01 19:53:25 +08:00
/**
*
*/
on(IpcChannels.CacheCoverColor, (event, args) => {
const { id, color } = args
cache.set(APIs.CoverColor, { id, color })
})
2022-05-13 18:18:28 +08:00
/**
*
*/
on(IpcChannels.GetAudioCacheSize, event => {
fastFolderSize(
path.join(app.getPath('userData'), './audio_cache'),
(error, bytes) => {
if (error) throw error
event.returnValue = prettyBytes(bytes ?? 0)
}
)
})
2022-05-01 19:53:25 +08:00
/**
* tables到json文件便table大小dev环境
*/
if (process.env.NODE_ENV === 'development') {
on(IpcChannels.DevDbExportJson, () => {
const tables = [
Tables.ArtistAlbum,
Tables.Playlist,
Tables.Album,
Tables.Track,
Tables.Artist,
Tables.Audio,
Tables.AccountData,
Tables.Lyric,
]
tables.forEach(table => {
const data = db.findAll(table)
fs.writeFile(
`./tmp/${table}.json`,
JSON.stringify(data),
function (err) {
if (err) {
return console.log(err)
}
console.log('The file was saved!')
}
)
2022-04-09 00:28:37 +08:00
})
})
2022-05-01 19:53:25 +08:00
}
}