File-Converter / app.py
attendantelectro's picture
Upload 3 files
0ad7c19 verified
raw
history blame
4.22 kB
# 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}")