feat: migrate to turbo (#22)

* feat: migrate top turbo

* ci: ci test

* fix: fix codeql issues

* feat: ci test

* chore: lint

* chore: misc changes

* feat: rename vite helpers

* feat: use fetch to handle assets

* feat: update directory

* feat: fetch charword table

* feat: migrate download game data and detect missing voice files

* feat: symlink relative path

* feat: finish wrangler upload

* feat: migrate wrangler download

* feat: finish

* chore: auto update

* ci: update ci

* ci: update ci

---------

Co-authored-by: Halyul <Halyul@users.noreply.github.com>
This commit is contained in:
Haoyu Xu
2025-02-22 15:11:30 +08:00
committed by GitHub
parent 17c61ce5d4
commit d6e7bc20d3
352 changed files with 12911 additions and 9411 deletions

1
packages/music/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
data

View File

@@ -0,0 +1,3 @@
dist
data
auto_update

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
[{"id":"bg_rhodes_day","intro":"Audio/Sound_Beta_2/Music/beta1_180603/m_sys_void_intro","loop":"Audio/Sound_Beta_2/Music/beta1_180603/m_sys_void_loop"},{"id":"bg_rhodes_night","intro":"Audio/Sound_Beta_2/Music/beta2_180603/m_sys_tech_intro","loop":"Audio/Sound_Beta_2/Music/beta2_180603/m_sys_tech_loop"},{"id":"bg_main_victoria_1","intro":"Audio/Sound_Beta_2/Music/AVG/m_avg_ghosthunter_intro","loop":"Audio/Sound_Beta_2/Music/AVG/m_avg_ghosthunter_loop"},{"id":"bg_siesta_1","intro":"Audio/Sound_Beta_2/Music/obt/m_sys_ddd_intro","loop":"Audio/Sound_Beta_2/Music/obt/m_sys_ddd_loop"},{"id":"bg_kazimierz_1","intro":"Audio/Sound_Beta_2/Music/beta3_181101/m_dia_street_intro","loop":"Audio/Sound_Beta_2/Music/beta3_181101/m_dia_street_loop"},{"id":"bg_ursus_1","intro":"Audio/Sound_Beta_2/Music/static/m_avg/m_avg_loneliness_intro","loop":"Audio/Sound_Beta_2/Music/static/m_avg/m_avg_loneliness_loop"},{"id":"bg_yan_1","intro":null,"loop":"Audio/Sound_Beta_2/Music/act15side/m_sys_bitw_loop"},{"id":"bg_iberia_1","intro":"Audio/Sound_Beta_2/Music/act18d3d0/m_sys_act18d3d0_intro","loop":"Audio/Sound_Beta_2/Music/act18d3d0/m_sys_act18d3d0_loop"},{"id":"bg_anniversary_1","intro":"Audio/Sound_Beta_2/Music/beta2_180603/m_dia_nightoflongmen_intro","loop":"Audio/Sound_Beta_2/Music/beta2_180603/m_dia_nightoflongmen_loop"},{"id":"bg_rogue_1","intro":null,"loop":"Audio/Sound_Beta_2/Music/rogue_1/m_avg_rglk1secretevent_loop"},{"id":"bg_rogue_2","intro":null,"loop":"Audio/Sound_Beta_2/Music/rogue_2/m_sys_rglk2DLC_loop"},{"id":"bg_laterano_1","intro":"Audio/Sound_Beta_2/Music/act16side/m_sys_act16side_intro","loop":"Audio/Sound_Beta_2/Music/act16side/m_sys_act16side_loop"},{"id":"bg_rhine_1","intro":"Audio/Sound_Beta_2/Music/act19side/m_sys_act19side_intro","loop":"Audio/Sound_Beta_2/Music/act19side/m_sys_act19side_loop"},{"id":"bg_kalts_1","intro":"Audio/Sound_Beta_2/Music/act18d0d0/m_sys_act18d0d0_intro","loop":"Audio/Sound_Beta_2/Music/act18d0d0/m_sys_act18d0d0_loop"},{"id":"bg_rogue_3","intro":"Audio/Sound_Beta_2/Music/rogue_3/m_bat_rglk3DLC_intro","loop":"Audio/Sound_Beta_2/Music/rogue_3/m_bat_rglk3DLC_loop"},{"id":"bg_rainbowsix_1","intro":null,"loop":"Audio/Sound_Beta_2/Music/act32side/m_act32side_sys_loop"},{"id":"bg_rhodes_flower_1","intro":"Audio/Sound_Beta_2/Music/act16mini/m_sys_act16mini_intro","loop":"Audio/Sound_Beta_2/Music/act16mini/m_sys_act16mini_loop"},{"id":"bg_sanrio_1","intro":null,"loop":"Audio/Sound_Beta_2/Music/act27side/m_avg_SiestaCity"},{"id":"bg_sandboxv2_1","intro":null,"loop":"Audio/Sound_Beta_2/Music/sandbox_1/m_sys_sandbox_1_map_loop"},{"id":"bg_dungeon_1","intro":null,"loop":"Audio/Sound_Beta_2/Music/act36side/m_sys_act36side_loop"},{"id":"bg_sui_1","intro":"Audio/Sound_Beta_2/Music/act31side/m_act31side_sys_intro","loop":"Audio/Sound_Beta_2/Music/act31side/m_act31side_sys_loop"},{"id":"bg_rogue_4","intro":null,"loop":"Audio/Sound_Beta_2/Music/act17mini/m_sys_act17mini_loop"},{"id":"operator_bg","intro":"m_sys_void_intro","loop":"m_sys_void_loop"}]

View File

@@ -0,0 +1,3 @@
import baseConfig from '@aklive2d/eslint-config'
/** @type {import('eslint').Config} */
export default [...baseConfig]

117
packages/music/index.js Normal file
View File

@@ -0,0 +1,117 @@
import path from 'path'
import { file } from '@aklive2d/libs'
import { githubDownload } from '@aklive2d/downloader'
import config from '@aklive2d/config'
const AUTO_UPDATE_FOLDER = path.resolve(
import.meta.dirname,
config.dir_name.auto_update
)
export const DATA_DIR = path.resolve(import.meta.dirname, config.dir_name.data)
const MUSIC_TABLE_JSON = path.join(
AUTO_UPDATE_FOLDER,
config.module.music.music_table_json
)
const download = async () => {
const display_meta_table_json = path.resolve(
AUTO_UPDATE_FOLDER,
config.module.music.display_meta_table_json
)
const audio_data_json = path.resolve(
AUTO_UPDATE_FOLDER,
config.module.music.audio_data_json
)
const metaTable = await githubDownload(
`https://api.github.com/repos/Kengxxiao/ArknightsGameData/commits?path=zh_CN/gamedata/excel/display_meta_table.json`,
`https://raw.githubusercontent.com/Kengxxiao/ArknightsGameData/master/zh_CN/gamedata/excel/display_meta_table.json`,
display_meta_table_json
)
const audioDataTable = await githubDownload(
`https://api.github.com/repos/Kengxxiao/ArknightsGameData/commits?path=zh_CN/gamedata/excel/audio_data.json`,
`https://raw.githubusercontent.com/Kengxxiao/ArknightsGameData/master/zh_CN/gamedata/excel/audio_data.json`,
audio_data_json
)
return {
metaTable,
audioDataTable,
}
}
const generateMapping = () => {
const musicFolder = DATA_DIR
const musicTable = JSON.parse(file.readSync(MUSIC_TABLE_JSON))
const musicFileMapping = {}
const musicFiles = []
if (!musicTable) return
for (const item of musicTable) {
const key = `${item.id}.png`
musicFileMapping[key] = {}
if (item.intro) {
const filename = `${item.intro.split('/').pop()}.ogg`
musicFileMapping[key].intro = filename
musicFiles.push({
filename,
source: musicFolder,
})
} else {
musicFileMapping[key].intro = null
}
if (item.loop) {
const filename = `${item.loop.split('/').pop()}.ogg`
musicFileMapping[key].loop = filename
musicFiles.push({
filename,
source: musicFolder,
})
} else {
musicFileMapping[key].loop = null
}
}
return {
musicFiles,
musicFileMapping,
}
}
export const mapping = generateMapping()
export const update = async () => {
const { metaTable, audioDataTable } = await download()
const musicTable = audioDataTable.musics
const musicBank = audioDataTable.bgmBanks
const musicBankAlias = audioDataTable.bankAlias
const musicData = metaTable.homeBackgroundData.homeBgDataList.reduce(
(acc, cur) => {
acc.push({
id: cur.bgId,
musicId: cur.bgMusicId,
})
return acc
},
[]
)
const list = []
for (const item of musicData) {
let bankName = musicTable.find((el) => item.musicId === el.id).bank
if (typeof musicBankAlias[bankName] !== 'undefined') {
bankName = musicBankAlias[bankName]
}
const obj = musicBank.find((el) => bankName === el.name)
list.push({
id: item.id,
intro: obj.intro,
loop: obj.loop,
})
}
list.push({
id: 'operator_bg',
intro: 'm_sys_void_intro',
loop: 'm_sys_void_loop',
})
file.writeSync(JSON.stringify(list, null), MUSIC_TABLE_JSON)
}

View File

@@ -0,0 +1,18 @@
{
"name": "@aklive2d/music",
"private": true,
"version": "0.0.0",
"main": "index.js",
"type": "module",
"dependencies": {
"@aklive2d/libs": "workspace:*",
"@aklive2d/config": "workspace:*",
"@aklive2d/downloader": "workspace:*",
"@aklive2d/eslint-config": "workspace:*",
"@aklive2d/prettier-config": "workspace:*"
},
"scripts": {
"update": "mode=update node runner.js",
"lint": "eslint \"*.js\" \"**/*.js\" && prettier --check ."
}
}

View File

@@ -0,0 +1,11 @@
import baseConfig from '@aklive2d/prettier-config'
/**
* @type {import("prettier").Config}
*/
const config = {
...baseConfig,
semi: false,
}
export default config

20
packages/music/runner.js Normal file
View File

@@ -0,0 +1,20 @@
import { envParser } from '@aklive2d/libs'
import { update } from './index.js'
async function main() {
const { mode } = envParser.parse({
mode: {
type: 'string',
short: 'm',
},
})
switch (mode) {
case 'update':
await update()
break
default:
throw new Error(`Unknown mode: ${mode}`)
}
}
main()