siftlode/backend/app/youtube/shorts.py

33 lines
1 KiB
Python
Raw Permalink Normal View History

"""Confirm whether a video is a Short by probing youtube.com/shorts/<id>.
A real Short returns HTTP 200 at that URL; a regular video redirects to /watch.
This uses no API quota."""
import httpx
SHORTS_URL = "https://www.youtube.com/shorts/{video_id}"
# The SOCS cookie skips YouTube's cookie-consent interstitial, which otherwise
# redirects every server-side request to consent.youtube.com.
_HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Cookie": "SOCS=CAI",
}
def probe_is_short(client: httpx.Client, video_id: str) -> bool | None:
"""True if a Short, False if a regular video, None if undetermined (retry later)."""
try:
resp = client.get(
SHORTS_URL.format(video_id=video_id), follow_redirects=False
)
except httpx.HTTPError:
return None
if resp.status_code == 200:
return True
if resp.status_code in (301, 302, 303, 307, 308):
return False
return None
def make_client() -> httpx.Client:
return httpx.Client(timeout=10.0, headers=_HEADERS)