Skip to main content

all: remove httpx as a dependency

ID
6f5f6e3
date
2026-03-28 22:56:39+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
a222945
message
all: remove httpx as a dependency
changed files
6 files, 36 additions, 54 deletions

Changed files

.gitignore (0) → .gitignore (10)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6350e98
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.coverage

dev_requirements.in (76) → dev_requirements.in (80)

diff --git a/dev_requirements.in b/dev_requirements.in
index a3a9eed..30b9bfa 100644
--- a/dev_requirements.in
+++ b/dev_requirements.in
@@ -2,7 +2,7 @@
 
 mypy
 pymediainfo
-pytest
+pytest-cov
 pytest-xdist
 ruff
 types-yt-dlp

dev_requirements.txt (2180) → dev_requirements.txt (1981)

diff --git a/dev_requirements.txt b/dev_requirements.txt
index 8e0c5e5..82488aa 100644
--- a/dev_requirements.txt
+++ b/dev_requirements.txt
@@ -1,51 +1,35 @@
 # This file was autogenerated by uv via the following command:
 #    uv pip compile dev_requirements.in --output-file dev_requirements.txt
-alexwlchan-chives==23
+alexwlchan-chives==28
     # via -r requirements.txt
-anyio==4.12.1
-    # via
-    #   -r requirements.txt
-    #   httpx
 brotli==1.2.0
     # via -r requirements.txt
 certifi==2026.2.25
     # via
     #   -r requirements.txt
     #   curl-cffi
-    #   httpcore
-    #   httpx
     #   requests
 cffi==2.0.0
     # via
     #   -r requirements.txt
     #   curl-cffi
-charset-normalizer==3.4.4
+charset-normalizer==3.4.6
     # via
     #   -r requirements.txt
     #   requests
+coverage==7.13.5
+    # via pytest-cov
 curl-cffi==0.14.0
     # via -r requirements.txt
 execnet==2.1.2
     # via pytest-xdist
-gallery-dl==1.31.7
-    # via -r requirements.txt
-h11==0.16.0
-    # via
-    #   -r requirements.txt
-    #   httpcore
-httpcore==1.0.9
-    # via
-    #   -r requirements.txt
-    #   httpx
-httpx==0.28.1
+gallery-dl==1.31.10
     # via -r requirements.txt
 hyperlink==21.0.0
     # via -r requirements.txt
 idna==3.11
     # via
     #   -r requirements.txt
-    #   anyio
-    #   httpx
     #   hyperlink
     #   requests
 iniconfig==2.3.0
@@ -65,7 +49,9 @@ pathspec==1.0.4
 pillow==12.1.1
     # via -r requirements.txt
 pluggy==1.6.0
-    # via pytest
+    # via
+    #   pytest
+    #   pytest-cov
 pycparser==3.0
     # via
     #   -r requirements.txt
@@ -78,17 +64,19 @@ pymediainfo==7.0.1
     # via -r dev_requirements.in
 pytest==9.0.2
     # via
-    #   -r dev_requirements.in
+    #   pytest-cov
     #   pytest-xdist
+pytest-cov==7.1.0
+    # via -r dev_requirements.in
 pytest-xdist==3.8.0
     # via -r dev_requirements.in
-requests==2.32.5
+requests==2.33.0
     # via
     #   -r requirements.txt
     #   gallery-dl
-ruff==0.15.4
+ruff==0.15.8
     # via -r dev_requirements.in
-types-yt-dlp==2026.2.21.20260223
+types-yt-dlp==2026.3.17.20260318
     # via -r dev_requirements.in
 typing-extensions==4.15.0
     # via mypy
@@ -100,7 +88,7 @@ websockets==16.0
     # via
     #   -r requirements.txt
     #   types-yt-dlp
-yt-dlp==2026.2.21
+yt-dlp==2026.3.17
     # via -r requirements.txt
-yt-dlp-ejs==0.5.0
+yt-dlp-ejs==0.8.0
     # via -r requirements.txt

requirements.in (78) → requirements.in (80)

diff --git a/requirements.in b/requirements.in
index 75070fa..be495a7 100644
--- a/requirements.in
+++ b/requirements.in
@@ -1,5 +1,5 @@
 alexwlchan-chives[media]
+certifi
 gallery-dl
-httpx
 hyperlink
 yt-dlp[curl-cffi,default]

requirements.txt (1128) → requirements.txt (961)

diff --git a/requirements.txt b/requirements.txt
index e916f0a..50a4138 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,38 +1,27 @@
 # This file was autogenerated by uv via the following command:
 #    uv pip compile requirements.in --output-file requirements.txt
-alexwlchan-chives==23
+alexwlchan-chives==28
     # via -r requirements.in
-anyio==4.12.1
-    # via httpx
 brotli==1.2.0
     # via yt-dlp
 certifi==2026.2.25
     # via
+    #   -r requirements.in
     #   curl-cffi
-    #   httpcore
-    #   httpx
     #   requests
     #   yt-dlp
 cffi==2.0.0
     # via curl-cffi
-charset-normalizer==3.4.4
+charset-normalizer==3.4.6
     # via requests
 curl-cffi==0.14.0
     # via yt-dlp
-gallery-dl==1.31.7
-    # via -r requirements.in
-h11==0.16.0
-    # via httpcore
-httpcore==1.0.9
-    # via httpx
-httpx==0.28.1
+gallery-dl==1.31.10
     # via -r requirements.in
 hyperlink==21.0.0
     # via -r requirements.in
 idna==3.11
     # via
-    #   anyio
-    #   httpx
     #   hyperlink
     #   requests
 mutagen==1.47.0
@@ -43,7 +32,7 @@ pycparser==3.0
     # via cffi
 pycryptodomex==3.23.0
     # via yt-dlp
-requests==2.32.5
+requests==2.33.0
     # via
     #   gallery-dl
     #   yt-dlp
@@ -53,7 +42,7 @@ urllib3==2.6.3
     #   yt-dlp
 websockets==16.0
     # via yt-dlp
-yt-dlp==2026.2.21
+yt-dlp==2026.3.17
     # via -r requirements.in
-yt-dlp-ejs==0.5.0
+yt-dlp-ejs==0.8.0
     # via yt-dlp

yt-dlp_alexwlchan.py (8610) → yt-dlp_alexwlchan.py (8729)

diff --git a/yt-dlp_alexwlchan.py b/yt-dlp_alexwlchan.py
index 9bf40a4..4c702a7 100755
--- a/yt-dlp_alexwlchan.py
+++ b/yt-dlp_alexwlchan.py
@@ -4,13 +4,15 @@ from datetime import datetime, timezone
 import json
 from pathlib import Path
 import re
+import ssl
 import subprocess
 import sys
 import tempfile
 from typing import Any, TypedDict
+import urllib.request
 
+import certifi
 from chives.media import create_video_entity, VideoEntity
-import httpx
 import hyperlink
 from yt_dlp import YoutubeDL
 from yt_dlp.networking.exceptions import HTTPError as YouTubeDLHTTPError
@@ -66,16 +68,18 @@ def download_file(out_dir: Path, url: str, basename: str) -> Path:
     """
     Download an image, and pick a file extension based on the image type.
     """
-    # Download the bytes, and save them to a file.
-    resp = httpx.get(url)
-    resp.raise_for_status()
+    ssl_context = ssl.create_default_context(cafile=certifi.where())
 
-    suffix = _choose_filename_suffix(resp.headers["content-type"])
+    with urllib.request.urlopen(url, context=ssl_context) as resp:
+        img_data = resp.read()
+        resp.close()
+
+        suffix = _choose_filename_suffix(resp.headers["content-type"])
 
     out_path = out_dir / (basename + suffix)
 
     with open(out_path, "xb") as out_file:
-        out_file.write(resp.content)
+        out_file.write(img_data)
 
     return out_path