Source code for pyytlounge.dial
"""Helper functions for discovering YouTube Lounge through DIAL"""
from dataclasses import dataclass
from typing import Optional
from xml.etree import ElementTree
from aiohttp import ClientSession
[docs]
@dataclass
class DialResult:
"""YouTube screen obtained using DIAL"""
screen_name: str
screen_id: str
DEVICE_NAMESPACE = "urn:schemas-upnp-org:device-1-0"
SERVICE_NAMESPACE = "urn:dial-multiscreen-org:schemas:dial"
def _get_optional_element_text(element: Optional[ElementTree.Element], default: str):
if element:
return element.text or default
return default
[docs]
async def get_screen_id_from_dial(url: str) -> Optional[DialResult]:
"""Tries to get YouTube screen id from a DIAL endpoint"""
async with ClientSession() as session:
async with session.get(url) as response:
if response.status != 200:
return None
headers = response.headers
devices = ElementTree.fromstring(await response.text())
friendly_name = devices.find(".//device/friendlyName", {"": DEVICE_NAMESPACE})
app_url = headers["application-url"]
youtube_url = app_url + "YouTube"
async with session.get(youtube_url) as response:
if response.status != 200:
return None
service = ElementTree.fromstring(await response.text())
screen_id = service.find(".//additionalData/screenId", {"": SERVICE_NAMESPACE})
if screen_id is not None and screen_id.text is not None:
return DialResult(
screen_name=_get_optional_element_text(friendly_name, ""),
screen_id=screen_id.text,
)
return None