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==
// @name Better xCloud
// @namespace https://github.com/redphx
// @version 3.5.2
// @version 3.5.3
// ==/UserScript==

View File

@ -1,7 +1,7 @@
// ==UserScript==
// @name Better xCloud
// @namespace https://github.com/redphx
// @version 3.5.2
// @version 3.5.3
// @description Improve Xbox Cloud Gaming (xCloud) experience
// @author redphx
// @license MIT
@ -14,17 +14,62 @@
// ==/UserScript==
'use strict';
/* ADDITIONAL CODE */
const SCRIPT_VERSION = '3.5.2';
const SCRIPT_VERSION = '3.5.3';
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
const DEFAULT_FLAGS = {
CheckForUpdate: true,
PreloadRemotePlay: true,
PreloadUi: false,
EnableXcloudLogging: false,
SafariWorkaround: true,
UseDevTouchLayout: false,
}
@ -32,8 +77,6 @@ const DEFAULT_FLAGS = {
const BX_FLAGS = Object.assign(DEFAULT_FLAGS, window.BX_FLAGS || {});
delete window.BX_FLAGS;
const AppInterface = window.AppInterface;
let REMOTE_PLAY_SERVER;
const ENABLE_NATIVE_MKB_BETA = false;
@ -67,45 +110,6 @@ if (window.location.pathname.includes('/auth/msa')) {
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
function createElement(elmName, props = {}) {
@ -672,7 +676,7 @@ const Translations = {
"Audio- und Video-Streams kombinieren",
"Gabung audio & video stream",
"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",
"Mungkin memperbaiki masalah lag pada audio",
"May fix the laggy audio problem",
,
"Puede arreglar el problema de audio con retraso",
,
,
"音声の遅延を改善できる可能性があります",
@ -1267,7 +1271,7 @@ const Translations = {
"Experimentell",
"Eksperimental",
"Experimental",
,
"Experimental",
,
,
"実験的機能",
@ -1403,7 +1407,7 @@ const Translations = {
"Scrollbalken der Webseite ausblenden",
"Sembunyikan bilah gulir halaman",
"Hide web page's scrollbar",
,
"Oculta la barra de desplazamiento de la página",
,
,
"Webページのスクロールバーを隠す",
@ -1471,7 +1475,7 @@ const Translations = {
"\"Better xCloud\" App für Android installieren",
"Pasang aplikasi Better xCloud untuk Android",
"Install Better xCloud app for Android",
,
"Instale la aplicación Better xCloud para Android",
,
,
"Android用のBetter xCloudをインストール",
@ -2355,7 +2359,7 @@ const Translations = {
"Videofilter auf Screenshots anwenden",
"Terapkan filter video pada screenshot",
"Applies video filters to screenshots",
,
"Aplica filtros de vídeo a las capturas de pantalla",
,
,
"スクリーンショットにビデオフィルターを適用",
@ -3273,7 +3277,7 @@ const Translations = {
"Vibration",
"Getaran",
"Vibration",
,
"Vibración",
,
,
"振動",
@ -3428,8 +3432,7 @@ let LOCALE = Translations.getLocale();
const t = Translations.get;
const ENABLE_SAFARI_WORKAROUND = true;
if (ENABLE_SAFARI_WORKAROUND && document.readyState !== 'loading') {
if (BX_FLAGS.SafariWorkaround && document.readyState !== 'loading') {
// Stop loading
window.stop();
@ -3487,7 +3490,48 @@ var GAME_XBOX_TITLE_ID;
var GAME_PRODUCT_ID;
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 REMOTE_PLAY_CONFIG;
@ -3664,6 +3708,7 @@ class RemotePlay {
RemotePlay.#getConsolesList(() => {
console.log(RemotePlay.#CONSOLES);
RemotePlay.#renderConsoles();
BxEvent.dispatch(window, BxEvent.REMOTE_PLAY_READY);
});
});
}
@ -3855,19 +3900,7 @@ class RemotePlay {
};
window.BX_REMOTE_PLAY_CONFIG = REMOTE_PLAY_CONFIG;
const url = window.location.href.substring(0, 31) + '/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();
localRedirect('/launch/fortnite/BT5P2X999VH2#remote-play');
RemotePlay.detachPopup();
}
@ -7110,13 +7143,7 @@ class UserAgent {
const profile = getPref(Preferences.USER_AGENT_PROFILE);
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) {
@ -8307,6 +8334,19 @@ if (gamepadFound) {
}
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 = [
@ -8315,10 +8355,10 @@ if (gamepadFound) {
'disableTelemetry',
],
getPref(Preferences.BLOCK_TRACKING) && ['disableTelemetryProvider'],
['disableStreamGate'],
['broadcastPollingMode'],
getPref(Preferences.UI_LAYOUT) === 'tv' && ['tvLayout'],
BX_FLAGS.EnableXcloudLogging && [
@ -8331,6 +8371,10 @@ if (gamepadFound) {
getPref(Preferences.BLOCK_TRACKING) && [
'blockWebRtcStatsCollector',
'disableIndexDbLogging',
],
getPref(Preferences.BLOCK_TRACKING) && [
'disableTelemetryProvider',
'disableTrackEvent',
],
@ -8340,9 +8384,10 @@ if (gamepadFound) {
[
'overrideSettings',
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'],
];
@ -8744,8 +8789,11 @@ a.bx-button.bx-full-width {
text-transform: uppercase;
}
.bx-header-settings-button[data-update-available]::after {
content: ' 🌟';
.bx-header-settings-button[data-update-available]::before {
content: '🌟' !important;
line-height: var(--bx-button-height);
display: inline-block;
margin-left: 4px;
}
.bx-button.bx-focusable, .bx-header-settings-button {
@ -9320,24 +9368,6 @@ div[class*=StreamMenu-module__menuContainer] > div[class*=Menu-module] {
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 {
outline: none !important;
}
@ -9672,7 +9702,7 @@ div[class*=StreamMenu-module__menuContainer] > div[class*=Menu-module] {
}
#bx-touch-controller-bar[data-showing=true] {
display: block !important;
display: block;
}
.bx-wait-time-box {
@ -10331,7 +10361,7 @@ function interceptHttpRequests() {
return NATIVE_FETCH(...arg);
}
if (IS_REMOTE_PLAYING && url.includes('/titles')) {
if (IS_REMOTE_PLAYING && url.endsWith('/titles')) {
const clone = request.clone();
const headers = {};
@ -11246,9 +11276,6 @@ function injectStreamMenuButtons() {
hideGripHandle();
e.preventDefault();
const msVideoProcessing = $STREAM_VIDEO.msVideoProcessing;
$quickBar.setAttribute('data-clarity-boost', (msVideoProcessing && msVideoProcessing !== 'default'));
// Show Quick settings bar
$quickBar.classList.remove('bx-gone');
@ -11449,7 +11476,6 @@ function setupQuickSettingsBar() {
group: 'video',
label: t('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: [
{
pref: Preferences.VIDEO_RATIO,