import aiohttp import html.parser import asyncio import urllib.parse class TitleExtractor(html.parser.HTMLParser): def __init__(self): super().__init__() self.current_data = None self.latest_title = None def handle_data(self, data): self.current_data = data def handle_endtag(self, tag): if tag == "title": self.latest_title = self.current_data async def get_preview(url): url = url.replace("youtube.com/shorts/", "youtube.com/watch?v=") url_parsed = urllib.parse.urlparse(url) url_no_fragment = url_parsed._replace(fragment="").geturl() session = aiohttp.ClientSession() session.headers["user-agent"] = "Mozilla/5.0 XmppPreviewer/1.0" resp = await session.get(url_no_fragment) title = None print(url_no_fragment, resp.status) if resp.headers["content-type"].startswith("text/html"): parser = TitleExtractor() while chunk := await resp.content.read(4096): parser.feed(chunk.decode("utf-8")) # assume utf-8 if parser.latest_title: title = parser.latest_title break resp.close() await session.close() return title if __name__ == "__main__": async def main(): print(await get_preview("https://youtu.be/WNFahAioGP8")) asyncio.run(main())