I am trying to build a Chrome Extension that can interact with videos in YouTube.
I can get the player element and use the Youtube's IFrame API functions on them in my browser console without no issue, like:
var player = document.getElementById('movie_player');player.playVideo()player.pauseVideo()player.seekTo(30)player.getStatsForNerds(0)But I want to do these kinds of operation through a Chrome Extension. The issue is when I try to use the player element to use these functions in an extension it returns errors like this:
Uncaught TypeError: player.playVideo is not a function
I thought I may need to load the IFrame API, but when I try to load it it returns:
Refused to load the script 'https://www.youtube.com/iframe_api' because it violates the following Content Security Policy directive: "script-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.
My project directory:
├── manifest.json├── content-scripts.js└── background.jsmanifest.json:
{"name": "My Project","description": "Some Description","version": "1.0","manifest_version": 3,"background": {"service_worker": "background.js" },"content_scripts": [ {"matches": ["https://www.youtube.com/*"],"exclude_matches": ["https://studio.youtube.com/*"],"js": ["content-scripts.js"] } ],"web_accessible_resources": [ {"resources": ["content-scripts.js"],"matches": ["https://www.youtube.com/*"] } ],"permissions": ["activeTab","tabs","contextMenus","storage","scripting" ],"host_permissions": ["https://www.youtube.com/*"]}content-scripts.js:
function inject_yt() { player = document.getElementById('movie_player'); var speeds = new Array(); var resolutions = new Array(); var times = new Array(); var buffer = new Array(); stats_collect = setInterval(stats, 1000);}function stats() { try { bandwidth = player.getStatsForNerds(0).bandwidth_kbps; res = player.getStatsForNerds(0).resolution; buffers = player.getStatsForNerds(0).buffer_health_seconds; speeds.push(bandwidth); resolutions.push(res); buffer.push(buffers); currentTime = player.getCurrentTime(); times.push(currentTime); } catch(err) { console.error(err); }}var tag = document.createElement('script');tag.src = 'https://www.youtube.com/iframe_api';var firstScriptTag = document.getElementsByTagName('script')[0];firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);function onYouTubeIframeAPIReady() { console.log('--- the YT player API is ready from content script! ---');};inject_yt()And background.js is just an empty file.
How can I make this work?