File-Converter / app.py
attendantelectro's picture
Update app.py
fa744e2 verified
raw
history blame
4.18 kB
# app.py
import os
import zipfile
import rarfile
from PyPDF2 import PdfReader, PdfWriter
from pydub import AudioSegment
from PIL import Image
import pdf2image
import streamlit as st
import ffmpeg
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 using ffmpeg
ffmpeg.input(input_path).output(output_path, codec='libx264').run()
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}")