Имитировать клик на/изменить значение арии (netflix) слайдер программно
Я пытаюсь контролировать Netflix-плеер из расширения Google Chrome. Здесь изображение панели управления, для тех, кто не знаком с ней.
![Netflix player print]()
Мне удалось смоделировать щелчок по воспроизведению/паузе, следующий эпизод и переключить полноэкранные кнопки (с оранжевым квадратом), используя следующий код:
$(".[control class]").click();
Но та же логика, похоже, не применяется к слайдеру, который контролирует, в какой части видео, в котором вы находитесь (тот, что находится внутри синего прямоугольника).
Что я хочу сделать, это изменить текущую позицию видео (например, вернуться на 10 секунд). Вот что я пробовал до сих пор:
Изменить aria-valuenow на section role="slider"
:
$(".player-slider")["aria-valuenow"] = 0;
Получить красный круг, изменить его положение и нажать на него:
$(".player-scrubber-target")["style"] = "width: 30%";
$(".player-scrubber-target").click();
(Отчаянный) Измените ширину и/или щелкните по каждой строке внутри раздела:
.player-scrubber-progress-buffered (change width and click)
.player-scrubber-progress-completed (change width and click)
.player-scrubber-progress (click)
#scrubber-component (click)
@EDIT
Большое спасибо Kodos Johnson за то, что указали мне на этот вопрос и kb0 для исходного кода, с небольшим количеством исследований я могу изменить положение тома и игрока из консоли Chrome Developer Tools. Здесь код (измените [VOLUME] для желаемого объема 0 ~ 99 и [POSITION] для желаемой позиции):
// Change volume
netflix.cadmium.UiEvents.events.resize[0].scope.events.dragend[0].handler(null, {pointerEventData: {drag: {current: {value: [VOLUME]}}}});
// Change player position
netflix.cadmium.UiEvents.events.resize[1].scope.events.dragend[1].handler(null, {value: [POSITION], pointerEventData: {playing: false}});
К сожалению, это не работает вне Chrome Developer Tools. Когда я запускаю фрагменты из моего расширения, я получаю следующее:
Uncaught ReferenceError: netflix is not defined at <anonymous>:1:1
Вот как я запускаю script из моего расширения:
chrome.tabs.getSelected(null, function(tab){
chrome.tabs.executeScript(tab.id, {code: [SNIPPET]}, function(response) {});
});
Вопрос:
Как я могу изменить текущую позицию видео программно (или имитировать, что пользователь нажал на панель и изменил ее вручную) из расширения Chrome?
Ответы
Ответ 1
Хорошо, спасибо Kodos Johnson и Dehli за то, что поставили меня в правильном направлении и на kb0 для следующего фрагмента кода [...]
netflix.cadmium.UiEvents.events.resize[1].scope.events.dragend[1].handler(null, {value: 999, pointerEventData: {playing: false}});
[...] с небольшим количеством исследований мне удалось получить доступ как к элементу управления томом, так и положением видео и получить доступ к ним из консоли разработчика Chrome. Чтобы обойти тот факт, что мое расширение не имело доступа к netflix
var, я вставляю код на страницу <head>
.
Вот полный пример:
function ChangeVolume(volume)
{
InjectScriptOnPage("netflix.cadmium.UiEvents.events.resize[0].scope.events.dragend[0].handler(null, {pointerEventData: {drag: {current: {value: " + volume + "}}}});");
}
function ChangePosition(position)
{
InjectScriptOnPage("netflix.cadmium.UiEvents.events.resize[1].scope.events.dragend[1].handler(null, {value: " + position + ", pointerEventData: {playing: false}});");
}
function InjectScriptOnPage(script)
{
var script = "var head = document.getElementsByTagName('head')[0]; \
var script = document.createElement('script');\
script.type = 'text/javascript'; \
script.innerHTML = '" + script + "'; \
head.appendChild(script);";
ExecuteScriptOnPage(script);
}
function ExecuteScriptOnPage(script)
{
chrome.tabs.getSelected(null, function(tab){
chrome.tabs.executeScript(tab.id, {code: script}, function(response) {});
});
}
(Я подожду, пока в конце щедрости не отметим это как принятое, если кто-то поставит лучший ответ)