# common/utils.py import urllib.parse import re import constants def normalize_url(url: str) -> str: parsed = urllib.parse.urlparse(url) clean = parsed.scheme + "://" + parsed.netloc + parsed.path return clean.rstrip("/") def extract_real_video_url(url: str) -> str: if not url: return "" parsed_url = urllib.parse.urlparse(url) query_params = urllib.parse.parse_qs(parsed_url.query) for param_name, param_values in query_params.items(): for value in param_values: if value.startswith(('http://', 'https://')): decoded_value = urllib.parse.unquote(value) if any(ext in decoded_value.lower() for ext in constants.VIDEO_EXTENSIONS): return decoded_value decoded_url = urllib.parse.unquote(url) if decoded_url != url and any(ext in decoded_url.lower() for ext in constants.VIDEO_EXTENSIONS): return decoded_url return url # ⚖️ Elite Fix: Deterministic Credibility Engine (Rules before AI) def get_domain_credibility(url): domain = urllib.parse.urlparse(url).netloc.lower() if domain.endswith(('.gov', '.edu', '.mil', 'arxiv.org', 'nature.com', 'science.org', 'nasa.gov')): return "High_Scientific_Gov" elif domain.endswith(('.org', '.com', '.net')) and any(x in domain for x in ['news', 'bbc', 'cnn', 'reuters', 'natgeo', 'space.com']): return "Medium_Mainstream_Media" elif any(x in domain for x in ['reddit', 'medium', 'quora', 'blogspot', 'wordpress', 'pinterest']): return "Low_Fringe_UGC" else: return "Unknown_Evaluate" # 🛑 NEW: Bouncer for Banned Domains (TikTok, Pinterest, Dailymotion etc.) def is_banned_domain(url: str) -> bool: try: domain = urllib.parse.urlparse(url).netloc.lower() # इन साइट्स पर कोई आर्टिकल नहीं होता, सिर्फ UI टेक्स्ट होता है banned_keywords = ['tiktok.com', 'pinterest.', 'dailymotion.com', 'instagram.com', 'facebook.com', 'wattpad.com'] return any(banned in domain for banned in banned_keywords) except: return False # 🎥 NEW: YouTube ID Extractor def get_youtube_video_id(url: str): try: parsed_url = urllib.parse.urlparse(url) if 'youtube.com' in parsed_url.netloc: if parsed_url.path == '/watch': return urllib.parse.parse_qs(parsed_url.query).get('v', [None])[0] elif parsed_url.path.startswith(('/embed/', '/v/')): return parsed_url.path.split('/')[2] elif 'youtu.be' in parsed_url.netloc: return parsed_url.path[1:] except: pass return None