File size: 2,752 Bytes
d8237e6
 
6f76902
aec01ff
0d972cc
e55fa66
cf6d608
d8237e6
4b959ff
0fdf15f
 
00111e4
 
 
 
4b959ff
e1a05e8
67bbbbc
 
e1a05e8
d8237e6
00111e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
02c7e8f
d8237e6
02c7e8f
 
 
00111e4
02c7e8f
 
6f76902
02c7e8f
 
00111e4
4b959ff
02c7e8f
 
 
d0e5ac1
02c7e8f
d8237e6
 
02c7e8f
4b959ff
d8237e6
02c7e8f
d8237e6
4b959ff
 
d8237e6
4b959ff
009280d
4b959ff
 
d8237e6
 
 
 
4b959ff
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import gradio as gr
from PIL import Image
import os
import ffmpeg
import tempfile
import threading
import shutil

# Atur tema Gradio
gr.themes.Soft()

def delete_temp_dir(directory, delay=900):  # 15 minutes = 900 seconds
    timer = threading.Timer(delay, shutil.rmtree, [directory])
    timer.start()
    
# Format gambar yang didukung
supported_formats = sorted(Image.SAVE.keys()) or ['BLP', 'BMP', 'BUFR', 'DDS', 'DIB', 'EPS',
                                                  'GIF', 'GRIB', 'HDF5', 'ICNS', 'ICO', 'IM',
                                                  'JPEG', 'JPEG2000', 'MPO', 'MSP', 'PALM', 'PCX',
                                                  'PDF', 'PNG', 'PPM', 'SGI', 'SPIDER', 'TGA', 'TIFF']

CACHE_DIR = tempfile.mkdtemp()
delete_temp_dir(CACHE_DIR, delay=900)  # Clean up cache after 15 minutes

def sanitize_filename(filename):
    """Sanitize filename by removing special characters and spaces."""
    return re.sub(r'[^a-zA-Z0-9_.-]', '_', filename)

def clean_cache():
    """Remove files in the cache directory older than 15 minutes."""
    now = time.time()
    for file in os.listdir(CACHE_DIR):
        file_path = os.path.join(CACHE_DIR, file)
        if os.path.isfile(file_path) and now - os.path.getmtime(file_path) > 900:  # 15 minutes
            os.remove(file_path)
            
def convert_image(image_path, target_format):
    try:
        # Pastikan target format valid
        if target_format.lower() not in supported_formats:
            return "Error: Unsupported target format."

        # Sanitize file path
        sanitized_base_name = sanitize_filename(os.path.splitext(os.path.basename(image_path))[0])
        
        # Nama file keluaran
        output_file = os.path.join(CACHE_DIR, f"flowly_ai_image_converter_{sanitized_base_name}.{target_format.lower()}")

        # Gunakan ffmpeg untuk konversi
        ffmpeg.input(image_path).output(output_file, format=target_format).overwrite_output().run(
            capture_stdout=True, capture_stderr=True
        )

        return output_file  # Return path ke file hasil
    except Exception as e:
        return f"Error: {e}"
        
# Antarmuka Gradio
interface = gr.Interface(
    fn=convert_image,
    inputs=[
        gr.Image(label="Upload Image", type="filepath", height=512),  # Input gambar
        gr.Dropdown(label="Select Target Format", choices=supported_formats)  # Pilih format
    ],
    outputs=gr.File(label="Converted Image"),  # Output file hasil
    title="Image Format Converter",
    description="Upload an image and select any target format for conversion using FFmpeg.",
    css="footer {visibility: hidden}"  # Sembunyikan footer
)

# Jalankan aplikasi
if __name__ == "__main__":
    interface.launch()