diff --git a/VERSION b/VERSION index 4ad03d1..2fef18a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.8.20 +1.8.21 diff --git a/src/torchlight/FFmpegAudioPlayer.py b/src/torchlight/FFmpegAudioPlayer.py index 8f82dc0..f88c39b 100644 --- a/src/torchlight/FFmpegAudioPlayer.py +++ b/src/torchlight/FFmpegAudioPlayer.py @@ -19,6 +19,26 @@ SAMPLEBYTES = 2 +# Extra request headers some hosts require, keyed by domain. Matched against the URI's +# hostname (exact or subdomain), so a new host means adding an entry here rather than +# another special case inside the streaming path. +DOMAIN_HEADER_PROFILES: dict[str, dict[str, str]] = { + "myinstants.com": { + "Referer": MYINSTANTS_URL, + "Sec-Fetch-Dest": "audio", + "Sec-Fetch-Mode": "no-cors", + "Sec-Fetch-Site": "same-origin", + }, +} + + +def get_domain_headers(uri: str) -> dict[str, str]: + hostname = (urlparse(uri).hostname or "").lower() + for domain, headers in DOMAIN_HEADER_PROFILES.items(): + if hostname == domain or hostname.endswith(f".{domain}"): + return headers + return {} + class FFmpegAudioPlayer: VALID_CALLBACKS = ["Play", "Stop", "Update"] @@ -120,11 +140,8 @@ async def _stream_url_to_ffmpeg(self, uri: str, ffmpeg_command: list[str], needs "Accept": "*/*", "Accept-Language": "en-US,en;q=0.9", } - if needs_cf_bypass and "myinstants.com" in uri: - headers["Referer"] = MYINSTANTS_URL - headers["Sec-Fetch-Dest"] = "audio" - headers["Sec-Fetch-Mode"] = "no-cors" - headers["Sec-Fetch-Site"] = "same-origin" + if needs_cf_bypass: + headers.update(get_domain_headers(uri)) if needs_cf_bypass: queue: asyncio.Queue[bytes | None] = asyncio.Queue(maxsize=10)