| import os |
| import tempfile |
| import requests |
| from PIL import Image |
| from io import BytesIO |
| import PyPDF2 |
| from urllib.parse import urlparse |
| import speech_recognition as sr |
|
|
| |
| try: |
| import moviepy.editor as mp |
| MOVIEPY_AVAILABLE = True |
| except ImportError: |
| MOVIEPY_AVAILABLE = False |
|
|
| try: |
| import cv2 |
| CV2_AVAILABLE = True |
| except ImportError: |
| CV2_AVAILABLE = False |
|
|
| try: |
| from pydub import AudioSegment |
| PYDUB_AVAILABLE = True |
| except ImportError: |
| PYDUB_AVAILABLE = False |
|
|
| try: |
| import av |
| AV_AVAILABLE = True |
| except ImportError: |
| AV_AVAILABLE = False |
|
|
| |
| def analyze_url_type(url: str) -> str: |
| """تحديد نوع الرابط بناء على النطاق""" |
| domain = urlparse(url).netloc.lower() |
| if "youtube.com" in domain or "youtu.be" in domain: |
| return "YouTube" |
| if "github.com" in domain: |
| return "GitHub" |
| if "twitter.com" in domain or "x.com" in domain: |
| return "تغريدة" |
| if domain.endswith(".pdf"): |
| return "ملف PDF" |
| return "موقع ويب عام" |
|
|
| def fix_url(url: str) -> str: |
| """إصلاح الروابط الناقصة""" |
| if not url.startswith(("http://", "https://")): |
| return "https://" + url.lstrip("//") |
| return url |
|
|
| def detect_media_type(url: str) -> str: |
| """تحديد نوع الملف من امتداده""" |
| url = url.lower() |
| if url.endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')): |
| return 'image' |
| elif url.endswith(('.mp4', '.mov', '.avi', '.webm')): |
| return 'video' |
| elif url.endswith(('.mp3', '.wav', '.ogg', '.m4a')): |
| return 'audio' |
| elif url.endswith('.pdf'): |
| return 'pdf' |
| return 'link' |
|
|
| |
| def analyze_image_from_url(image_url: str) -> str: |
| """تحليل الصور من الروابط""" |
| response = requests.get(image_url) |
| response.raise_for_status() |
| image = Image.open(BytesIO(response.content)) |
| return f"تحليل الصورة: الحجم {image.size}، الصيغة {image.format}" |
|
|
| def analyze_pdf_from_url(pdf_url: str) -> str: |
| """استخراج النص من ملفات PDF""" |
| response = requests.get(pdf_url) |
| response.raise_for_status() |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_file: |
| temp_file.write(response.content) |
| temp_path = temp_file.name |
| |
| try: |
| with open(temp_path, "rb") as f: |
| reader = PyPDF2.PdfReader(f) |
| text = "".join([page.extract_text() or "" for page in reader.pages]) |
| return f"تم استخراج النص التالي من PDF:\n{text[:500]}..." |
| finally: |
| os.remove(temp_path) |
|
|
| def extract_text_from_audio_file(audio_path: str) -> str: |
| """استخراج النص من الملفات الصوتية""" |
| recognizer = sr.Recognizer() |
| with sr.AudioFile(audio_path) as source: |
| audio = recognizer.record(source) |
| try: |
| return recognizer.recognize_google(audio, language="ar-SA") |
| except sr.UnknownValueError: |
| return "لم أتمكن من التعرف على الصوت" |
| except sr.RequestError: |
| return "خطأ في الاتصال بخدمة التعرف على الصوت" |
|
|
| def analyze_audio_from_url(audio_url: str) -> str: |
| """تحليل الملفات الصوتية من الروابط""" |
| response = requests.get(audio_url) |
| response.raise_for_status() |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio: |
| temp_audio.write(response.content) |
| temp_path = temp_audio.name |
| |
| try: |
| text = extract_text_from_audio_file(temp_path) |
| return f"نص الصوت:\n{text}" |
| finally: |
| os.remove(temp_path) |
|
|
| def analyze_video_from_url(video_url: str) -> str: |
| """تحليل الفيديو باستخدام moviepy""" |
| if not MOVIEPY_AVAILABLE: |
| return "مكتبة moviepy غير متوفرة لتحليل الفيديو" |
|
|
| response = requests.get(video_url) |
| response.raise_for_status() |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp_video: |
| temp_video.write(response.content) |
| video_path = temp_video.name |
|
|
| audio_path = video_path.replace(".mp4", ".wav") |
| try: |
| video = mp.VideoFileClip(video_path) |
| video.audio.write_audiofile(audio_path, verbose=False, logger=None) |
| text = extract_text_from_audio_file(audio_path) |
| return f"نص الفيديو:\n{text}" |
| finally: |
| os.remove(video_path) |
| if os.path.exists(audio_path): |
| os.remove(audio_path) |
|
|
| |
| def process_video_with_ffmpeg(): |
| """معالجة الفيديو باستخدام ffmpeg (إذا كان متاحًا)""" |
| if not has_ffmpeg(): |
| return "FFmpeg غير متوفر" |
| |
| try: |
| ffmpeg.input('input.mp4').output('output.mp4', ss=10, t=5).run() |
| return "تم معالجة الفيديو باستخدام FFmpeg" |
| except Exception as e: |
| return f"خطأ في معالجة الفيديو: {str(e)}" |
|
|
| def process_video_with_cv2(): |
| """معالجة الفيديو باستخدام OpenCV (إذا كان متاحًا)""" |
| if not CV2_AVAILABLE: |
| return "OpenCV غير متوفر" |
| |
| cap = cv2.VideoCapture('video.mp4') |
| results = [] |
| |
| try: |
| while cap.isOpened(): |
| ret, frame = cap.read() |
| if not ret: |
| break |
| |
| results.append(frame) |
| return "تم معالجة الفيديو باستخدام OpenCV" |
| finally: |
| cap.release() |
|
|
| def process_video_with_pydub(): |
| """استخراج الصوت من الفيديو باستخدام pydub (إذا كان متاحًا)""" |
| if not PYDUB_AVAILABLE: |
| return "pydub غير متوفر" |
| |
| try: |
| sound = AudioSegment.from_file("video.mp4") |
| sound.export("audio.mp3", format="mp3") |
| return "تم استخراج الصوت من الفيديو" |
| except Exception as e: |
| return f"خطأ في استخراج الصوت: {str(e)}" |
|
|
| def process_video_with_av(): |
| """معالجة الفيديو باستخدام PyAV (إذا كان متاحًا)""" |
| if not AV_AVAILABLE: |
| return "PyAV غير متوفر" |
| |
| try: |
| container = av.open("video.mp4") |
| frames = [] |
| for frame in container.decode(video=0): |
| frames.append(frame.to_image()) |
| return f"تم استخراج {len(frames)} إطار من الفيديو" |
| except Exception as e: |
| return f"خطأ في معالجة الفيديو: {str(e)}" |
|
|