2024-11-06 03:29:08 +01:00
|
|
|
import appStore from '$electron/helpers/store.js'
|
|
|
|
import { replaceIP } from '$renderer/utils/index.js'
|
|
|
|
|
2024-11-05 11:34:14 +01:00
|
|
|
/**
|
|
|
|
* 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 []
|
|
|
|
}
|
|
|
|
}
|
2024-11-06 03:29:08 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
}
|
2024-11-07 08:14:52 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|