# app.py import os import zipfile import rarfile from PyPDF2 import PdfReader, PdfWriter from moviepy.editor import VideoFileClip from pydub import AudioSegment from PIL import Image import pdf2image import streamlit as st def convert_file(input_path, output_path): if input_path.endswith('.pdf'): # Convert PDF to WEBP images = pdf2image.convert_from_path(input_path) for i, image in enumerate(images): image.save(f"{os.path.splitext(output_path)[0]}_page_{i+1}.webp", 'WEBP') # Convert WEBP back to PDF webp_images = [Image.open(f"{os.path.splitext(output_path)[0]}_page_{i+1}.webp") for i in range(len(images))] webp_images[0].save(output_path, 'PDF', resolution=100.0, save_all=True, append_images=webp_images[1:]) elif input_path.endswith('.mp4'): # Convert MP4 to MKV video = VideoFileClip(input_path) video.write_videofile(output_path, codec='libx264') elif input_path.endswith('.wav'): # Convert WAV to MP3 audio = AudioSegment.from_wav(input_path) audio.export(output_path, format='mp3') elif input_path.endswith(('.png', '.jpg')): # Convert PNG/JPG to WEBP image = Image.open(input_path) image.save(output_path, 'WEBP') def extract_and_convert(file_path): if file_path.endswith('.zip'): with zipfile.ZipFile(file_path, 'r') as zip_ref: zip_ref.extractall(os.path.splitext(file_path)[0]) extracted_dir = os.path.splitext(file_path)[0] elif file_path.endswith('.rar'): with rarfile.RarFile(file_path, 'r') as rar_ref: rar_ref.extractall(os.path.splitext(file_path)[0]) extracted_dir = os.path.splitext(file_path)[0] else: return for root, _, files in os.walk(extracted_dir): for file in files: input_path = os.path.join(root, file) output_path = os.path.join(root, os.path.splitext(file)[0] + get_output_extension(file)) convert_file(input_path, output_path) def get_output_extension(file): if file.endswith('.pdf'): return '.pdf' elif file.endswith('.mp4'): return '.mkv' elif file.endswith('.wav'): return '.mp3' elif file.endswith(('.png', '.jpg')): return '.webp' return '' # Streamlit UI st.title("File Converter Space") # Language selection language = st.selectbox("Select Language / انتخاب زبان", ["English", "فارسی"]) if language == "English": description = """ This space allows you to convert files between various formats. Supported conversions: - PDF to WEBP and back to PDF - MP4 to MKV - WAV to MP3 - PNG/JPG to WEBP """ upload_label = "Choose a file" convert_button = "Convert Files" success_message = "Files converted successfully!" converted_files_label = "Converted Files:" else: description = """ این اسپیس به شما امکان می‌دهد فایل‌ها را بین فرمت‌های مختلف تبدیل کنید. تبدیل‌های پشتیبانی شده: - PDF به WEBP و بازگشت به PDF - MP4 به MKV - WAV به MP3 - PNG/JPG به WEBP """ upload_label = "یک فایل انتخاب کنید" convert_button = "تبدیل فایل‌ها" success_message = "فایل‌ها با موفقیت تبدیل شدند!" converted_files_label = "فایل‌های تبدیل شده:" st.write(description) uploaded_file = st.file_uploader(upload_label, type=['zip', 'rar']) if uploaded_file is not None: file_path = f"temp_{uploaded_file.name}" with open(file_path, "wb") as f: f.write(uploaded_file.getbuffer()) st.success("File uploaded successfully!") if st.button(convert_button): extract_and_convert(file_path) st.success(success_message) # Display converted files st.write(converted_files_label) extracted_dir = os.path.splitext(file_path)[0] for root, _, files in os.walk(extracted_dir): for file in files: if file.endswith(('.pdf', '.mkv', '.mp3', '.webp')): st.write(f"- {file}")