Start decoder TV channels with one click in Jellyfin Web
This commit is contained in:
+9
-2
@@ -12,7 +12,7 @@ n='decoder-browser-check-'+secrets.token_hex(4);p=secrets.token_urlsafe(24);u=ap
|
||||
const user=JSON.parse(ssh(setup));let browser;
|
||||
try{
|
||||
browser=await chromium.launch({headless:true,channel:'msedge'});const page=await browser.newPage({viewport:{width:1280,height:900}});
|
||||
const errors=[];page.on('pageerror',e=>errors.push(e.message));
|
||||
const errors=[];page.on('console',m=>{if(m.type()==='error'&&m.text().includes('Decoder'))console.log(m.text());});page.on('pageerror',e=>errors.push(e.message));
|
||||
const base='http://192.168.100.191:8096/web/index.html';
|
||||
await page.goto(base);await page.locator('#txtManualName').fill(user.name);await page.locator('#txtManualPassword').fill(user.password);await page.getByRole('checkbox').check();await page.getByRole('button',{name:'Sign In',exact:true}).click();
|
||||
await page.waitForURL(/home/,{timeout:20000});
|
||||
@@ -28,8 +28,15 @@ n='decoder-browser-check-'+secrets.token_hex(4);p=secrets.token_urlsafe(24);u=ap
|
||||
await page.locator('#channelView').selectOption('all');await page.getByRole('button',{name:'Ustaw ten widok jako domyślny'}).click();
|
||||
await page.locator('#channelView').selectOption('guide');await page.locator('#channelRows section div p').first().waitFor({timeout:60000});
|
||||
await page.screenshot({path:process.argv[2]||'decoder-channels.png'});
|
||||
await page.locator('#channelView').selectOption('all');
|
||||
const row=page.locator('#channelRows section').filter({has:page.getByRole('button',{name:/^\d+\. TVP INFO HD$/})});
|
||||
const playback=page.waitForResponse(r=>r.url().includes('/PlaybackInfo')&&r.request().method()==='POST',{timeout:60000});
|
||||
await row.locator('button').first().click();
|
||||
const response=await playback;if(!response.ok())throw Error('Native playback request failed: '+response.status());
|
||||
await page.waitForFunction(()=>[...document.querySelectorAll('video')].some(v=>v.currentTime>0&&v.readyState>=2),{},{timeout:60000});
|
||||
await page.screenshot({path:(process.argv[2]||'decoder-channels.png').replace('.png','-playing.png')});
|
||||
if(errors.length)throw Error(errors.join('; '));
|
||||
console.log(JSON.stringify({channel_rows:total,favorites:'PASS',hidden:'PASS',user_page:'PASS',browser_errors:errors}));
|
||||
console.log(JSON.stringify({channel_rows:total,favorites:'PASS',hidden:'PASS',user_page:'PASS',one_click_live_playback:'PASS',browser_errors:errors}));
|
||||
}finally{
|
||||
if(browser)await browser.close();
|
||||
ssh(`import sqlite3,urllib.request,pathlib\nc=sqlite3.connect('file:/var/lib/jellyfin/data/jellyfin.db?mode=ro',uri=True);k=c.execute('SELECT AccessToken FROM ApiKeys ORDER BY Id LIMIT 1').fetchone()[0];c.close()\nurllib.request.urlopen(urllib.request.Request('http://127.0.0.1:8096/Users/${user.id}',headers={'Authorization':'MediaBrowser Token="'+k+'", Client="DecoderIntegration", Device="Maintenance", DeviceId="decoder-maintenance", Version="7"'},method='DELETE')).read()\npathlib.Path('/var/lib/jellyfin/decoder-integration/users/${user.id.replace(/-/g,'')}.json').unlink(missing_ok=True)\nprint('clean')`);
|
||||
|
||||
Reference in New Issue
Block a user