@@ -205,17 +205,30 @@ abstract class VideoStoreBase with Store {
205
205
@action
206
206
Future <void > updateStreamQualities () async {
207
207
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
+ ''' );
219
232
} catch (e) {
220
233
debugPrint (e.toString ());
221
234
}
@@ -238,8 +251,7 @@ abstract class VideoStoreBase with Store {
238
251
(await _asyncQuerySelector('[data-a-target="player-settings-menu-item-quality"]')).click();
239
252
await _asyncQuerySelector('[data-a-target="player-settings-submenu-quality-option"] input');
240
253
[...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();
243
255
});
244
256
''' );
245
257
_streamQualityIndex = newStreamQualityIndex;
@@ -305,6 +317,7 @@ abstract class VideoStoreBase with Store {
305
317
(await _asyncQuerySelector('[data-a-target="player-settings-menu-item-advanced"]')).click();
306
318
(await _asyncQuerySelector('[data-a-target="player-settings-submenu-advanced-video-stats"] input')).click();
307
319
(await _asyncQuerySelector('[data-a-target="player-overlay-video-stats"]')).style.display = "none";
320
+ (await _asyncQuerySelector('[data-a-target="player-settings-button"]')).click();
308
321
const observer = new MutationObserver((changes) => {
309
322
Latency.postMessage(changes[0].target.textContent);
310
323
})
0 commit comments