feat: complete release preparation, 10+ ad mediation, CI/CD, and docker deployment
Some checks failed
CI Pipeline / Code Quality & Typecheck (push) Waiting to run
CI Pipeline / Test Suite (macos-latest) (push) Blocked by required conditions
CI Pipeline / Test Suite (ubuntu-latest) (push) Blocked by required conditions
CI Pipeline / Test Suite (windows-latest) (push) Blocked by required conditions
CI Pipeline / Build Validation (admin) (push) Blocked by required conditions
CI Pipeline / Build Validation (desktop) (push) Blocked by required conditions
Deploy Landing Page / deploy (push) Blocked by required conditions
Deploy Landing Page / build (push) Waiting to run
Release & Packaging Pipeline / Build & Publish Admin Docker Image (push) Failing after 8s
Release & Code Signing CA Pipeline / build-and-sign-windows (push) Failing after 1m51s
Build macOS / Build & Package (macOS) (push) Failing after 4s
Build macOS / Build & Package (macOS)-1 (push) Failing after 5s
Release & Code Signing CA Pipeline / build-and-sign-macos (push) Failing after 3s
Release & Packaging Pipeline / Package macOS Desktop App (push) Failing after 4s
Release & Packaging Pipeline / Package Windows Desktop App (push) Failing after 2m28s
Release & Packaging Pipeline / Publish Official GitHub Release (push) Has been skipped

This commit is contained in:
Yun Chan 2026-08-20 11:12:05 +09:00
parent 5cd1de6859
commit 708e20f747
406 changed files with 42464 additions and 6199 deletions

View file

@ -248,35 +248,55 @@ class AudioCaptureService extends EventEmitter {
}
/**
* Windows: PowerShell로 AudioEndpoint .
* Windows: PowerShell로 AudioEndpoint ( ).
* SoX -t waveaudio는 FriendlyName을 deviceId로 .
*/
private async _getDevicesWindows(): Promise<AudioDevice[]> {
const { execSync } = await import('child_process')
const { exec } = await import('child_process')
const psCommand = `[Console]::OutputEncoding = [Text.Encoding]::UTF8; Get-PnpDevice -Class AudioEndpoint -Status OK | Select-Object InstanceId, FriendlyName | ConvertTo-Json -Compress`
const output = execSync(`powershell -NoProfile -Command "${psCommand}"`, {
encoding: 'utf8',
timeout: 5000,
env: { ...process.env, PYTHONIOENCODING: 'utf-8' },
}).trim()
if (!output) return []
return new Promise<AudioDevice[]>((resolve) => {
exec(
`powershell -NoProfile -Command "${psCommand}"`,
{ encoding: 'utf8', timeout: 3000, env: { ...process.env, PYTHONIOENCODING: 'utf-8' } },
(err, stdout) => {
if (err || !stdout?.trim()) {
return resolve([
{ deviceId: 'default', label: '기본 마이크 (Default)', isDefault: true }
])
}
const parsed: unknown = JSON.parse(output.startsWith('[') ? output : `[${output}]`)
if (!Array.isArray(parsed)) return []
try {
const output = stdout.trim()
const parsed: unknown = JSON.parse(output.startsWith('[') ? output : `[${output}]`)
if (!Array.isArray(parsed) || parsed.length === 0) {
return resolve([
{ deviceId: 'default', label: '기본 마이크 (Default)', isDefault: true }
])
}
const result: AudioDevice[] = []
for (const dev of parsed) {
const d = dev as { InstanceId?: string; FriendlyName?: string }
if (d.InstanceId && d.FriendlyName) {
result.push({
deviceId: d.FriendlyName,
label: d.FriendlyName,
isDefault: false,
})
}
}
return result
const result: AudioDevice[] = []
for (const dev of parsed) {
const d = dev as { InstanceId?: string; FriendlyName?: string }
if (d.InstanceId && d.FriendlyName) {
result.push({
deviceId: d.FriendlyName,
label: d.FriendlyName,
isDefault: result.length === 0,
})
}
}
resolve(result.length > 0 ? result : [
{ deviceId: 'default', label: '기본 마이크 (Default)', isDefault: true }
])
} catch {
resolve([
{ deviceId: 'default', label: '기본 마이크 (Default)', isDefault: true }
])
}
}
)
})
}
/**