Merge pull request #428 from g0ldyy/development

Development
This commit is contained in:
Goldy
2026-01-02 15:03:25 +01:00
committed by GitHub
3 changed files with 64 additions and 5 deletions
+7
View File
@@ -52,6 +52,13 @@ class DigitalReleaseFilter:
release_date_str = None
if media_type == "movie":
release_date_str = await tmdb.get_upcoming_movie_release_date(tmdb_id)
if not release_date_str:
# Check watch providers as fallback
has_watch_providers = await tmdb.has_watch_providers(tmdb_id)
if has_watch_providers:
# Treat as released a long time ago
release_date_str = "1970-01-01"
elif media_type == "series":
release_date_str = await tmdb.get_episode_air_date(
tmdb_id, season, episode
+13
View File
@@ -77,3 +77,16 @@ class TMDBApi:
except Exception as e:
logger.error(f"TMDB: Error converting IMDB ID {imdb_id}: {e}")
return None
async def has_watch_providers(self, tmdb_id: str):
try:
url = f"{self.base_url}/movie/{tmdb_id}/watch/providers"
async with self.session.get(url, headers=self.headers) as response:
if response.status != 200:
return None
data = await response.json()
return bool(data.get("results"))
except Exception as e:
logger.error(f"TMDB: Error getting watch providers for {tmdb_id}: {e}")
return None
+44 -5
View File
@@ -1,3 +1,5 @@
import ipaddress
import aiohttp
from fastapi import Request
@@ -9,13 +11,50 @@ NO_CACHE_HEADERS = {
"Expires": "0",
}
IP_REQUEST_HEADERS = [
"X-Client-Ip",
"Cf-Connecting-Ip",
"Do-Connecting-Ip",
"Fastly-Client-Ip",
"True-Client-Ip",
"X-Real-Ip",
"X-Cluster-Client-Ip",
"X-Forwarded",
"X-Forwarded-For",
"Forwarded-For",
"Forwarded",
"X-Appengine-User-Ip",
"Cf-Pseudo-IPv4",
]
def is_public_ip(ip: str):
try:
parsed_ip = ipaddress.ip_address(ip)
return not parsed_ip.is_private and not parsed_ip.is_loopback
except ValueError:
return False
def get_client_ip(request: Request):
return (
request.headers["cf-connecting-ip"]
if "cf-connecting-ip" in request.headers
else request.client.host
)
for header in IP_REQUEST_HEADERS:
header_value = request.headers.get(header)
if not header_value:
continue
if header == "X-Forwarded-For":
for ip_part in header_value.split(","):
ip_part = ip_part.strip()
if is_public_ip(ip_part):
return ip_part
else:
if is_public_ip(header_value):
return header_value
if request.client and request.client.host and is_public_ip(request.client.host):
return request.client.host
return ""
async def fetch_with_proxy_fallback(