Spaces:
Runtime error
Runtime error
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)}" | |