Skip to content

Commit 5870cbd

Browse files
committed
fix missing stream quality options
Fixes #452, #448
1 parent 8ad4926 commit 5870cbd

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

lib/screens/channel/video/video_store.dart

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -205,17 +205,30 @@ abstract class VideoStoreBase with Store {
205205
@action
206206
Future<void> updateStreamQualities() async {
207207
try {
208-
await videoWebViewController.runJavaScript('''
209-
_queuePromise(async () => {
210-
(await _asyncQuerySelector('[data-a-target="player-settings-button"]')).click();
211-
(await _asyncQuerySelector('[data-a-target="player-settings-menu-item-quality"]')).click();
212-
await _asyncQuerySelector('[data-a-target="player-settings-submenu-quality-option"] label div');
213-
const qualities = [...document.querySelectorAll('[data-a-target="player-settings-submenu-quality-option"] label div')].map((el) => el.textContent);
214-
StreamQualities.postMessage(JSON.stringify(qualities));
215-
(await _asyncQuerySelector('.tw-drop-down-menu-item-figure')).click();
216-
(await _asyncQuerySelector('[data-a-target="player-settings-menu"] [role="menuitem"] button')).click();
217-
});
218-
''');
208+
await videoWebViewController.runJavaScript(r'''
209+
_queuePromise(async () => {
210+
// Open the settings → quality submenu
211+
(await _asyncQuerySelector('[data-a-target="player-settings-button"]')).click();
212+
(await _asyncQuerySelector('[data-a-target="player-settings-menu-item-quality"]')).click();
213+
214+
// Wait until at least one quality option is rendered
215+
await _asyncQuerySelector(
216+
'[data-a-target="player-settings-menu"] input[name="player-settings-submenu-quality-option"] + label'
217+
);
218+
219+
// Grab every label, normalise whitespace, return as array
220+
const qualities = Array.from(
221+
document.querySelectorAll(
222+
'[data-a-target="player-settings-menu"] input[name="player-settings-submenu-quality-option"] + label'
223+
)
224+
).map(l => l.textContent.replace(/\s+/g, ' ').trim());
225+
226+
StreamQualities.postMessage(JSON.stringify(qualities));
227+
228+
// Close the settings panel again
229+
(await _asyncQuerySelector('[data-a-target="player-settings-button"]')).click();
230+
});
231+
''');
219232
} catch (e) {
220233
debugPrint(e.toString());
221234
}
@@ -238,8 +251,7 @@ abstract class VideoStoreBase with Store {
238251
(await _asyncQuerySelector('[data-a-target="player-settings-menu-item-quality"]')).click();
239252
await _asyncQuerySelector('[data-a-target="player-settings-submenu-quality-option"] input');
240253
[...document.querySelectorAll('[data-a-target="player-settings-submenu-quality-option"] input')][$newStreamQualityIndex].click();
241-
(await _asyncQuerySelector('.tw-drop-down-menu-item-figure')).click();
242-
(await _asyncQuerySelector('[data-a-target="player-settings-menu"] [role="menuitem"] button')).click();
254+
(await _asyncQuerySelector('[data-a-target="player-settings-button"]')).click();
243255
});
244256
''');
245257
_streamQualityIndex = newStreamQualityIndex;
@@ -305,6 +317,7 @@ abstract class VideoStoreBase with Store {
305317
(await _asyncQuerySelector('[data-a-target="player-settings-menu-item-advanced"]')).click();
306318
(await _asyncQuerySelector('[data-a-target="player-settings-submenu-advanced-video-stats"] input')).click();
307319
(await _asyncQuerySelector('[data-a-target="player-overlay-video-stats"]')).style.display = "none";
320+
(await _asyncQuerySelector('[data-a-target="player-settings-button"]')).click();
308321
const observer = new MutationObserver((changes) => {
309322
Latency.postMessage(changes[0].target.textContent);
310323
})

0 commit comments

Comments
 (0)