From 00000d9822f7227ea782824ecb62d8560736bb59 Mon Sep 17 00:00:00 2001 From: doms9 <96013514+doms9@users.noreply.github.com> Date: Wed, 27 Aug 2025 10:26:56 -0400 Subject: [PATCH] e --- EPG/fetch.py | 26 +++++--- M3U8/fetch.py | 38 +++++------- M3U8/scrape/fstv.py | 76 +++++++++++++---------- M3U8/scrape/tvpass.py | 22 +++---- pyproject.toml | 3 +- uv.lock | 140 +++++++++++------------------------------- 6 files changed, 125 insertions(+), 180 deletions(-) diff --git a/EPG/fetch.py b/EPG/fetch.py index 6dbd64b..b626ab8 100644 --- a/EPG/fetch.py +++ b/EPG/fetch.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import asyncio import gzip from pathlib import Path from xml.etree import ElementTree as ET @@ -6,6 +7,7 @@ from xml.etree import ElementTree as ET import httpx epg_file = Path(__file__).parent / "TV.xml" + epg_urls = [ "https://epgshare01.online/epgshare01/epg_ripper_US1.xml.gz", "https://epgshare01.online/epgshare01/epg_ripper_US_LOCALS2.xml.gz", @@ -13,7 +15,7 @@ epg_urls = [ "https://epgshare01.online/epgshare01/epg_ripper_CA1.xml.gz", ] -client = httpx.Client( +client = httpx.AsyncClient( timeout=5, follow_redirects=True, headers={ @@ -22,9 +24,9 @@ client = httpx.Client( ) -def fetch_tvg_ids() -> dict[str, str]: +async def fetch_tvg_ids() -> dict[str, str]: try: - r = client.get("https://s.id/4dqiO") + r = await client.get("https://s.id/4dqiO") r.raise_for_status() except Exception as e: raise SystemExit(f"Failed to fetch TVG IDs\n{e}") from e @@ -32,9 +34,9 @@ def fetch_tvg_ids() -> dict[str, str]: return r.json() -def fetch_xml(url: str) -> ET.Element: +async def fetch_xml(url: str) -> ET.Element: try: - r = client.get(url) + r = await client.get(url) r.raise_for_status() except Exception as e: raise SystemExit(f'Failed to fetch "{url}"\n{e}') from e @@ -48,13 +50,17 @@ def fetch_xml(url: str) -> ET.Element: raise SystemExit(f'Failed to decompress and parse XML from "{url}"\n{e}') from e -def main() -> None: - tvg_ids = fetch_tvg_ids() +async def main() -> None: + tvg_ids = await fetch_tvg_ids() root = ET.Element("tv") - for url in epg_urls: - epg_data = fetch_xml(url) + tasks = [fetch_xml(url) for url in epg_urls] + results = await asyncio.gather(*tasks) + + for epg_data in results: + if epg_data is None: + continue for channel in epg_data.findall("channel"): if (channel_id := channel.get("id")) in tvg_ids: @@ -87,4 +93,4 @@ def main() -> None: if __name__ == "__main__": - main() + asyncio.run(main()) diff --git a/M3U8/fetch.py b/M3U8/fetch.py index 43b4d0e..ba5b8b5 100644 --- a/M3U8/fetch.py +++ b/M3U8/fetch.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import asyncio from pathlib import Path import httpx @@ -8,7 +9,7 @@ m3u8_file = Path(__file__).parent / "TV.m3u8" base_url = "https://s.id/ePwXT" -client = httpx.Client( +client = httpx.AsyncClient( timeout=5, follow_redirects=True, headers={ @@ -17,49 +18,44 @@ client = httpx.Client( ) -def vanilla_fetch() -> tuple[list[str], int]: +async def vanilla_fetch() -> tuple[list[str], int]: print("Fetching base M3U8") try: - r = client.get(base_url) + r = await client.get(base_url) r.raise_for_status() except Exception as e: raise SystemExit(f'Failed to fetch "{base_url}"\n{e}') from e - d = r.text.splitlines() - - d.pop(0) + d = r.text.splitlines()[1:] last_chnl_number = int(r.text.split("tvg-chno=")[-1].split('"')[1]) return d, last_chnl_number -def main() -> None: - tvpass.main(client) +async def main() -> None: + await tvpass.main(client) - fstv.main(client) + await fstv.main(client) - base_m3u8, chnl_number = vanilla_fetch() + base_m3u8, chnl_number = await vanilla_fetch() additions = tvpass.urls | fstv.urls - lines = [] - - for event, url in sorted(additions.items()): - chnl_number += 1 - lines.append( - f'#EXTINF:-1 tvg-chno="{chnl_number}"' - f' tvg-id="(N/A)" tvg-name="{event}"' - ' tvg-logo="https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png"' - f' group-title="Live Events",{event}\n{url}\n' + lines = [ + f'#EXTINF:-1 tvg-chno="{chnl_number}" tvg-id="(N/A)" tvg-name="{event}" tvg-logo="https://i.gyazo.com/ec27417a9644ae517196494afa72d2b9.png" group-title="Live Events",{event}\n{url}' + for chnl_number, (event, url) in enumerate( + sorted(additions.items()), + start=chnl_number + 1, ) + ] m3u8_file.write_text( '#EXTM3U url-tvg="https://raw.githubusercontent.com/doms9/iptv/refs/heads/default/EPG/TV.xml"\n' + "\n".join(base_m3u8) + "\n" - + "".join(lines) + + "\n".join(lines) + "\n", encoding="utf-8", ) @@ -68,4 +64,4 @@ def main() -> None: if __name__ == "__main__": - main() + asyncio.run(main()) diff --git a/M3U8/scrape/fstv.py b/M3U8/scrape/fstv.py index e54fb8c..ea988b8 100644 --- a/M3U8/scrape/fstv.py +++ b/M3U8/scrape/fstv.py @@ -1,21 +1,22 @@ +import asyncio from urllib.parse import urljoin import httpx -from bs4 import BeautifulSoup +from selectolax.parser import HTMLParser urls: dict[str, str] = {} -mirrors = { +mirrors = [ "https://fstv.online", "https://fstv.space", "https://fstv.zip", "https://fstv.us", -} +] -def check_status(client: httpx.Client, url: str) -> bool: +async def check_status(client: httpx.AsyncClient, url: str) -> bool: try: - r = client.get(url) + r = await client.get(url) r.raise_for_status() except Exception: return False @@ -23,81 +24,90 @@ def check_status(client: httpx.Client, url: str) -> bool: return r.status_code == 200 -def get_base(client: httpx.Client) -> str: - for url in filter(lambda x: check_status(client, x), mirrors): - return url +async def get_base(client: httpx.AsyncClient) -> str: + tasks = [check_status(client, link) for link in mirrors] + results = await asyncio.gather(*tasks) + + return [url for url, ok in zip(mirrors, results) if ok][0] -def get_hrefs(client: httpx.Client, base_url: str) -> list[tuple[str, str]]: +async def get_hrefs(client: httpx.AsyncClient, base_url: str) -> list[tuple[str, str]]: print(f'Scraping from "{base_url}"') try: - r = client.get(base_url) + r = await client.get(base_url) r.raise_for_status() except Exception as e: print(f'Failed to fetch "{base_url}"\n{e}') return [] - soup = BeautifulSoup(r.text, "lxml") + soup = HTMLParser(r.text) events = {} - for wrpr in soup.find_all("div", class_="fixtures-live-wrapper"): - for games in wrpr.select(".match-table-item"): + for wrpr in soup.css("div.fixtures-live-wrapper"): + for games in wrpr.css(".match-table-item"): - league_name = games.select_one(".league-info a.league-name") + league_name = games.css_first(".league-info a.league-name") - league_match = games.select_one(".common-table-row a[href*='/match/']") + league_match = games.css_first(".common-table-row a[href*='/match/']") if league_name and league_match: - full_text = league_name.get_text(strip=True) + full_text = league_name.text(strip=True) if "]" in full_text: event_name = full_text.split("]", 1)[1].strip() else: event_name = full_text - events[event_name] = urljoin(base_url, league_match["href"]) + events[event_name] = urljoin( + base_url, league_match.attributes.get("href") + ) return events.items() -def fetch_m3u8(client: httpx.Client, url: str) -> tuple[str, list[str]]: +async def fetch_m3u8(client: httpx.AsyncClient, url: str) -> tuple[str, list[str]]: try: - r = client.get(url) + r = await client.get(url) r.raise_for_status() except Exception as e: print(f'Failed to fetch "{url}"\n{e}') return [] - soup = BeautifulSoup(r.text, "lxml") + soup = HTMLParser(r.text) - if category_links := soup.select(".common-list-category .category-item a"): - match_name = category_links[-1].get_text(strip=True) + if category_links := soup.css(".common-list-category .category-item a"): + match_name = category_links[-1].text(strip=True) else: match_name = None if not match_name or match_name.lower() == "vs": - if og_title := soup.find("meta", property="og:title"): - match_name = og_title["content"].split(" start on")[0].strip() + if og_title := soup.css_first("meta[property='og:title']"): + match_name = ( + og_title.attributes.get("content", "").split(" start on")[0].strip() + ) - btns = soup.select("button.btn-server") + btns = soup.css("button.btn-server") - return match_name, [btn["data-link"] for btn in btns if btn.has_attr("data-link")] + return match_name, [ + btn.attributes.get("data-link") for btn in btns if "data-link" in btn.attributes + ] -def main(client: httpx.Client) -> None: - base_url = get_base(client) +async def main(client: httpx.AsyncClient) -> None: + if not (base_url := await get_base(client)): + print("No working FSTV mirrors") + return - for event, href in get_hrefs(client, base_url): + events = await get_hrefs(client, base_url) - if not href: - continue - - match_name, m3u8_urls = fetch_m3u8(client, href) + tasks = [fetch_m3u8(client, href) for _, href in events if href] + results = await asyncio.gather(*tasks) + for (event, _), (match_name, m3u8_urls) in zip(events, results): if not m3u8_urls: continue diff --git a/M3U8/scrape/tvpass.py b/M3U8/scrape/tvpass.py index bf22c3e..2008d49 100644 --- a/M3U8/scrape/tvpass.py +++ b/M3U8/scrape/tvpass.py @@ -43,9 +43,9 @@ def save_cache(urls: dict[str, str]) -> None: base_file.write_text(json.dumps(payload, indent=2), encoding="utf-8") -def fetch_m3u8(client: httpx.Client) -> list[str] | None: +async def fetch_m3u8(client: httpx.AsyncClient) -> list[str] | None: try: - r = client.get(base_url) + r = await client.get(base_url) r.raise_for_status() except Exception as e: print(f'Failed to fetch "{base_url}"\n{e}') @@ -53,7 +53,7 @@ def fetch_m3u8(client: httpx.Client) -> list[str] | None: return r.text.splitlines() -def main(client: httpx.Client) -> None: +async def main(client: httpx.AsyncClient) -> None: if cached := load_cache(): urls.update(cached) print(f"TVPass: Collected {len(urls)} live events from cache") @@ -61,24 +61,24 @@ def main(client: httpx.Client) -> None: print(f'Scraping from "{base_url}"') - if not (data := fetch_m3u8(client)): + if not (data := await fetch_m3u8(client)): return - for i in range(len(data) - 1): - if data[i].startswith("#EXTINF"): - tvg_id_match = re.search(r'tvg-id="([^"]*)"', data[i]) - tvg_name_match = re.search(r'tvg-name="([^"]*)"', data[i]) + for i, line in enumerate(data[:-1]): + if line.startswith("#EXTINF"): + tvg_id_match = re.search(r'tvg-id="([^"]*)"', line) + tvg_name_match = re.search(r'tvg-name="([^"]*)"', line) tvg_id = tvg_id_match[1] if tvg_id_match else None - tvg_name = tvg_name_match[1] + tvg_name = tvg_name_match[1] if tvg_name_match else None if tvg_id == "": url = data[i + 1] - tvg_name = tvg_name.split("(")[0].strip() + if tvg_name: + tvg_name = tvg_name.split("(")[0].strip() if url.endswith("/sd"): - path_parts = urlparse(url).path.strip("/").split("/") if len(path_parts) >= 2 and path_parts[-1] == "sd": diff --git a/pyproject.toml b/pyproject.toml index d4b6433..9b26db9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,8 +3,7 @@ name = "iptv" version = "0.0.2" requires-python = ">=3.10" dependencies = [ - "beautifulsoup4>=4.13.4", "httpx>=0.28.1", - "lxml>=6.0.0", "pytz>=2025.2", + "selectolax>=0.3.33", ] diff --git a/uv.lock b/uv.lock index c92d5c1..7a1ea7a 100644 --- a/uv.lock +++ b/uv.lock @@ -17,19 +17,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] -[[package]] -name = "beautifulsoup4" -version = "4.13.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "soupsieve" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, -] - [[package]] name = "certifi" version = "2025.8.3" @@ -102,92 +89,16 @@ name = "iptv" version = "0.0.2" source = { virtual = "." } dependencies = [ - { name = "beautifulsoup4" }, { name = "httpx" }, - { name = "lxml" }, { name = "pytz" }, + { name = "selectolax" }, ] [package.metadata] requires-dist = [ - { name = "beautifulsoup4", specifier = ">=4.13.4" }, { name = "httpx", specifier = ">=0.28.1" }, - { name = "lxml", specifier = ">=6.0.0" }, { name = "pytz", specifier = ">=2025.2" }, -] - -[[package]] -name = "lxml" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c5/ed/60eb6fa2923602fba988d9ca7c5cdbd7cf25faa795162ed538b527a35411/lxml-6.0.0.tar.gz", hash = "sha256:032e65120339d44cdc3efc326c9f660f5f7205f3a535c1fdbf898b29ea01fb72", size = 4096938, upload-time = "2025-06-26T16:28:19.373Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/e9/9c3ca02fbbb7585116c2e274b354a2d92b5c70561687dd733ec7b2018490/lxml-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:35bc626eec405f745199200ccb5c6b36f202675d204aa29bb52e27ba2b71dea8", size = 8399057, upload-time = "2025-06-26T16:25:02.169Z" }, - { url = "https://files.pythonhosted.org/packages/86/25/10a6e9001191854bf283515020f3633b1b1f96fd1b39aa30bf8fff7aa666/lxml-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:246b40f8a4aec341cbbf52617cad8ab7c888d944bfe12a6abd2b1f6cfb6f6082", size = 4569676, upload-time = "2025-06-26T16:25:05.431Z" }, - { url = "https://files.pythonhosted.org/packages/f5/a5/378033415ff61d9175c81de23e7ad20a3ffb614df4ffc2ffc86bc6746ffd/lxml-6.0.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:2793a627e95d119e9f1e19720730472f5543a6d84c50ea33313ce328d870f2dd", size = 5291361, upload-time = "2025-06-26T16:25:07.901Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a6/19c87c4f3b9362b08dc5452a3c3bce528130ac9105fc8fff97ce895ce62e/lxml-6.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:46b9ed911f36bfeb6338e0b482e7fe7c27d362c52fde29f221fddbc9ee2227e7", size = 5008290, upload-time = "2025-06-28T18:47:13.196Z" }, - { url = "https://files.pythonhosted.org/packages/09/d1/e9b7ad4b4164d359c4d87ed8c49cb69b443225cb495777e75be0478da5d5/lxml-6.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b4790b558bee331a933e08883c423f65bbcd07e278f91b2272489e31ab1e2b4", size = 5163192, upload-time = "2025-06-28T18:47:17.279Z" }, - { url = "https://files.pythonhosted.org/packages/56/d6/b3eba234dc1584744b0b374a7f6c26ceee5dc2147369a7e7526e25a72332/lxml-6.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2030956cf4886b10be9a0285c6802e078ec2391e1dd7ff3eb509c2c95a69b76", size = 5076973, upload-time = "2025-06-26T16:25:10.936Z" }, - { url = "https://files.pythonhosted.org/packages/8e/47/897142dd9385dcc1925acec0c4afe14cc16d310ce02c41fcd9010ac5d15d/lxml-6.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d23854ecf381ab1facc8f353dcd9adeddef3652268ee75297c1164c987c11dc", size = 5297795, upload-time = "2025-06-26T16:25:14.282Z" }, - { url = "https://files.pythonhosted.org/packages/fb/db/551ad84515c6f415cea70193a0ff11d70210174dc0563219f4ce711655c6/lxml-6.0.0-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:43fe5af2d590bf4691531b1d9a2495d7aab2090547eaacd224a3afec95706d76", size = 4776547, upload-time = "2025-06-26T16:25:17.123Z" }, - { url = "https://files.pythonhosted.org/packages/e0/14/c4a77ab4f89aaf35037a03c472f1ccc54147191888626079bd05babd6808/lxml-6.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74e748012f8c19b47f7d6321ac929a9a94ee92ef12bc4298c47e8b7219b26541", size = 5124904, upload-time = "2025-06-26T16:25:19.485Z" }, - { url = "https://files.pythonhosted.org/packages/70/b4/12ae6a51b8da106adec6a2e9c60f532350a24ce954622367f39269e509b1/lxml-6.0.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:43cfbb7db02b30ad3926e8fceaef260ba2fb7df787e38fa2df890c1ca7966c3b", size = 4805804, upload-time = "2025-06-26T16:25:21.949Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b6/2e82d34d49f6219cdcb6e3e03837ca5fb8b7f86c2f35106fb8610ac7f5b8/lxml-6.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34190a1ec4f1e84af256495436b2d196529c3f2094f0af80202947567fdbf2e7", size = 5323477, upload-time = "2025-06-26T16:25:24.475Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e6/b83ddc903b05cd08a5723fefd528eee84b0edd07bdf87f6c53a1fda841fd/lxml-6.0.0-cp310-cp310-win32.whl", hash = "sha256:5967fe415b1920a3877a4195e9a2b779249630ee49ece22021c690320ff07452", size = 3613840, upload-time = "2025-06-26T16:25:27.345Z" }, - { url = "https://files.pythonhosted.org/packages/40/af/874fb368dd0c663c030acb92612341005e52e281a102b72a4c96f42942e1/lxml-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:f3389924581d9a770c6caa4df4e74b606180869043b9073e2cec324bad6e306e", size = 3993584, upload-time = "2025-06-26T16:25:29.391Z" }, - { url = "https://files.pythonhosted.org/packages/4a/f4/d296bc22c17d5607653008f6dd7b46afdfda12efd31021705b507df652bb/lxml-6.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:522fe7abb41309e9543b0d9b8b434f2b630c5fdaf6482bee642b34c8c70079c8", size = 3681400, upload-time = "2025-06-26T16:25:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/7c/23/828d4cc7da96c611ec0ce6147bbcea2fdbde023dc995a165afa512399bbf/lxml-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ee56288d0df919e4aac43b539dd0e34bb55d6a12a6562038e8d6f3ed07f9e36", size = 8438217, upload-time = "2025-06-26T16:25:34.349Z" }, - { url = "https://files.pythonhosted.org/packages/f1/33/5ac521212c5bcb097d573145d54b2b4a3c9766cda88af5a0e91f66037c6e/lxml-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8dd6dd0e9c1992613ccda2bcb74fc9d49159dbe0f0ca4753f37527749885c25", size = 4590317, upload-time = "2025-06-26T16:25:38.103Z" }, - { url = "https://files.pythonhosted.org/packages/2b/2e/45b7ca8bee304c07f54933c37afe7dd4d39ff61ba2757f519dcc71bc5d44/lxml-6.0.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:d7ae472f74afcc47320238b5dbfd363aba111a525943c8a34a1b657c6be934c3", size = 5221628, upload-time = "2025-06-26T16:25:40.878Z" }, - { url = "https://files.pythonhosted.org/packages/32/23/526d19f7eb2b85da1f62cffb2556f647b049ebe2a5aa8d4d41b1fb2c7d36/lxml-6.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5592401cdf3dc682194727c1ddaa8aa0f3ddc57ca64fd03226a430b955eab6f6", size = 4949429, upload-time = "2025-06-28T18:47:20.046Z" }, - { url = "https://files.pythonhosted.org/packages/ac/cc/f6be27a5c656a43a5344e064d9ae004d4dcb1d3c9d4f323c8189ddfe4d13/lxml-6.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58ffd35bd5425c3c3b9692d078bf7ab851441434531a7e517c4984d5634cd65b", size = 5087909, upload-time = "2025-06-28T18:47:22.834Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e6/8ec91b5bfbe6972458bc105aeb42088e50e4b23777170404aab5dfb0c62d/lxml-6.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f720a14aa102a38907c6d5030e3d66b3b680c3e6f6bc95473931ea3c00c59967", size = 5031713, upload-time = "2025-06-26T16:25:43.226Z" }, - { url = "https://files.pythonhosted.org/packages/33/cf/05e78e613840a40e5be3e40d892c48ad3e475804db23d4bad751b8cadb9b/lxml-6.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2a5e8d207311a0170aca0eb6b160af91adc29ec121832e4ac151a57743a1e1e", size = 5232417, upload-time = "2025-06-26T16:25:46.111Z" }, - { url = "https://files.pythonhosted.org/packages/ac/8c/6b306b3e35c59d5f0b32e3b9b6b3b0739b32c0dc42a295415ba111e76495/lxml-6.0.0-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:2dd1cc3ea7e60bfb31ff32cafe07e24839df573a5e7c2d33304082a5019bcd58", size = 4681443, upload-time = "2025-06-26T16:25:48.837Z" }, - { url = "https://files.pythonhosted.org/packages/59/43/0bd96bece5f7eea14b7220476835a60d2b27f8e9ca99c175f37c085cb154/lxml-6.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cfcf84f1defed7e5798ef4f88aa25fcc52d279be731ce904789aa7ccfb7e8d2", size = 5074542, upload-time = "2025-06-26T16:25:51.65Z" }, - { url = "https://files.pythonhosted.org/packages/e2/3d/32103036287a8ca012d8518071f8852c68f2b3bfe048cef2a0202eb05910/lxml-6.0.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a52a4704811e2623b0324a18d41ad4b9fabf43ce5ff99b14e40a520e2190c851", size = 4729471, upload-time = "2025-06-26T16:25:54.571Z" }, - { url = "https://files.pythonhosted.org/packages/ca/a8/7be5d17df12d637d81854bd8648cd329f29640a61e9a72a3f77add4a311b/lxml-6.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c16304bba98f48a28ae10e32a8e75c349dd742c45156f297e16eeb1ba9287a1f", size = 5256285, upload-time = "2025-06-26T16:25:56.997Z" }, - { url = "https://files.pythonhosted.org/packages/cd/d0/6cb96174c25e0d749932557c8d51d60c6e292c877b46fae616afa23ed31a/lxml-6.0.0-cp311-cp311-win32.whl", hash = "sha256:f8d19565ae3eb956d84da3ef367aa7def14a2735d05bd275cd54c0301f0d0d6c", size = 3612004, upload-time = "2025-06-26T16:25:59.11Z" }, - { url = "https://files.pythonhosted.org/packages/ca/77/6ad43b165dfc6dead001410adeb45e88597b25185f4479b7ca3b16a5808f/lxml-6.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b2d71cdefda9424adff9a3607ba5bbfc60ee972d73c21c7e3c19e71037574816", size = 4003470, upload-time = "2025-06-26T16:26:01.655Z" }, - { url = "https://files.pythonhosted.org/packages/a0/bc/4c50ec0eb14f932a18efc34fc86ee936a66c0eb5f2fe065744a2da8a68b2/lxml-6.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:8a2e76efbf8772add72d002d67a4c3d0958638696f541734304c7f28217a9cab", size = 3682477, upload-time = "2025-06-26T16:26:03.808Z" }, - { url = "https://files.pythonhosted.org/packages/89/c3/d01d735c298d7e0ddcedf6f028bf556577e5ab4f4da45175ecd909c79378/lxml-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78718d8454a6e928470d511bf8ac93f469283a45c354995f7d19e77292f26108", size = 8429515, upload-time = "2025-06-26T16:26:06.776Z" }, - { url = "https://files.pythonhosted.org/packages/06/37/0e3eae3043d366b73da55a86274a590bae76dc45aa004b7042e6f97803b1/lxml-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:84ef591495ffd3f9dcabffd6391db7bb70d7230b5c35ef5148354a134f56f2be", size = 4601387, upload-time = "2025-06-26T16:26:09.511Z" }, - { url = "https://files.pythonhosted.org/packages/a3/28/e1a9a881e6d6e29dda13d633885d13acb0058f65e95da67841c8dd02b4a8/lxml-6.0.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:2930aa001a3776c3e2601cb8e0a15d21b8270528d89cc308be4843ade546b9ab", size = 5228928, upload-time = "2025-06-26T16:26:12.337Z" }, - { url = "https://files.pythonhosted.org/packages/9a/55/2cb24ea48aa30c99f805921c1c7860c1f45c0e811e44ee4e6a155668de06/lxml-6.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:219e0431ea8006e15005767f0351e3f7f9143e793e58519dc97fe9e07fae5563", size = 4952289, upload-time = "2025-06-28T18:47:25.602Z" }, - { url = "https://files.pythonhosted.org/packages/31/c0/b25d9528df296b9a3306ba21ff982fc5b698c45ab78b94d18c2d6ae71fd9/lxml-6.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bd5913b4972681ffc9718bc2d4c53cde39ef81415e1671ff93e9aa30b46595e7", size = 5111310, upload-time = "2025-06-28T18:47:28.136Z" }, - { url = "https://files.pythonhosted.org/packages/e9/af/681a8b3e4f668bea6e6514cbcb297beb6de2b641e70f09d3d78655f4f44c/lxml-6.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:390240baeb9f415a82eefc2e13285016f9c8b5ad71ec80574ae8fa9605093cd7", size = 5025457, upload-time = "2025-06-26T16:26:15.068Z" }, - { url = "https://files.pythonhosted.org/packages/99/b6/3a7971aa05b7be7dfebc7ab57262ec527775c2c3c5b2f43675cac0458cad/lxml-6.0.0-cp312-cp312-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d6e200909a119626744dd81bae409fc44134389e03fbf1d68ed2a55a2fb10991", size = 5657016, upload-time = "2025-07-03T19:19:06.008Z" }, - { url = "https://files.pythonhosted.org/packages/69/f8/693b1a10a891197143c0673fcce5b75fc69132afa81a36e4568c12c8faba/lxml-6.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca50bd612438258a91b5b3788c6621c1f05c8c478e7951899f492be42defc0da", size = 5257565, upload-time = "2025-06-26T16:26:17.906Z" }, - { url = "https://files.pythonhosted.org/packages/a8/96/e08ff98f2c6426c98c8964513c5dab8d6eb81dadcd0af6f0c538ada78d33/lxml-6.0.0-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:c24b8efd9c0f62bad0439283c2c795ef916c5a6b75f03c17799775c7ae3c0c9e", size = 4713390, upload-time = "2025-06-26T16:26:20.292Z" }, - { url = "https://files.pythonhosted.org/packages/a8/83/6184aba6cc94d7413959f6f8f54807dc318fdcd4985c347fe3ea6937f772/lxml-6.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:afd27d8629ae94c5d863e32ab0e1d5590371d296b87dae0a751fb22bf3685741", size = 5066103, upload-time = "2025-06-26T16:26:22.765Z" }, - { url = "https://files.pythonhosted.org/packages/ee/01/8bf1f4035852d0ff2e36a4d9aacdbcc57e93a6cd35a54e05fa984cdf73ab/lxml-6.0.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:54c4855eabd9fc29707d30141be99e5cd1102e7d2258d2892314cf4c110726c3", size = 4791428, upload-time = "2025-06-26T16:26:26.461Z" }, - { url = "https://files.pythonhosted.org/packages/29/31/c0267d03b16954a85ed6b065116b621d37f559553d9339c7dcc4943a76f1/lxml-6.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c907516d49f77f6cd8ead1322198bdfd902003c3c330c77a1c5f3cc32a0e4d16", size = 5678523, upload-time = "2025-07-03T19:19:09.837Z" }, - { url = "https://files.pythonhosted.org/packages/5c/f7/5495829a864bc5f8b0798d2b52a807c89966523140f3d6fa3a58ab6720ea/lxml-6.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36531f81c8214e293097cd2b7873f178997dae33d3667caaae8bdfb9666b76c0", size = 5281290, upload-time = "2025-06-26T16:26:29.406Z" }, - { url = "https://files.pythonhosted.org/packages/79/56/6b8edb79d9ed294ccc4e881f4db1023af56ba451909b9ce79f2a2cd7c532/lxml-6.0.0-cp312-cp312-win32.whl", hash = "sha256:690b20e3388a7ec98e899fd54c924e50ba6693874aa65ef9cb53de7f7de9d64a", size = 3613495, upload-time = "2025-06-26T16:26:31.588Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1e/cc32034b40ad6af80b6fd9b66301fc0f180f300002e5c3eb5a6110a93317/lxml-6.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:310b719b695b3dd442cdfbbe64936b2f2e231bb91d998e99e6f0daf991a3eba3", size = 4014711, upload-time = "2025-06-26T16:26:33.723Z" }, - { url = "https://files.pythonhosted.org/packages/55/10/dc8e5290ae4c94bdc1a4c55865be7e1f31dfd857a88b21cbba68b5fea61b/lxml-6.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:8cb26f51c82d77483cdcd2b4a53cda55bbee29b3c2f3ddeb47182a2a9064e4eb", size = 3674431, upload-time = "2025-06-26T16:26:35.959Z" }, - { url = "https://files.pythonhosted.org/packages/79/21/6e7c060822a3c954ff085e5e1b94b4a25757c06529eac91e550f3f5cd8b8/lxml-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6da7cd4f405fd7db56e51e96bff0865b9853ae70df0e6720624049da76bde2da", size = 8414372, upload-time = "2025-06-26T16:26:39.079Z" }, - { url = "https://files.pythonhosted.org/packages/a4/f6/051b1607a459db670fc3a244fa4f06f101a8adf86cda263d1a56b3a4f9d5/lxml-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b34339898bb556a2351a1830f88f751679f343eabf9cf05841c95b165152c9e7", size = 4593940, upload-time = "2025-06-26T16:26:41.891Z" }, - { url = "https://files.pythonhosted.org/packages/8e/74/dd595d92a40bda3c687d70d4487b2c7eff93fd63b568acd64fedd2ba00fe/lxml-6.0.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:51a5e4c61a4541bd1cd3ba74766d0c9b6c12d6a1a4964ef60026832aac8e79b3", size = 5214329, upload-time = "2025-06-26T16:26:44.669Z" }, - { url = "https://files.pythonhosted.org/packages/52/46/3572761efc1bd45fcafb44a63b3b0feeb5b3f0066886821e94b0254f9253/lxml-6.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d18a25b19ca7307045581b18b3ec9ead2b1db5ccd8719c291f0cd0a5cec6cb81", size = 4947559, upload-time = "2025-06-28T18:47:31.091Z" }, - { url = "https://files.pythonhosted.org/packages/94/8a/5e40de920e67c4f2eef9151097deb9b52d86c95762d8ee238134aff2125d/lxml-6.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d4f0c66df4386b75d2ab1e20a489f30dc7fd9a06a896d64980541506086be1f1", size = 5102143, upload-time = "2025-06-28T18:47:33.612Z" }, - { url = "https://files.pythonhosted.org/packages/7c/4b/20555bdd75d57945bdabfbc45fdb1a36a1a0ff9eae4653e951b2b79c9209/lxml-6.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f4b481b6cc3a897adb4279216695150bbe7a44c03daba3c894f49d2037e0a24", size = 5021931, upload-time = "2025-06-26T16:26:47.503Z" }, - { url = "https://files.pythonhosted.org/packages/b6/6e/cf03b412f3763d4ca23b25e70c96a74cfece64cec3addf1c4ec639586b13/lxml-6.0.0-cp313-cp313-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a78d6c9168f5bcb20971bf3329c2b83078611fbe1f807baadc64afc70523b3a", size = 5645469, upload-time = "2025-07-03T19:19:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/d4/dd/39c8507c16db6031f8c1ddf70ed95dbb0a6d466a40002a3522c128aba472/lxml-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae06fbab4f1bb7db4f7c8ca9897dc8db4447d1a2b9bee78474ad403437bcc29", size = 5247467, upload-time = "2025-06-26T16:26:49.998Z" }, - { url = "https://files.pythonhosted.org/packages/4d/56/732d49def0631ad633844cfb2664563c830173a98d5efd9b172e89a4800d/lxml-6.0.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:1fa377b827ca2023244a06554c6e7dc6828a10aaf74ca41965c5d8a4925aebb4", size = 4720601, upload-time = "2025-06-26T16:26:52.564Z" }, - { url = "https://files.pythonhosted.org/packages/8f/7f/6b956fab95fa73462bca25d1ea7fc8274ddf68fb8e60b78d56c03b65278e/lxml-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1676b56d48048a62ef77a250428d1f31f610763636e0784ba67a9740823988ca", size = 5060227, upload-time = "2025-06-26T16:26:55.054Z" }, - { url = "https://files.pythonhosted.org/packages/97/06/e851ac2924447e8b15a294855caf3d543424364a143c001014d22c8ca94c/lxml-6.0.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0e32698462aacc5c1cf6bdfebc9c781821b7e74c79f13e5ffc8bfe27c42b1abf", size = 4790637, upload-time = "2025-06-26T16:26:57.384Z" }, - { url = "https://files.pythonhosted.org/packages/06/d4/fd216f3cd6625022c25b336c7570d11f4a43adbaf0a56106d3d496f727a7/lxml-6.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4d6036c3a296707357efb375cfc24bb64cd955b9ec731abf11ebb1e40063949f", size = 5662049, upload-time = "2025-07-03T19:19:16.409Z" }, - { url = "https://files.pythonhosted.org/packages/52/03/0e764ce00b95e008d76b99d432f1807f3574fb2945b496a17807a1645dbd/lxml-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7488a43033c958637b1a08cddc9188eb06d3ad36582cebc7d4815980b47e27ef", size = 5272430, upload-time = "2025-06-26T16:27:00.031Z" }, - { url = "https://files.pythonhosted.org/packages/5f/01/d48cc141bc47bc1644d20fe97bbd5e8afb30415ec94f146f2f76d0d9d098/lxml-6.0.0-cp313-cp313-win32.whl", hash = "sha256:5fcd7d3b1d8ecb91445bd71b9c88bdbeae528fefee4f379895becfc72298d181", size = 3612896, upload-time = "2025-06-26T16:27:04.251Z" }, - { url = "https://files.pythonhosted.org/packages/f4/87/6456b9541d186ee7d4cb53bf1b9a0d7f3b1068532676940fdd594ac90865/lxml-6.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:2f34687222b78fff795feeb799a7d44eca2477c3d9d3a46ce17d51a4f383e32e", size = 4013132, upload-time = "2025-06-26T16:27:06.415Z" }, - { url = "https://files.pythonhosted.org/packages/b7/42/85b3aa8f06ca0d24962f8100f001828e1f1f1a38c954c16e71154ed7d53a/lxml-6.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:21db1ec5525780fd07251636eb5f7acb84003e9382c72c18c542a87c416ade03", size = 3672642, upload-time = "2025-06-26T16:27:09.888Z" }, - { url = "https://files.pythonhosted.org/packages/66/e1/2c22a3cff9e16e1d717014a1e6ec2bf671bf56ea8716bb64466fcf820247/lxml-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:dbdd7679a6f4f08152818043dbb39491d1af3332128b3752c3ec5cebc0011a72", size = 3898804, upload-time = "2025-06-26T16:27:59.751Z" }, - { url = "https://files.pythonhosted.org/packages/2b/3a/d68cbcb4393a2a0a867528741fafb7ce92dac5c9f4a1680df98e5e53e8f5/lxml-6.0.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40442e2a4456e9910875ac12951476d36c0870dcb38a68719f8c4686609897c4", size = 4216406, upload-time = "2025-06-28T18:47:45.518Z" }, - { url = "https://files.pythonhosted.org/packages/15/8f/d9bfb13dff715ee3b2a1ec2f4a021347ea3caf9aba93dea0cfe54c01969b/lxml-6.0.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db0efd6bae1c4730b9c863fc4f5f3c0fa3e8f05cae2c44ae141cb9dfc7d091dc", size = 4326455, upload-time = "2025-06-28T18:47:48.411Z" }, - { url = "https://files.pythonhosted.org/packages/01/8b/fde194529ee8a27e6f5966d7eef05fa16f0567e4a8e8abc3b855ef6b3400/lxml-6.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ab542c91f5a47aaa58abdd8ea84b498e8e49fe4b883d67800017757a3eb78e8", size = 4268788, upload-time = "2025-06-26T16:28:02.776Z" }, - { url = "https://files.pythonhosted.org/packages/99/a8/3b8e2581b4f8370fc9e8dc343af4abdfadd9b9229970fc71e67bd31c7df1/lxml-6.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:013090383863b72c62a702d07678b658fa2567aa58d373d963cca245b017e065", size = 4411394, upload-time = "2025-06-26T16:28:05.179Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a5/899a4719e02ff4383f3f96e5d1878f882f734377f10dfb69e73b5f223e44/lxml-6.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c86df1c9af35d903d2b52d22ea3e66db8058d21dc0f59842ca5deb0595921141", size = 3517946, upload-time = "2025-06-26T16:28:07.665Z" }, + { name = "selectolax", specifier = ">=0.3.33" }, ] [[package]] @@ -199,6 +110,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] +[[package]] +name = "selectolax" +version = "0.3.33" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/02/d249d3ee4c2b93c0fe2aa2cadcb7b65fda88730028af8853ea6cd2e5434b/selectolax-0.3.33.tar.gz", hash = "sha256:e352abb1621decf7cdf2ef51f245aaf684622a07fabed876eb86e5c69c7ef668", size = 4707132, upload-time = "2025-08-09T16:48:44.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/df/9495965779000c6b9ab7b25abc20c08ac999b24a0d1ef3ca3aade29f042d/selectolax-0.3.33-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f21eaa43e86f7e5706a8955c2c48ec97a3fe9493b8309c2d99692316e644195b", size = 2076090, upload-time = "2025-08-09T16:47:52.735Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2a/9dc145eab58fc4b159a0987807f4a9bfc68b038513b5fbcbdcccc8c0046b/selectolax-0.3.33-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bbf2c6bdf3b2ae7ec25f6e13eb9d05b02fd6996b771d719e568b8d816ec11c7", size = 2072590, upload-time = "2025-08-09T16:47:55.03Z" }, + { url = "https://files.pythonhosted.org/packages/1d/0d/76650e6c8c57b8dfab5efe9b0d0147375ec8da3c0fe99cade4d0b4e46c1d/selectolax-0.3.33-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f4675ec3f68721f7d484b7fda3e7f6db881e9778b2c378de0c517230e5a7ba4", size = 5569237, upload-time = "2025-08-09T16:47:56.619Z" }, + { url = "https://files.pythonhosted.org/packages/d1/f1/cd070184b6bb07f2fab079b2aefe5a1dcd616b3c22b7d56e2ee9baf5dd5d/selectolax-0.3.33-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b0812357fa1969eb2097b573841de90712a5f65794948ef607957757e05ad16a", size = 5574444, upload-time = "2025-08-09T16:47:58.527Z" }, + { url = "https://files.pythonhosted.org/packages/fb/31/865d62f275fcf4adf36f6b74065a7d07a92225ba9e74880eddc7778970ad/selectolax-0.3.33-cp310-cp310-win_amd64.whl", hash = "sha256:4c56ccebc84afdbde55298826e2dfa37f4e4199e407a17eb72a30279697f518b", size = 1797337, upload-time = "2025-08-09T16:48:00.107Z" }, + { url = "https://files.pythonhosted.org/packages/b6/13/8e1935d1feea8b548b7f4d2e500ff7ab1070b428e61fc0fb19d4b3d1497a/selectolax-0.3.33-cp310-cp310-win_arm64.whl", hash = "sha256:a0eeac03f34b9094ae67c4bc272447b27a327b8220f4b8e4c559ffffe658a704", size = 1741136, upload-time = "2025-08-09T16:48:01.916Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d8/c7707c826d31dcfc069f6bf8682a3a46a314b80a794b22ae80c952e61508/selectolax-0.3.33-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c16bfe02ec09a44892a068804e9a7d8ccfe116b9b6fc315fb32f46be4a6d90b", size = 2083074, upload-time = "2025-08-09T16:48:03.745Z" }, + { url = "https://files.pythonhosted.org/packages/cb/fd/d1e47cbb6c1eb4a9d1a06acfdd07aef170d12e168c6ed586b778d8ce7b23/selectolax-0.3.33-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b9ec7a0bc90bde0e050df69d31dcb9be2a96221e6e6f0b0ff255c860d9de32e7", size = 2079559, upload-time = "2025-08-09T16:48:05.283Z" }, + { url = "https://files.pythonhosted.org/packages/5d/84/1bd0b4acd1f2ca3b658069562a3cb560561172133d83ec456d5dbf470083/selectolax-0.3.33-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a39ba0b4945eccd1d2cac720ae427baf309c3cb3bd98e94bd80af27d7133a934", size = 5689374, upload-time = "2025-08-09T16:48:06.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/2801733fdfd7634cab7849ba7a456414c323c75f7d36699a45225b12ce2f/selectolax-0.3.33-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b13ac722554ba2ed6e473fa8a909965a758e9099d38934ebbf7cffe6c106de3", size = 5696330, upload-time = "2025-08-09T16:48:08.748Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e6/a2f1973092eb8e6738b73de220d3e4b123ce4c156dd2fd06899ceecacbea/selectolax-0.3.33-cp311-cp311-win_amd64.whl", hash = "sha256:d999ac725c369045249364ff47dc4a6ccb8aed87355830a88919db7456e483d2", size = 1799210, upload-time = "2025-08-09T16:48:10.659Z" }, + { url = "https://files.pythonhosted.org/packages/90/49/af398584a92841b674737a2f94f4ee191c8e041535fca7dfd4e687a1c210/selectolax-0.3.33-cp311-cp311-win_arm64.whl", hash = "sha256:f12951da4f4480b2405cc6bc92643eb0b390b6ec56cf6018c6d651f0fb07b493", size = 1740969, upload-time = "2025-08-09T16:48:12.458Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ab/43ecf704e13968fa27c3af85c57c309fa1ca359144e8f1bb72ad7608fd9c/selectolax-0.3.33-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:29229ed8e65d2560a7a32c8f4017e1dee61ee8fc44071d122722755163d7ad1a", size = 2082660, upload-time = "2025-08-09T16:48:13.996Z" }, + { url = "https://files.pythonhosted.org/packages/c0/da/bd3f4af55b387d13f68b335c412afd0388ec518aba9065013e3b0540f5d3/selectolax-0.3.33-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9b4e9c0873fcbfe5cae3e10fcd0c819a87dff6b6987f30da04b9cb7b0d1dce0", size = 2076770, upload-time = "2025-08-09T16:48:15.441Z" }, + { url = "https://files.pythonhosted.org/packages/13/98/e3a39def520f271722fa51daf0ad1c7c0f7cd4e30ac5b0a94b060a9318ac/selectolax-0.3.33-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce67452a7abddb30bf8c5d423ff46e2b4a9da30f27771d34c47f68df299acdee", size = 5792226, upload-time = "2025-08-09T16:48:16.921Z" }, + { url = "https://files.pythonhosted.org/packages/e9/32/54d88e20959aab3a14fa5d75a6863273ca35256eacb29424ed272ef788a6/selectolax-0.3.33-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbb686a10249dd70d847afbc67fea2c496ddcfbe6a96cfe4353d8f2da9d3e7e1", size = 5826850, upload-time = "2025-08-09T16:48:18.705Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f7/a3281f0a8aa81b2c6e39200a7782ffb047525f96d53d60ddab2c79009a7a/selectolax-0.3.33-cp312-cp312-win_amd64.whl", hash = "sha256:3330c0dbfa83850d3a78c079dd37d93307cd8ee028bf2ba348aeea036c0795b7", size = 1794655, upload-time = "2025-08-09T16:48:20.237Z" }, + { url = "https://files.pythonhosted.org/packages/51/53/40af4f53af52a85524d4e11c399a8a02471a4fc0af470abd3f68e14e1fc6/selectolax-0.3.33-cp312-cp312-win_arm64.whl", hash = "sha256:d0aed742395fc30d0a91fa01acbf30ed4f01e4d0a75c0e535cce3312d54791de", size = 1732476, upload-time = "2025-08-09T16:48:22.175Z" }, + { url = "https://files.pythonhosted.org/packages/ca/dc/54af23db2099b323659c1d57815736914af90a9a3764458c8041d815a6d9/selectolax-0.3.33-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0661530655a69d437c5ec02e545d17bd462c791d9a02500136805fefbaed5975", size = 2080318, upload-time = "2025-08-09T16:48:24.055Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ef/cabba21b87a70241c3a9e46c7e8638c211ef3a4021763104ae9b45277321/selectolax-0.3.33-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:66e489a06626de8eb2289ada10c91c8ca0eecc4e7b83e6d5ec4652b9a80a4c75", size = 2075524, upload-time = "2025-08-09T16:48:25.53Z" }, + { url = "https://files.pythonhosted.org/packages/71/09/7bc70fe13420b1b43809791004432c4e25eff39c44ef8084071768dcef9d/selectolax-0.3.33-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cab500be25c9a9443dd4b047cea26f50e30a1be8f95407b25c9eba5a6c8beaa", size = 5772059, upload-time = "2025-08-09T16:48:27.066Z" }, + { url = "https://files.pythonhosted.org/packages/51/d5/831b1c25d5ee875183c114acfd595365e550f2b75a226d5577d15cf9b978/selectolax-0.3.33-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48bc6f799d975565ce011e402e19917588e1f34c2849519691dcd2b97b8cfa36", size = 5805851, upload-time = "2025-08-09T16:48:28.849Z" }, + { url = "https://files.pythonhosted.org/packages/89/a8/1ab9e030b76475808365bd32575964e96f5458023c907615c7d0b036b4a9/selectolax-0.3.33-cp313-cp313-win_amd64.whl", hash = "sha256:7f2c467085f7f5f050a259efbc982970793671c6e55e9c05cca8c6f142baf670", size = 1795238, upload-time = "2025-08-09T16:48:30.375Z" }, + { url = "https://files.pythonhosted.org/packages/bb/da/e88c3523c00648708bc13da60c48353a45bb10dee3dd07a87ac469ea0987/selectolax-0.3.33-cp313-cp313-win_arm64.whl", hash = "sha256:f4332d0927e2f12d5d9e30a9eb8b3e72b5a606dcb4914ba9920dd6a3e4e278f6", size = 1732238, upload-time = "2025-08-09T16:48:32.318Z" }, +] + [[package]] name = "sniffio" version = "1.3.1" @@ -208,20 +151,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] -[[package]] -name = "soupsieve" -version = "2.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" }, -] - [[package]] name = "typing-extensions" -version = "4.14.1" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ]