JavaScript 在 YouTube 上选择视频质量



我正在尝试在iOS上设置Siri快捷方式,以使AirPlay将YouTube视频轻松播放到Apple TV。作为该过程的一部分,我想选择视频的质量(大概是使用 Javascript(,但我在实现时遇到了麻烦。这是我到目前为止所拥有的(在桌面/非iOS设备上查看的imgur链接(。它成功地使用JavaScript暂停视频,将其倒回开头,因为YouTube会自动播放,然后通过AirPlay连接到Apple TV,等待电视打开,然后单击视频将其取消静音。但是,我尝试设置视频质量的所有方法都没有奏效,我在这里撕扯头发。有人知道这是否可能吗?是可以设置的视频参数吗?或者我可以使用JavaScript单击设置按钮并选择质量?我的Javascript非常弱,所以任何帮助我指出正确的方向将不胜感激。

这是我到目前为止的Javascript:

ytplayer = document.querySelector('video');
ytplayer.pause();
ytplayer.currentTime = 0;
ytplayer.click();
ytplayer.play();
completion();

我不确定 Apple TV 的 Siri 快捷方式是如何工作的,所以这可能不适用,但如果它的布局与计算机浏览器类似,则此代码适用于我单击设置按钮并在网络浏览器中选择分辨率

let sleep = ms => new Promise(r => setTimeout(r, ms));
async function waitForVideo(){    
let video = document.querySelector('video');
while(!video){
console.log('waiting for video');
await sleep(200);
video = document.querySelector('video');
}
};
/**
* Sets the quality
* options are: "Highest" and the options available in the menu ("720p", "480p", etc.) 
*/
async function setQuality(quality){    
await waitForVideo();
await sleep(1000); 
let settingsButton = document.getElementsByClassName("ytp-settings-button")[0];
settingsButton.click();
await sleep(500);
let qualityMenu = document.getElementsByClassName("ytp-panel-menu")[0].lastChild;
qualityMenu.click();
await sleep(500);
let qualityOptions = [...document.getElementsByClassName("ytp-menuitem")];
let selection;
if (quality == 'Highest') selection = qualityOptions[0];
else selection = qualityOptions.filter(el => el.innerText == quality)[0];
if (!selection) {
let qualityTexts = qualityOptions.map(el => el.innerText).join('n');
console.log('"' + quality + '" not found. Options are: nnHighestn' + qualityTexts);
settingsButton.click();                               // click menu button to close
return;
}
if (selection.attributes['aria-checked'] === undefined) { // not checked
selection.click();                                   
} else settingsButton.click();                            // click menu button to close
};
setQuality('Highest');   

您将需要使用木偶师:

这是一个您可以使用的示例:

'

const puppeteer = require('puppeteer')

async function start() {
const site1 = "https://ampdemo.azureedge.net/azuremediaplayer.html?url=%2F%2Famssamples.streaming.mediaservices.windows.net%2F49b57c87-f5f3-48b3-ba22-c55cfdffa9cb%2FSintel.ism%2Fmanifest&muted=true&aes=true"
const tabs_no = 4
const time_interval = 30 * 1000 // in ms, time between 2 consequetive tabs opening
const vid_length = 5 * 60 * 1000 // in ms
const path_chromium76 = '/usr/bin/chromium-browser'       // recent install,  v. 76.0.3809.100 (official Build) Built on Ubuntu, running on LinuxMint 18.1
const launch_args = {
headless:false, 
executablePath:path_chromium76,
devtools:false,
timeout: 0, 
}  
const selector1 = "#azuremediaplayer > div > div.vjs-control-bar > div.amp-controlbaricons-right > div.amp-quality-control.vjs-menu-button.vjs-menu-button-popup.vjs-control.vjs-button.outline-enabled-control.quality-4 > div > ul > li:nth-child(3)"
const selector2 = 'li[aria-label="816p-6Mbps"]'
const selector3 = "li[aria-label='816p-6Mbps']"
const selector4 = "li.vjs-menu-item.amp-menu-item[aria-label='816p-6Mbps']"
const selector5 = "li.vjs-menu-item.amp-menu-item"
const selector10 = 'li.vjs-menu-item.amp-menu-item'
const sel = selector3

const browser = await puppeteer.launch(launch_args)
// const version = await browser.version()                   //  chrome/77.0.3844.0 (shipped with puppeteer)

const incognito_context = await browser.createIncognitoBrowserContext()
for (i=0; i<tabs_no; i++) {
let page = await incognito_context.newPage()

await page.goto(site1)
await page.waitFor(3000)
page.evaluate((sel) => {
const el = document.querySelector(sel)
el.style.color = 'red' 
el.click()
//return el
}, sel)

// Wait before going to the next tab (i.e. for continuing with the for loop)
await page.waitFor(time_interval)

//------------WORKS
setTimeout( ()=> page.close(),vid_length)
//----------*/
if (i == tabs_no-1) {
setTimeout( ()=> browser.close(), vid_length+3000)
//setTimeout( ()=> incognito_context.close(), vid_length+3000)
}  

} // End of for loop for tabs

}

async function main() {
const browsers_no = 2
for (b=0; b<browsers_no; b++) {
setTimeout( start, 1000)
}  
}
main()'

最新更新