mirror of
https://github.com/redphx/better-xcloud.git
synced 2025-06-07 16:17:20 +02:00
Custom User-Agent (#32)
* Add "Custom User-Agent" feature * Override navigator.userAgent * Save the original User-Agent before overriding it
This commit is contained in:
parent
654d82208b
commit
931d70ba3a
@ -272,6 +272,56 @@ class StreamStats {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class UserAgent {
|
||||||
|
static get PROFILE_EDGE_WINDOWS() { return 'edge-windows'; }
|
||||||
|
static get PROFILE_SMARTTV_TIZEN() { return 'smarttv-tizen'; }
|
||||||
|
static get PROFILE_DEFAULT() { return 'default'; }
|
||||||
|
static get PROFILE_CUSTOM() { return 'custom'; }
|
||||||
|
|
||||||
|
static #USER_AGENTS = {
|
||||||
|
[UserAgent.PROFILE_EDGE_WINDOWS]: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188',
|
||||||
|
[UserAgent.PROFILE_SMARTTV_TIZEN]: 'Mozilla/5.0 (SMART-TV; LINUX; Tizen 7.0) AppleWebKit/537.36 (KHTML, like Gecko) 94.0.4606.31/7.0 TV Safari/537.36',
|
||||||
|
}
|
||||||
|
|
||||||
|
static get(profile) {
|
||||||
|
const defaultUserAgent = window.navigator.orgUserAgent || window.navigator.userAgent;
|
||||||
|
if (profile === UserAgent.PROFILE_CUSTOM) {
|
||||||
|
return PREFS.get(Preferences.USER_AGENT_CUSTOM, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
return UserAgent.#USER_AGENTS[profile] || defaultUserAgent;
|
||||||
|
}
|
||||||
|
|
||||||
|
static spoof() {
|
||||||
|
const profile = PREFS.get(Preferences.USER_AGENT_PROFILE);
|
||||||
|
if (profile === UserAgent.PROFILE_DEFAULT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultUserAgent = window.navigator.userAgent;
|
||||||
|
const userAgent = UserAgent.get(profile) || defaultUserAgent;
|
||||||
|
|
||||||
|
// Clear data of navigator.userAgentData, force xCloud to detect browser based on navigator.userAgent
|
||||||
|
Object.defineProperty(window.navigator, 'userAgentData', {});
|
||||||
|
|
||||||
|
// Override navigator.userAgent
|
||||||
|
window.navigator.orgUserAgent = window.navigator.userAgent;
|
||||||
|
Object.defineProperty(window.navigator, 'userAgent', {
|
||||||
|
value: userAgent,
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(window, '__PRELOADED_STATE__', {
|
||||||
|
configurable: true,
|
||||||
|
get: () => this._state,
|
||||||
|
set: (state) => {
|
||||||
|
state.appContext.requestInfo.userAgent = userAgent;
|
||||||
|
this._state = state;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Preferences {
|
class Preferences {
|
||||||
static get LAST_UPDATE_CHECK() { return 'last_update_check'; }
|
static get LAST_UPDATE_CHECK() { return 'last_update_check'; }
|
||||||
static get LATEST_VERSION() { return 'latest_version'; }
|
static get LATEST_VERSION() { return 'latest_version'; }
|
||||||
@ -280,6 +330,8 @@ class Preferences {
|
|||||||
static get PREFER_IPV6_SERVER() { return 'prefer_ipv6_server'; }
|
static get PREFER_IPV6_SERVER() { return 'prefer_ipv6_server'; }
|
||||||
static get STREAM_TARGET_RESOLUTION() { return 'stream_target_resolution'; }
|
static get STREAM_TARGET_RESOLUTION() { return 'stream_target_resolution'; }
|
||||||
static get USE_DESKTOP_CODEC() { return 'use_desktop_codec'; }
|
static get USE_DESKTOP_CODEC() { return 'use_desktop_codec'; }
|
||||||
|
static get USER_AGENT_PROFILE() { return 'user_agent_profile'; }
|
||||||
|
static get USER_AGENT_CUSTOM() { return 'user_agent_custom'; }
|
||||||
|
|
||||||
static get SCREENSHOT_BUTTON_POSITION() { return 'screenshot_button_position'; }
|
static get SCREENSHOT_BUTTON_POSITION() { return 'screenshot_button_position'; }
|
||||||
static get BLOCK_TRACKING() { return 'block_tracking'; }
|
static get BLOCK_TRACKING() { return 'block_tracking'; }
|
||||||
@ -357,6 +409,20 @@ class Preferences {
|
|||||||
'label': 'Disable xCloud analytics',
|
'label': 'Disable xCloud analytics',
|
||||||
'default': false,
|
'default': false,
|
||||||
},
|
},
|
||||||
|
[Preferences.USER_AGENT_PROFILE]: {
|
||||||
|
'label': 'User-Agent profile',
|
||||||
|
'default': 'default',
|
||||||
|
'options': {
|
||||||
|
[UserAgent.PROFILE_DEFAULT]: 'Default',
|
||||||
|
[UserAgent.PROFILE_EDGE_WINDOWS]: 'Edge on Windows',
|
||||||
|
[UserAgent.PROFILE_SMARTTV_TIZEN]: 'Samsung Smart TV',
|
||||||
|
[UserAgent.PROFILE_CUSTOM]: 'Custom',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[Preferences.USER_AGENT_CUSTOM]: {
|
||||||
|
'default': '',
|
||||||
|
'hidden': true,
|
||||||
|
},
|
||||||
[Preferences.VIDEO_FILL_FULL_SCREEN]: {
|
[Preferences.VIDEO_FILL_FULL_SCREEN]: {
|
||||||
'label': 'Stretch video to full screen',
|
'label': 'Stretch video to full screen',
|
||||||
'default': false,
|
'default': false,
|
||||||
@ -686,6 +752,11 @@ function addCss() {
|
|||||||
background-color: #00753c;
|
background-color: #00753c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.better_xcloud_settings_custom_user_agent {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
div[class*=StreamMenu-module__menuContainer] > div[class*=Menu-module] {
|
div[class*=StreamMenu-module__menuContainer] > div[class*=Menu-module] {
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
@ -1257,9 +1328,30 @@ function injectSettingsButton($parent) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let $control;
|
let $control, $inpCustomUserAgent;
|
||||||
let labelAttrs = {};
|
let labelAttrs = {};
|
||||||
if (settingId === Preferences.SERVER_REGION || setting.options) {
|
|
||||||
|
if (settingId === Preferences.USER_AGENT_PROFILE) {
|
||||||
|
let defaultUserAgent = window.navigator.orgUserAgent || window.navigator.userAgent;
|
||||||
|
$inpCustomUserAgent = CE('input', {
|
||||||
|
'type': 'text',
|
||||||
|
'placeholder': defaultUserAgent,
|
||||||
|
'class': 'better_xcloud_settings_custom_user_agent',
|
||||||
|
});
|
||||||
|
$inpCustomUserAgent.addEventListener('change', e => {
|
||||||
|
PREFS.set(Preferences.USER_AGENT_CUSTOM, e.target.value.trim());
|
||||||
|
});
|
||||||
|
|
||||||
|
$control = PREFS.toElement(Preferences.USER_AGENT_PROFILE, e => {
|
||||||
|
const value = e.target.value;
|
||||||
|
let isCustom = value === UserAgent.PROFILE_CUSTOM;
|
||||||
|
let userAgent = UserAgent.get(value);
|
||||||
|
|
||||||
|
$inpCustomUserAgent.value = userAgent;
|
||||||
|
$inpCustomUserAgent.readOnly = !isCustom;
|
||||||
|
$inpCustomUserAgent.disabled = !isCustom;
|
||||||
|
});
|
||||||
|
} else if (settingId === Preferences.SERVER_REGION || setting.options) {
|
||||||
let selectedValue;
|
let selectedValue;
|
||||||
|
|
||||||
$control = CE('select', {id: 'xcloud_setting_' + settingId});
|
$control = CE('select', {id: 'xcloud_setting_' + settingId});
|
||||||
@ -1324,6 +1416,13 @@ function injectSettingsButton($parent) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
$wrapper.appendChild($elm);
|
$wrapper.appendChild($elm);
|
||||||
|
|
||||||
|
// Add User-Agent input
|
||||||
|
if (settingId === Preferences.USER_AGENT_PROFILE) {
|
||||||
|
$wrapper.appendChild($inpCustomUserAgent);
|
||||||
|
// Trigger 'change' event
|
||||||
|
$control.dispatchEvent(new Event('change'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const $reloadBtn = CE('button', {'class': 'setting_button', 'tabindex': 0}, 'Reload page to reflect changes');
|
const $reloadBtn = CE('button', {'class': 'setting_button', 'tabindex': 0}, 'Reload page to reflect changes');
|
||||||
@ -1924,8 +2023,7 @@ window.addEventListener('popstate', hideUiOnPageChange);
|
|||||||
window.history.pushState = patchHistoryMethod('pushState');
|
window.history.pushState = patchHistoryMethod('pushState');
|
||||||
window.history.replaceState = patchHistoryMethod('replaceState');
|
window.history.replaceState = patchHistoryMethod('replaceState');
|
||||||
|
|
||||||
// Clear data of window.navigator.userAgentData, force Xcloud to detect browser based on User-Agent header
|
UserAgent.spoof();
|
||||||
Object.defineProperty(window.navigator, 'userAgentData', {});
|
|
||||||
|
|
||||||
// Disable bandwidth checking
|
// Disable bandwidth checking
|
||||||
if (PREFS.get(Preferences.DISABLE_BANDWIDTH_CHECKING)) {
|
if (PREFS.get(Preferences.DISABLE_BANDWIDTH_CHECKING)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user