client_sim fixup
This commit is contained in:
@@ -63,7 +63,7 @@ class WebTVClientSimulator {
|
|||||||
this.previousUrl = null; // Store previous URL for Referer header
|
this.previousUrl = null; // Store previous URL for Referer header
|
||||||
this.debug = debug;
|
this.debug = debug;
|
||||||
this.defaultBox = "plus";
|
this.defaultBox = "plus";
|
||||||
this.connectSessionId = Math.random().toString(16).substr(2, 8).padEnd(8, '0');
|
this.connectSessionId = Math.random().toString(16).slice(2, 10).padEnd(8, '0');
|
||||||
this.username = username;
|
this.username = username;
|
||||||
|
|
||||||
// Load minisrv config to get the initial shared key
|
// Load minisrv config to get the initial shared key
|
||||||
@@ -355,8 +355,8 @@ class WebTVClientSimulator {
|
|||||||
|
|
||||||
// Debug: Show received data for POST requests
|
// Debug: Show received data for POST requests
|
||||||
if (data) {
|
if (data) {
|
||||||
this.debugLog('POST Response chunk:', chunk.toString('utf8').substring(0, 200) + (chunk.length > 200 ? '...' : ''));
|
this.debugLog('POST Response chunk:', chunk.toString('utf8').slice(0, 200) + (chunk.length > 200 ? '...' : ''));
|
||||||
this.debugLog('POST Response hex dump:', chunk.toString('hex').substring(0, 100) + (chunk.length > 50 ? '...' : ''));
|
this.debugLog('POST Response hex dump:', chunk.toString('hex').slice(0, 100) + (chunk.length > 50 ? '...' : ''));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear any existing timeout for LZPF completion detection
|
// Clear any existing timeout for LZPF completion detection
|
||||||
@@ -440,8 +440,8 @@ class WebTVClientSimulator {
|
|||||||
} else {
|
} else {
|
||||||
this.debugLog('Processing response on connection close...');
|
this.debugLog('Processing response on connection close...');
|
||||||
if (data) {
|
if (data) {
|
||||||
this.debugLog('POST response received on close:', responseData.toString('utf8').substring(0, 500) + (responseData.length > 500 ? '...' : ''));
|
this.debugLog('POST response received on close:', responseData.toString('utf8').slice(0, 500) + (responseData.length > 500 ? '...' : ''));
|
||||||
this.debugLog('POST response hex on close:', responseData.toString('hex').substring(0, 200) + (responseData.length > 100 ? '...' : ''));
|
this.debugLog('POST response hex on close:', responseData.toString('hex').slice(0, 200) + (responseData.length > 100 ? '...' : ''));
|
||||||
}
|
}
|
||||||
|
|
||||||
const crlfcrlf = Buffer.from('\r\n\r\n');
|
const crlfcrlf = Buffer.from('\r\n\r\n');
|
||||||
@@ -571,7 +571,7 @@ class WebTVClientSimulator {
|
|||||||
if (this.ticket) {
|
if (this.ticket) {
|
||||||
request += `wtv-ticket: ${this.ticket}\r\n`;
|
request += `wtv-ticket: ${this.ticket}\r\n`;
|
||||||
}
|
}
|
||||||
request += `wtv-connect-session-id: ${Math.random().toString(16).substr(2, 8)}\r\n`;
|
request += `wtv-connect-session-id: ${Math.random().toString(16).slice(2, 10)}\r\n`;
|
||||||
request += `wtv-client-serial-number: ${this.ssid}\r\n`;
|
request += `wtv-client-serial-number: ${this.ssid}\r\n`;
|
||||||
request += this.getBoxHeaders(this.boxType);
|
request += this.getBoxHeaders(this.boxType);
|
||||||
request += `wtv-encryption: true\r\n`;
|
request += `wtv-encryption: true\r\n`;
|
||||||
@@ -663,8 +663,8 @@ class WebTVClientSimulator {
|
|||||||
const line = lines[i].replace('\r', '');
|
const line = lines[i].replace('\r', '');
|
||||||
const colonIndex = line.indexOf(':');
|
const colonIndex = line.indexOf(':');
|
||||||
if (colonIndex > 0) {
|
if (colonIndex > 0) {
|
||||||
const key = line.substring(0, colonIndex).toLowerCase();
|
const key = line.slice(0, colonIndex).toLowerCase();
|
||||||
const value = line.substring(colonIndex + 1).trim();
|
const value = line.slice(colonIndex + 1).trim();
|
||||||
headers[key] = value;
|
headers[key] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -806,8 +806,8 @@ class WebTVClientSimulator {
|
|||||||
const line = lines[i].replace('\r', '');
|
const line = lines[i].replace('\r', '');
|
||||||
const colonIndex = line.indexOf(':');
|
const colonIndex = line.indexOf(':');
|
||||||
if (colonIndex > 0) {
|
if (colonIndex > 0) {
|
||||||
const key = line.substring(0, colonIndex).toLowerCase();
|
const key = line.slice(0, colonIndex).toLowerCase();
|
||||||
const value = line.substring(colonIndex + 1).trim();
|
const value = line.slice(colonIndex + 1).trim();
|
||||||
if (headers[key]) {
|
if (headers[key]) {
|
||||||
if (Array.isArray(headers[key])) {
|
if (Array.isArray(headers[key])) {
|
||||||
headers[key].push(value);
|
headers[key].push(value);
|
||||||
@@ -848,7 +848,7 @@ class WebTVClientSimulator {
|
|||||||
|
|
||||||
// Debug: Show first 200 chars of decrypted content for verification
|
// Debug: Show first 200 chars of decrypted content for verification
|
||||||
this.debugLog('Login-stage-two decrypted content preview:');
|
this.debugLog('Login-stage-two decrypted content preview:');
|
||||||
this.debugLog(bodyBuf.toString('utf8').substring(0, 200));
|
this.debugLog(bodyBuf.toString('utf8').slice(0, 200));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error decrypting login-stage-two content:', error);
|
console.error('Error decrypting login-stage-two content:', error);
|
||||||
}
|
}
|
||||||
@@ -920,7 +920,7 @@ class WebTVClientSimulator {
|
|||||||
|
|
||||||
// Debug: Show first 500 chars of decrypted content
|
// Debug: Show first 500 chars of decrypted content
|
||||||
this.debugLog('VLN-stage-two decrypted content preview:');
|
this.debugLog('VLN-stage-two decrypted content preview:');
|
||||||
this.debugLog(bodyBuf.toString('utf8').substring(0, 500));
|
this.debugLog(bodyBuf.toString('utf8').slice(0, 500));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error decrypting VLN-stage-two content:', error);
|
console.error('Error decrypting VLN-stage-two content:', error);
|
||||||
}
|
}
|
||||||
@@ -1382,8 +1382,8 @@ class WebTVClientSimulator {
|
|||||||
const line = lines[i].replace('\r', '');
|
const line = lines[i].replace('\r', '');
|
||||||
const colonIndex = line.indexOf(':');
|
const colonIndex = line.indexOf(':');
|
||||||
if (colonIndex > 0) {
|
if (colonIndex > 0) {
|
||||||
const key = line.substring(0, colonIndex).toLowerCase();
|
const key = line.slice(0, colonIndex).toLowerCase();
|
||||||
const value = line.substring(colonIndex + 1).trim();
|
const value = line.slice(colonIndex + 1).trim();
|
||||||
headers[key] = value;
|
headers[key] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1667,7 +1667,7 @@ class WebTVClientSimulator {
|
|||||||
if (currentMatch) {
|
if (currentMatch) {
|
||||||
const serviceName = currentMatch[1];
|
const serviceName = currentMatch[1];
|
||||||
const currentPath = currentMatch[2];
|
const currentPath = currentMatch[2];
|
||||||
const basePath = currentPath.substring(0, currentPath.lastIndexOf('/') + 1);
|
const basePath = currentPath.slice(0, currentPath.lastIndexOf('/') + 1);
|
||||||
return `${serviceName}:${basePath}${url}`;
|
return `${serviceName}:${basePath}${url}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1884,12 +1884,12 @@ class WebTVClientSimulator {
|
|||||||
|
|
||||||
// Look for "location:" lines within GET blocks
|
// Look for "location:" lines within GET blocks
|
||||||
if (trimmed.startsWith('location:')) {
|
if (trimmed.startsWith('location:')) {
|
||||||
currentUrl = trimmed.substring(9).trim(); // Remove "location:" prefix
|
currentUrl = trimmed.slice(9).trim(); // Remove "location:" prefix
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for "wtv-checksum:" lines within GET blocks
|
// Look for "wtv-checksum:" lines within GET blocks
|
||||||
if (trimmed.startsWith('wtv-checksum:')) {
|
if (trimmed.startsWith('wtv-checksum:')) {
|
||||||
currentChecksum = trimmed.substring(13).trim(); // Remove "wtv-checksum:" prefix
|
currentChecksum = trimmed.slice(13).trim(); // Remove "wtv-checksum:" prefix
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2031,7 +2031,7 @@ class WebTVClientSimulator {
|
|||||||
if (currentMatch) {
|
if (currentMatch) {
|
||||||
const serviceName = currentMatch[1];
|
const serviceName = currentMatch[1];
|
||||||
const currentPath = currentMatch[2];
|
const currentPath = currentMatch[2];
|
||||||
const basePath = currentPath.substring(0, currentPath.lastIndexOf('/') + 1);
|
const basePath = currentPath.slice(0, currentPath.lastIndexOf('/') + 1);
|
||||||
return `${serviceName}:${basePath}${url}`;
|
return `${serviceName}:${basePath}${url}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2326,7 +2326,7 @@ class WebTVClientSimulator {
|
|||||||
|
|
||||||
// Generate filename based on service and path
|
// Generate filename based on service and path
|
||||||
const serviceName = url.match(/^([\w-]+):/)?.[1] || 'content';
|
const serviceName = url.match(/^([\w-]+):/)?.[1] || 'content';
|
||||||
const pathHash = require('crypto').createHash('md5').update(pathPart).digest('hex').substring(0, 8);
|
const pathHash = require('crypto').createHash('md5').update(pathPart).digest('hex').slice(0, 8);
|
||||||
return `${serviceName}_${pathHash}${ext}`;
|
return `${serviceName}_${pathHash}${ext}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2351,7 +2351,7 @@ class WebTVClientSimulator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fallback to generic filename with hash
|
// Fallback to generic filename with hash
|
||||||
const hash = require('crypto').createHash('md5').update(url).digest('hex').substring(0, 8);
|
const hash = require('crypto').createHash('md5').update(url).digest('hex').slice(0, 8);
|
||||||
const contentType = headers['content-type'] || '';
|
const contentType = headers['content-type'] || '';
|
||||||
const contentTypeExt = this.getExtensionFromContentType(contentType);
|
const contentTypeExt = this.getExtensionFromContentType(contentType);
|
||||||
const ext = contentTypeExt || '';
|
const ext = contentTypeExt || '';
|
||||||
|
|||||||
Reference in New Issue
Block a user