Fixed issue where file extenions not found and auth timeout

This commit is contained in:
2025-10-24 13:43:03 +13:00
parent 7580dc3f94
commit 6d9a078656
12 changed files with 1272 additions and 15 deletions
+69 -2
View File
@@ -24,7 +24,7 @@ class Resource:
self.content: Optional[bytes] = None
self.url = url
self.hash: Optional[_hashlib.HASH] = None
self.extension = extension
self.extension = self._normalize_extension(extension)
self.download_function = download_function
if not self.extension:
self.extension = self._determine_extension()
@@ -45,6 +45,13 @@ class Resource:
raise
if content:
self.content = content
# If we didn't have an extension before, try to detect from content
if not self.extension:
logger.debug(f"Attempting content-based extension detection for {self.url}")
detected = self._detect_extension_by_content()
self.extension = self._normalize_extension(detected) if detected else None
if not self.hash and self.content:
self.create_hash()
@@ -54,9 +61,69 @@ class Resource:
def _determine_extension(self) -> Optional[str]:
extension_pattern = re.compile(r".*(\..{3,5})$")
stripped_url = urllib.parse.urlsplit(self.url).path
# Special handling for Reddit media URLs
if self.url.startswith("https://www.reddit.com/media"):
logger.debug(f"Detected Reddit media URL: {self.url}")
parsed_url = urllib.parse.urlparse(self.url)
url_param = urllib.parse.parse_qs(parsed_url.query).get('url', [None])[0]
if url_param:
decoded_url = urllib.parse.unquote(url_param)
logger.debug(f"Reddit media URL decoded to: {decoded_url}")
stripped_url = urllib.parse.urlsplit(decoded_url).path
# Also handle preview.redd.it URLs which might not have extensions
elif "preview.redd.it" in self.url and not stripped_url.endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')):
logger.debug(f"Detected preview.redd.it URL without extension: {self.url}")
# For preview URLs, try to infer from common patterns or add fallback logic
match = re.search(extension_pattern, stripped_url)
if match:
return match.group(1)
extension = match.group(1)
logger.debug(f"URL {self.url} -> extracted extension: {extension} (from path: {stripped_url})")
return self._normalize_extension(extension)
else:
logger.warning(f"Could not determine extension for URL: {self.url} (path: {stripped_url})")
# As a last resort, if we have content, try to detect by magic numbers
if hasattr(self, 'content') and self.content:
detected = self._detect_extension_by_content()
return self._normalize_extension(detected) if detected else None
return None
def _detect_extension_by_content(self) -> Optional[str]:
"""Detect file extension by examining file content (magic numbers)"""
if not self.content or len(self.content) < 16:
return None
# Check for common image formats
if self.content.startswith(b'\xFF\xD8\xFF'):
logger.debug(f"Detected JPEG by magic number for URL: {self.url}")
return '.jpg'
elif self.content.startswith(b'\x89PNG\r\n\x1a\n'):
logger.debug(f"Detected PNG by magic number for URL: {self.url}")
return '.png'
elif self.content.startswith(b'GIF87a') or self.content.startswith(b'GIF89a'):
logger.debug(f"Detected GIF by magic number for URL: {self.url}")
return '.gif'
elif self.content.startswith(b'RIFF') and self.content[8:12] == b'WEBP':
logger.debug(f"Detected WebP by magic number for URL: {self.url}")
return '.webp'
elif self.content.startswith(b'BM'):
logger.debug(f"Detected BMP by magic number for URL: {self.url}")
return '.bmp'
logger.debug(f"Could not detect file type by magic number for URL: {self.url}")
return None
def _normalize_extension(self, extension: Optional[str]) -> Optional[str]:
"""Normalize extension to lowercase for consistency"""
if not extension:
return None
normalized = extension.lower()
logger.debug(f"Normalized extension '{extension}' to '{normalized}'")
return normalized
@staticmethod
def http_download(url: str, download_parameters: dict) -> Optional[bytes]: