mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-08 09:01:03 -08:00
fix: improve VLC property parsing with defensive handling
- Add resolved flag to prevent double resolution race condition - Use regex to parse numeric values instead of fragile line filtering - Centralize cleanup in done() helper for consistent handling - Increase timeout to 2000ms to match MPV Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1df371b163
commit
85225c03d2
1 file changed
+16
-21
@@ -195,6 +195,17 @@ async function getVlcProperty(port: number, command: string): Promise<string> {
|
|||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const client = createConnection({ port, host: '127.0.0.1' });
|
const client = createConnection({ port, host: '127.0.0.1' });
|
||||||
let data = '';
|
let data = '';
|
||||||
|
let resolved = false;
|
||||||
|
|
||||||
|
const done = (result: string) => {
|
||||||
|
if (resolved) return;
|
||||||
|
resolved = true;
|
||||||
|
clearTimeout(timeoutHandle);
|
||||||
|
if (!client.destroyed) client.destroy();
|
||||||
|
resolve(result);
|
||||||
|
};
|
||||||
|
|
||||||
|
const timeoutHandle = setTimeout(() => done(''), 2000);
|
||||||
|
|
||||||
client.on('connect', () => {
|
client.on('connect', () => {
|
||||||
client.write(command + '\n');
|
client.write(command + '\n');
|
||||||
@@ -202,31 +213,15 @@ async function getVlcProperty(port: number, command: string): Promise<string> {
|
|||||||
|
|
||||||
client.on('data', (chunk) => {
|
client.on('data', (chunk) => {
|
||||||
data += chunk.toString();
|
data += chunk.toString();
|
||||||
|
// VLC prompt '>' means command finished
|
||||||
if (data.includes('>')) {
|
if (data.includes('>')) {
|
||||||
// VLC prompt means command finished
|
// Parse: find numeric value (for get_time/get_length)
|
||||||
client.destroy();
|
const match = data.match(/^(\d+(\.\d+)?)\s*$/m);
|
||||||
|
done(match ? match[1] : '');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
client.on('close', () => {
|
client.on('error', () => done(''));
|
||||||
// Parse data
|
|
||||||
const lines = data
|
|
||||||
.split('\n')
|
|
||||||
.map((l) => l.trim())
|
|
||||||
.filter(
|
|
||||||
(l) => l && !l.includes('>') && !l.startsWith(command)
|
|
||||||
);
|
|
||||||
// The result should be one of the lines
|
|
||||||
const result = lines.length > 0 ? lines[0] : '';
|
|
||||||
resolve(result);
|
|
||||||
});
|
|
||||||
|
|
||||||
client.on('error', () => resolve(''));
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
if (!client.destroyed) client.destroy();
|
|
||||||
resolve('');
|
|
||||||
}, 1000);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user