import os import subprocess import requests from threading import Thread from flask import Flask, request, send_file from werkzeug.utils import secure_filename from pdf2image import convert_from_path from PIL import Image from moviepy.editor import VideoFileClip from pydub import AudioSegment import streamlit as st # Fix werkzeug compatibility for older versions if needed from werkzeug.urls import url_quote # Flask API Setup (برای اینجا فقط به هدف اجرا به عنوان پس‌زمینه استفاده می‌شود) app = Flask(__name__) ALLOWED_EXTENSIONS = {'zip', 'rar', 'pdf', 'wav', 'mp4', 'jpg', 'png', 'jpeg'} def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS # راه‌اندازی API به عنوان پردازش پس‌زمینه def run_api(): # اجرای فایل api.py به صورت subprocess. subprocess.run(['python', 'api.py']) # Streamlit UI def streamlit_app(): st.set_page_config(page_title="File Converter", layout="wide") TEXTS = { "English": { "title": "Universal File Converter", "desc": "Convert files/archives (ZIP/RAR/PDF/WAV/MP4/IMG)", "upload": "Upload File", "error_type": "Unsupported file type!", "success": "Conversion Successful!", "download": "Download" }, "فارسی": { "title": "مبدل جهانی فایل", "desc": "تبدیل فایل/آرشیو (ZIP/RAR/PDF/WAV/MP4/تصویر)", "upload": "آپلود فایل", "error_type": "نوع فایل پشتیبانی نمیشود!", "success": "تبدیل با موفقیت انجام شد!", "download": "دانلود" } } lang = st.sidebar.selectbox("", ["English", "فارسی"]) t = TEXTS[lang] st.title(t["title"]) st.markdown(f"**{t['desc']}**") uploaded = st.file_uploader(t["upload"], type=ALLOWED_EXTENSIONS) if uploaded: file_extension = uploaded.name.split('.')[-1].lower() if file_extension not in ALLOWED_EXTENSIONS: st.error(t["error_type"]) elif st.button("Convert"): try: with st.spinner("Processing..."): response = requests.post( "http://localhost:7860/convert", files={"file": (uploaded.name, uploaded.getvalue(), uploaded.type)}, timeout=300 ) if response.status_code == 200: # استخراج نام فایل خروجی از header Content-Disposition cd = response.headers.get('Content-Disposition', '') filename = None if 'filename=' in cd: filename = cd.split("filename=")[1].strip().strip('"') else: filename = f"converted_{uploaded.name}" st.success(t["success"]) st.download_button( label=t["download"], data=response.content, file_name=filename, ) else: st.error(f"Error {response.status_code}: {response.text}") except Exception as e: st.error(f"Connection error: {str(e)}") if __name__ == '__main__': # اجرای API داخل یک ترد پس‌زمینه (در صورتی که نیاز به اجرای همزمان داشته باشید) Thread(target=run_api, daemon=True).start() # اجرای رابط کاربری Streamlit streamlit_app()