escrcpy/electron/exposes/scrcpy/helper.js
2024-11-07 15:16:02 +08:00

122 lines
3.0 KiB
JavaScript

import appStore from '$electron/helpers/store.js'
import { replaceIP } from '$renderer/utils/index.js'
/**
* Parse scrcpy app list output into structured data
* @param {string} rawText - Raw text output from scrcpy --list-apps command
* @returns {Array<{
* name: string,
* packageName: string,
* isSystemApp: boolean
* }>} Array of parsed app objects
*/
export function parseScrcpyAppList(rawText) {
try {
// Split by lines and filter out non-app lines
const lines = rawText.split('\n').filter((line) => {
const trimmed = line.trim()
return trimmed.startsWith('*') || trimmed.startsWith('-')
})
return lines.map((line) => {
// Remove leading * or - and trim
const cleanLine = line.trim().replace(/^[*\-]\s+/, '')
// Extract app name and package name using a more precise regex
// Matches any characters up to the last [ followed by package name and ]
const match = cleanLine.match(/^([^[]+)\[([^\]]+)\]$/)
if (!match) {
return null
}
const [, name, packageName] = match
return {
name: name.trim(),
packageName: packageName.trim(),
isSystemApp: line.trim().startsWith('*'),
}
}).filter(item => item !== null)
}
catch (error) {
console.error('Error parsing scrcpy app list:', error)
return []
}
}
/**
* Get the --display-overlay value
* @param {*} serial
* @returns {string}
*/
export function getDisplayOverlay(serial) {
const value = appStore.get(`scrcpy.${replaceIP(serial)}.--display-overlay`)
|| appStore.get('scrcpy.global.--display-overlay')
|| ''
return value
}
/**
* Parse scrcpy codec output into structured data
* @param {*} rawText
* @returns
*/
export function parseScrcpyCodecList(rawText) {
try {
const result = {
video: [],
audio: [],
}
const lines = rawText.split('\n')
for (const line of lines) {
const trimmedLine = line.trim()
if (!trimmedLine || !trimmedLine.startsWith('--')) {
continue
}
const pairs = trimmedLine.match(/--[\w-]+=[\w.-]+/g)
if (!pairs || pairs.length < 2)
continue
const info = pairs.reduce((acc, pair) => {
const [key, value] = pair.substring(2).split('=')
acc[key] = value
return acc
}, {})
if (info['video-codec'] && info['video-encoder']) {
result.video.push({
type: 'video',
codec: info['video-codec'],
encoder: info['video-encoder'],
})
}
else if (info['audio-codec'] && info['audio-encoder']) {
result.audio.push({
type: 'audio',
codec: info['audio-codec'],
encoder: info['audio-encoder'],
})
}
}
if (result.video.length === 0 && result.audio.length === 0) {
throw new Error('No valid codec information found in the log content')
}
return result
}
catch (error) {
console.error('Error parsing codec information:', error)
return {
video: [],
audio: [],
error: error.message,
}
}
}