Несколько возможных решений, использующих WebExtensions API , все требуют фонового скрипта, который будет отправлять сообщения в ваш контент-скрипт.Измените ваш manifest.json
так, чтобы он включал:
"background": {
"scripts": ["background.js"]
}
Я назвал фоновый скрипт background.js
, который будет конфликтовать с тем, что у вас есть в данный момент - вы можете подумать опереименуйте ваш скрипт содержимого в что-то вроде contentscript.js
, чтобы вы не запутались.
В contentscript.js
у вас есть прослушиватель сообщений
browser.runtime.onMessage.addListener(message => {
if (message.videoChanged) {
// do stuff
}
});
Необходимое разрешение в manifest.json
"permissions": [
"tabs"
]
В background.js
browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (!changeInfo.url) {
// url didn't change
return;
}
const url = new URL(changeInfo.url);
if (!url.href.startsWith('https://www.youtube.com/watch?') ||
!url.searchParams.get('v')) {
// not a youtube video
return;
}
browser.tabs.sendMessage(tabId, {videoChanged: true});
});
Этот метод будет сообщать сценарий содержимого при первых посещениях во время навигации по сайту или автоматического воспроизведения.
Необходимое разрешение вmanifest.json
"permissions": [
"webNavigation"
]
В background.js
browser.webNavigation.onHistoryStateUpdated.addListener(history => {
const url = new URL(history.url);
if (!url.searchParams.get('v')) {
// not a video
return;
}
browser.tabs.sendMessage(history.tabId, {videoChanged: true});
},
{url: [{urlMatches: '^https://www.youtube.com/watch\?'}]}
);
Этот метод отправляет сценарий содержимого во время навигации по сайту или автоматического воспроизведения.
YouTube делает xmlhttrequest при изменении видео.Вы можете просмотреть запросы, открыв Инструменты разработчика (Ctrl + Shift + I), выбрав вкладку «Сеть», выберите XHR
, выполните фильтрацию по watch?
, а затем разрешите YT переключиться на следующее видео.Вы увидите, что для следующего видео возникают два запроса: один с параметром prefetch
в URL-адресе незадолго до его изменения, а другой - когда видео действительно изменяется без параметра prefetch
.
Необходимразрешения в manifest.json
"permissions": [
"https://www.youtube.com/watch?*",
"webRequest"
]
В background.js
browser.webRequest.onBeforeRequest.addListener(request => {
const url = new URL(request.url);
if (!url.searchParams.get('v') || url.searchParams.get('prefetch')) {
// not a video or it's prefetch
return;
}
browser.tabs.sendMessage(request.tabId, {videoChanged: true});
},
{urls: ['https://www.youtube.com/watch?*'], types: ['xmlhttprequest']}
);
onBeforeRequest
могут быть слишком быстрыми и отправлять сообщение в сценарий содержимого перед новым видеофактически закончил загрузку.В этом случае вы можете просто заменить его на onCompleted
.
. Этот метод выводит скрипт содержимого во время навигации по сайту или автоматического воспроизведения.