Compare commits

...

19 Commits

Author SHA1 Message Date
97f2ae0df9 Bump version to 3.5.3 2024-04-17 17:05:38 +07:00
c38ccaf050 Update translations 2024-04-17 16:37:16 +07:00
a137c5eb57 Remove Clarity Boost restriction 2024-04-17 16:35:07 +07:00
7bd071d527 Fix crashing on Chromium 124 2024-04-17 15:45:45 +07:00
6f9ae9a555 Move DEFAULT_FLAGS below ADDITIONAL CODE section 2024-04-17 08:07:01 +07:00
2008806507 Fix the star icon in Settings button 2024-04-16 17:09:12 +07:00
c758827232 Move handleDeepLink() to the app 2024-04-15 18:05:29 +07:00
9322480059 Minor fixes 2024-04-15 08:06:14 +07:00
992605690f Minor fixes 2024-04-15 07:56:42 +07:00
08f2db0846 Remove hash in handleDeepLink() 2024-04-15 07:53:01 +07:00
645155bee0 Add handleDeepLink() 2024-04-15 07:45:43 +07:00
e6dad23547 Update 02-feature-request.yml 2024-04-13 18:01:44 +07:00
04a26680d5 Update 01-bug-report.yml 2024-04-13 18:01:29 +07:00
8ff50ecab8 Delete .github/ISSUE_TEMPLATE/feature_request.md 2024-04-13 17:42:37 +07:00
e20f661c36 Add Feature Request form 2024-04-13 17:42:23 +07:00
f958244e43 Delete .github/ISSUE_TEMPLATE/bug_report.md 2024-04-13 17:34:35 +07:00
ec76731e37 Add Bug Report form 2024-04-13 17:33:51 +07:00
aedc617298 Fix screenshot button blocking Guide UI 2024-04-13 16:41:08 +07:00
d451cfeac9 Add "SafariWorkaround" flag 2024-04-13 10:33:07 +07:00
6 changed files with 275 additions and 146 deletions

View File

@ -0,0 +1,83 @@
name: Bug Report 🐞
description: File a bug report
title: "[Bug] "
labels:
- bug
body:
- type: markdown
attributes:
value: |
Please fill out the following information to help us resolve the issue.
> [!warning]
> Only use English. Any other languages will be deleted.
- type: dropdown
id: device_type
attributes:
label: Device
description: "Which device are you using?"
options:
- Phone/Tablet
- Laptop
- Desktop
- TV
- Other
multiple: false
validations:
required: true
- type: dropdown
id: os
attributes:
label: "Operating System"
description: "Which operating system is it running?"
options:
- Windows
- macOS
- Linux
- Android
- iOS/iPadOS
- Other
multiple: false
validations:
required: true
- type: dropdown
id: browser
attributes:
label: "Browser"
description: "Which browser are you using?"
options:
- Chrome/Edge/Chromium
- Kiwi Browser
- Safari
- Other
multiple: false
validations:
required: true
- type: input
id: browser_version
attributes:
label: "Browser Version"
description: "What is the version of the browser?"
placeholder: "e.g., 122.0"
validations:
required: true
- type: input
id: extension_version
attributes:
label: "Better xCloud Version"
description: "What is the version of Better xCloud?"
placeholder: "e.g., 3.5.0"
validations:
required: true
- type: textarea
id: repro
attributes:
label: "Reproduction Steps"
description: |
How did you trigger this bug? Please provide screenshot/video if possible.
placeholder: |
Example:
1. Open game X
2. Click on Y
3. Error
validations:
required: true

View File

@ -0,0 +1,61 @@
name: Feature Request 🚀
description: Request a new feature, improvement, or general suggestion
title: "[Feature] "
labels:
- enhancement
body:
- type: markdown
attributes:
value: |
Please fill out the following information to help us understand your request.
> [!warning]
> Only use English. Any other languages will be deleted.
- type: dropdown
id: device_type
attributes:
label: Device
description: "Which device are you using?"
options:
- Phone/Tablet
- Laptop
- Desktop
- TV
- Other
multiple: false
validations:
required: true
- type: dropdown
id: os
attributes:
label: "Operating System"
description: "Which operating system is it running?"
options:
- Windows
- macOS
- Linux
- Android
- iOS/iPadOS
- Other
multiple: false
validations:
required: true
- type: dropdown
id: browser
attributes:
label: "Browser"
description: "Which browser are you using?"
options:
- Chrome/Edge/Chromium
- Kiwi Browser
- Safari
- Other
multiple: false
validations:
required: true
- type: textarea
id: suggestion
attributes:
label: "Suggestion"
description: "What do you want to suggest?"
validations:
required: true

View File

@ -1,23 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: "[Bug] ..."
labels: bug
assignees: ''
---
<!-- ⚠️ Only use English. Any other languages will be deleted. -->
**Platform**
- Device: Phone, Laptop, Desktop, TV...
- OS: Windows, Android, iOS...
- Browser: Chrome, Safari, Kiwi...
- Browser Version:
- Better xCloud Version:
**Describe the bug**
...
**Screenshots/Videos**
If applicable, add screenshots/videos to help explain your problem.

View File

@ -1,18 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: "[Feature] ..."
labels: enhancement
assignees: ''
---
<!-- ⚠️ Only use English. Any other languages will be deleted. -->
**I'm using:**
- Device:
- OS:
- Browser:
**I want to suggest this feature:**
...

View File

@ -1,5 +1,5 @@
// ==UserScript== // ==UserScript==
// @name Better xCloud // @name Better xCloud
// @namespace https://github.com/redphx // @namespace https://github.com/redphx
// @version 3.5.2 // @version 3.5.3
// ==/UserScript== // ==/UserScript==

View File

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name Better xCloud // @name Better xCloud
// @namespace https://github.com/redphx // @namespace https://github.com/redphx
// @version 3.5.2 // @version 3.5.3
// @description Improve Xbox Cloud Gaming (xCloud) experience // @description Improve Xbox Cloud Gaming (xCloud) experience
// @author redphx // @author redphx
// @license MIT // @license MIT
@ -14,17 +14,62 @@
// ==/UserScript== // ==/UserScript==
'use strict'; 'use strict';
/* ADDITIONAL CODE */ const SCRIPT_VERSION = '3.5.3';
const SCRIPT_VERSION = '3.5.2';
const SCRIPT_HOME = 'https://github.com/redphx/better-xcloud'; const SCRIPT_HOME = 'https://github.com/redphx/better-xcloud';
const AppInterface = window.AppInterface;
const BxEvent = {
JUMP_BACK_IN_READY: 'bx-jump-back-in-ready',
POPSTATE: 'bx-popstate',
STREAM_LOADING: 'bx-stream-loading',
STREAM_STARTING: 'bx-stream-starting',
STREAM_STARTED: 'bx-stream-started',
STREAM_PLAYING: 'bx-stream-playing',
STREAM_STOPPED: 'bx-stream-stopped',
STREAM_ERROR_PAGE: 'bx-stream-error-page',
STREAM_MENU_SHOWN: 'bx-stream-menu-shown',
STREAM_MENU_HIDDEN: 'bx-stream-menu-hidden',
STREAM_WEBRTC_CONNECTED: 'bx-stream-webrtc-connected',
STREAM_WEBRTC_DISCONNECTED: 'bx-stream-webrtc-disconnected',
CUSTOM_TOUCH_LAYOUTS_LOADED: 'bx-custom-touch-layouts-loaded',
REMOTE_PLAY_READY: 'bx-remote-play-ready',
REMOTE_PLAY_FAILED: 'bx-remote-play-failed',
DATA_CHANNEL_CREATED: 'bx-data-channel-created',
dispatch: (target, eventName, data) => {
if (!eventName) {
alert('BxEvent.dispatch(): eventName is null');
return;
}
const event = new Event(eventName);
if (data) {
for (const key in data) {
event[key] = data[key];
}
}
AppInterface && AppInterface.onEvent(eventName);
target.dispatchEvent(event);
},
};
/* ADDITIONAL CODE */
// Setup flags // Setup flags
const DEFAULT_FLAGS = { const DEFAULT_FLAGS = {
CheckForUpdate: true, CheckForUpdate: true,
PreloadRemotePlay: true, PreloadRemotePlay: true,
PreloadUi: false, PreloadUi: false,
EnableXcloudLogging: false, EnableXcloudLogging: false,
SafariWorkaround: true,
UseDevTouchLayout: false, UseDevTouchLayout: false,
} }
@ -32,8 +77,6 @@ const DEFAULT_FLAGS = {
const BX_FLAGS = Object.assign(DEFAULT_FLAGS, window.BX_FLAGS || {}); const BX_FLAGS = Object.assign(DEFAULT_FLAGS, window.BX_FLAGS || {});
delete window.BX_FLAGS; delete window.BX_FLAGS;
const AppInterface = window.AppInterface;
let REMOTE_PLAY_SERVER; let REMOTE_PLAY_SERVER;
const ENABLE_NATIVE_MKB_BETA = false; const ENABLE_NATIVE_MKB_BETA = false;
@ -67,45 +110,6 @@ if (window.location.pathname.includes('/auth/msa')) {
console.log(`[Better xCloud] readyState: ${document.readyState}`); console.log(`[Better xCloud] readyState: ${document.readyState}`);
const BxEvent = {
JUMP_BACK_IN_READY: 'bx-jump-back-in-ready',
POPSTATE: 'bx-popstate',
STREAM_LOADING: 'bx-stream-loading',
STREAM_STARTING: 'bx-stream-starting',
STREAM_STARTED: 'bx-stream-started',
STREAM_PLAYING: 'bx-stream-playing',
STREAM_STOPPED: 'bx-stream-stopped',
STREAM_ERROR_PAGE: 'bx-stream-error-page',
STREAM_MENU_SHOWN: 'bx-stream-menu-shown',
STREAM_MENU_HIDDEN: 'bx-stream-menu-hidden',
STREAM_WEBRTC_CONNECTED: 'bx-stream-webrtc-connected',
STREAM_WEBRTC_DISCONNECTED: 'bx-stream-webrtc-disconnected',
CUSTOM_TOUCH_LAYOUTS_LOADED: 'bx-custom-touch-layouts-loaded',
DATA_CHANNEL_CREATED: 'bx-data-channel-created',
dispatch: (target, eventName, data) => {
if (!eventName) {
alert('BxEvent.dispatch(): eventName is null');
return;
}
const event = new Event(eventName);
if (data) {
for (const key in data) {
event[key] = data[key];
}
}
AppInterface && AppInterface.onEvent(eventName);
target.dispatchEvent(event);
},
};
// Quickly create a tree of elements without having to use innerHTML // Quickly create a tree of elements without having to use innerHTML
function createElement(elmName, props = {}) { function createElement(elmName, props = {}) {
@ -672,7 +676,7 @@ const Translations = {
"Audio- und Video-Streams kombinieren", "Audio- und Video-Streams kombinieren",
"Gabung audio & video stream", "Gabung audio & video stream",
"Combine audio & video streams", "Combine audio & video streams",
, "Combinar flujos de audio y vídeo",
, ,
, ,
"音声を映像ストリーミングと統合", "音声を映像ストリーミングと統合",
@ -689,7 +693,7 @@ const Translations = {
"Könnte das Problem mit verzögertem Ton beheben", "Könnte das Problem mit verzögertem Ton beheben",
"Mungkin memperbaiki masalah lag pada audio", "Mungkin memperbaiki masalah lag pada audio",
"May fix the laggy audio problem", "May fix the laggy audio problem",
, "Puede arreglar el problema de audio con retraso",
, ,
, ,
"音声の遅延を改善できる可能性があります", "音声の遅延を改善できる可能性があります",
@ -1267,7 +1271,7 @@ const Translations = {
"Experimentell", "Experimentell",
"Eksperimental", "Eksperimental",
"Experimental", "Experimental",
, "Experimental",
, ,
, ,
"実験的機能", "実験的機能",
@ -1403,7 +1407,7 @@ const Translations = {
"Scrollbalken der Webseite ausblenden", "Scrollbalken der Webseite ausblenden",
"Sembunyikan bilah gulir halaman", "Sembunyikan bilah gulir halaman",
"Hide web page's scrollbar", "Hide web page's scrollbar",
, "Oculta la barra de desplazamiento de la página",
, ,
, ,
"Webページのスクロールバーを隠す", "Webページのスクロールバーを隠す",
@ -1471,7 +1475,7 @@ const Translations = {
"\"Better xCloud\" App für Android installieren", "\"Better xCloud\" App für Android installieren",
"Pasang aplikasi Better xCloud untuk Android", "Pasang aplikasi Better xCloud untuk Android",
"Install Better xCloud app for Android", "Install Better xCloud app for Android",
, "Instale la aplicación Better xCloud para Android",
, ,
, ,
"Android用のBetter xCloudをインストール", "Android用のBetter xCloudをインストール",
@ -2355,7 +2359,7 @@ const Translations = {
"Videofilter auf Screenshots anwenden", "Videofilter auf Screenshots anwenden",
"Terapkan filter video pada screenshot", "Terapkan filter video pada screenshot",
"Applies video filters to screenshots", "Applies video filters to screenshots",
, "Aplica filtros de vídeo a las capturas de pantalla",
, ,
, ,
"スクリーンショットにビデオフィルターを適用", "スクリーンショットにビデオフィルターを適用",
@ -3273,7 +3277,7 @@ const Translations = {
"Vibration", "Vibration",
"Getaran", "Getaran",
"Vibration", "Vibration",
, "Vibración",
, ,
, ,
"振動", "振動",
@ -3428,8 +3432,7 @@ let LOCALE = Translations.getLocale();
const t = Translations.get; const t = Translations.get;
const ENABLE_SAFARI_WORKAROUND = true; if (BX_FLAGS.SafariWorkaround && document.readyState !== 'loading') {
if (ENABLE_SAFARI_WORKAROUND && document.readyState !== 'loading') {
// Stop loading // Stop loading
window.stop(); window.stop();
@ -3487,7 +3490,48 @@ var GAME_XBOX_TITLE_ID;
var GAME_PRODUCT_ID; var GAME_PRODUCT_ID;
var APP_CONTEXT; var APP_CONTEXT;
window.BX_EXPOSED = {}; window.BX_EXPOSED = {
onPollingModeChanged: mode => {
if (!IS_PLAYING) {
return false;
}
const $screenshotBtn = document.querySelector('.bx-screenshot-button');
const $touchControllerBar = document.getElementById('bx-touch-controller-bar');
if (mode !== 'None') {
// Hide screenshot button
$screenshotBtn && $screenshotBtn.classList.add('bx-gone');
// Hide touch controller bar
$touchControllerBar && $touchControllerBar.classList.add('bx-gone');
} else {
// Show screenshot button
$screenshotBtn && $screenshotBtn.classList.remove('bx-gone');
// Show touch controller bar
$touchControllerBar && $touchControllerBar.classList.remove('bx-gone');
}
},
};
function localRedirect(path) {
const url = window.location.href.substring(0, 31) + path;
const $pageContent = document.getElementById('PageContent');
const $anchor = CE('a', { href: url, class: 'bx-hidden bx-offscreen' }, '');
$anchor.addEventListener('click', e => {
setTimeout(() => {
$pageContent.removeChild($anchor);
}, 1000);
});
$pageContent.appendChild($anchor);
$anchor.click();
}
let IS_REMOTE_PLAYING; let IS_REMOTE_PLAYING;
let REMOTE_PLAY_CONFIG; let REMOTE_PLAY_CONFIG;
@ -3664,6 +3708,7 @@ class RemotePlay {
RemotePlay.#getConsolesList(() => { RemotePlay.#getConsolesList(() => {
console.log(RemotePlay.#CONSOLES); console.log(RemotePlay.#CONSOLES);
RemotePlay.#renderConsoles(); RemotePlay.#renderConsoles();
BxEvent.dispatch(window, BxEvent.REMOTE_PLAY_READY);
}); });
}); });
} }
@ -3855,19 +3900,7 @@ class RemotePlay {
}; };
window.BX_REMOTE_PLAY_CONFIG = REMOTE_PLAY_CONFIG; window.BX_REMOTE_PLAY_CONFIG = REMOTE_PLAY_CONFIG;
const url = window.location.href.substring(0, 31) + '/launch/fortnite/BT5P2X999VH2#remote-play'; localRedirect('/launch/fortnite/BT5P2X999VH2#remote-play');
const $pageContent = document.getElementById('PageContent');
const $anchor = CE('a', { href: url, class: 'bx-hidden bx-offscreen' }, '');
$anchor.addEventListener('click', e => {
setTimeout(() => {
$pageContent.removeChild($anchor);
}, 1000);
});
$pageContent.appendChild($anchor);
$anchor.click();
RemotePlay.detachPopup(); RemotePlay.detachPopup();
} }
@ -7110,15 +7143,9 @@ class UserAgent {
const profile = getPref(Preferences.USER_AGENT_PROFILE); const profile = getPref(Preferences.USER_AGENT_PROFILE);
if (profile === UserAgent.PROFILE_DEFAULT) { if (profile === UserAgent.PROFILE_DEFAULT) {
// Fix Kiwi 124
if (window.navigator.userAgent.includes('Chrome/124.0.0.0')) {
newUserAgent = window.navigator.userAgent.replace('Chrome/124.0.0.0', 'Chrome/122.0.0.0')
} else {
return; return;
} }
}
if (!newUserAgent) { if (!newUserAgent) {
newUserAgent = UserAgent.get(profile); newUserAgent = UserAgent.get(profile);
} }
@ -8307,6 +8334,19 @@ if (gamepadFound) {
} }
return funcStr; return funcStr;
}, },
broadcastPollingMode: function(funcStr) {
const text = '.setPollingMode=e=>{';
if (!funcStr.includes(text)) {
return false;
}
const newCode = `
window.BX_EXPOSED.onPollingModeChanged && window.BX_EXPOSED.onPollingModeChanged(e);
`;
funcStr = funcStr.replace(text, text + newCode);
return funcStr;
},
}; };
static #PATCH_ORDERS = [ static #PATCH_ORDERS = [
@ -8315,10 +8355,10 @@ if (gamepadFound) {
'disableTelemetry', 'disableTelemetry',
], ],
getPref(Preferences.BLOCK_TRACKING) && ['disableTelemetryProvider'],
['disableStreamGate'], ['disableStreamGate'],
['broadcastPollingMode'],
getPref(Preferences.UI_LAYOUT) === 'tv' && ['tvLayout'], getPref(Preferences.UI_LAYOUT) === 'tv' && ['tvLayout'],
BX_FLAGS.EnableXcloudLogging && [ BX_FLAGS.EnableXcloudLogging && [
@ -8331,6 +8371,10 @@ if (gamepadFound) {
getPref(Preferences.BLOCK_TRACKING) && [ getPref(Preferences.BLOCK_TRACKING) && [
'blockWebRtcStatsCollector', 'blockWebRtcStatsCollector',
'disableIndexDbLogging', 'disableIndexDbLogging',
],
getPref(Preferences.BLOCK_TRACKING) && [
'disableTelemetryProvider',
'disableTrackEvent', 'disableTrackEvent',
], ],
@ -8340,9 +8384,10 @@ if (gamepadFound) {
[ [
'overrideSettings', 'overrideSettings',
ENABLE_NATIVE_MKB_BETA && 'mkbIsMouseAndKeyboardTitle', ENABLE_NATIVE_MKB_BETA && 'mkbIsMouseAndKeyboardTitle',
HAS_TOUCH_SUPPORT && 'patchUpdateInputConfigurationAsync',
], ],
getPref(Preferences.REMOTE_PLAY_ENABLED) && HAS_TOUCH_SUPPORT && ['patchUpdateInputConfigurationAsync'],
getPref(Preferences.GAME_FORTNITE_FORCE_CONSOLE) && ['forceFortniteConsole'], getPref(Preferences.GAME_FORTNITE_FORCE_CONSOLE) && ['forceFortniteConsole'],
]; ];
@ -8744,8 +8789,11 @@ a.bx-button.bx-full-width {
text-transform: uppercase; text-transform: uppercase;
} }
.bx-header-settings-button[data-update-available]::after { .bx-header-settings-button[data-update-available]::before {
content: ' 🌟'; content: '🌟' !important;
line-height: var(--bx-button-height);
display: inline-block;
margin-left: 4px;
} }
.bx-button.bx-focusable, .bx-header-settings-button { .bx-button.bx-focusable, .bx-header-settings-button {
@ -9320,24 +9368,6 @@ div[class*=StreamMenu-module__menuContainer] > div[class*=Menu-module] {
overflow: hidden; overflow: hidden;
} }
.bx-quick-settings-bar:not([data-clarity-boost="true"]) .bx-clarity-boost-warning {
display: none;
}
.bx-quick-settings-bar[data-clarity-boost="true"] .bx-clarity-boost-warning {
display: block;
margin: 0px 8px;
padding: 12px;
font-size: 16px;
font-weight: normal;
background: #282828;
border-radius: 4px;
}
.bx-quick-settings-bar[data-clarity-boost="true"] div[data-type="video"] {
display: none;
}
.bx-quick-settings-tab-contents *:focus { .bx-quick-settings-tab-contents *:focus {
outline: none !important; outline: none !important;
} }
@ -9672,7 +9702,7 @@ div[class*=StreamMenu-module__menuContainer] > div[class*=Menu-module] {
} }
#bx-touch-controller-bar[data-showing=true] { #bx-touch-controller-bar[data-showing=true] {
display: block !important; display: block;
} }
.bx-wait-time-box { .bx-wait-time-box {
@ -10331,7 +10361,7 @@ function interceptHttpRequests() {
return NATIVE_FETCH(...arg); return NATIVE_FETCH(...arg);
} }
if (IS_REMOTE_PLAYING && url.includes('/titles')) { if (IS_REMOTE_PLAYING && url.endsWith('/titles')) {
const clone = request.clone(); const clone = request.clone();
const headers = {}; const headers = {};
@ -11246,9 +11276,6 @@ function injectStreamMenuButtons() {
hideGripHandle(); hideGripHandle();
e.preventDefault(); e.preventDefault();
const msVideoProcessing = $STREAM_VIDEO.msVideoProcessing;
$quickBar.setAttribute('data-clarity-boost', (msVideoProcessing && msVideoProcessing !== 'default'));
// Show Quick settings bar // Show Quick settings bar
$quickBar.classList.remove('bx-gone'); $quickBar.classList.remove('bx-gone');
@ -11449,7 +11476,6 @@ function setupQuickSettingsBar() {
group: 'video', group: 'video',
label: t('video'), label: t('video'),
help_url: 'https://better-xcloud.github.io/ingame-features/#video', help_url: 'https://better-xcloud.github.io/ingame-features/#video',
note: CE('div', {'class': 'bx-quick-settings-bar-note bx-clarity-boost-warning'}, `⚠️ ${t('clarity-boost-warning')}`),
items: [ items: [
{ {
pref: Preferences.VIDEO_RATIO, pref: Preferences.VIDEO_RATIO,