File size: 6,097 Bytes
6bc136a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from typing import List, Optional, Tuple
import gradio
import os
import requests
import tempfile
from PIL import ImageGrab, Image  # Para manejar imágenes desde el portapapeles

from ffff import state_manager, wording
from ffff.common_helper import get_first
from ffff.filesystem import filter_audio_paths, filter_image_paths, has_audio, has_image, is_video, get_file_size
from ffff.vision import get_video_frame, normalize_frame_color
from ffff.uis.core import register_ui_component
from ffff.uis.typing import File

FILE_SIZE_LIMIT = 512 * 1024 * 1024

# Variables globales para almacenar el archivo cargado
SOURCE_FILE: Optional[gradio.File] = None
SOURCE_IMAGE: Optional[gradio.Image] = None
SOURCE_VIDEO: Optional[gradio.Video] = None


def render() -> None:
    global SOURCE_FILE
    global SOURCE_IMAGE
    global SOURCE_VIDEO

    has_source_audio = has_audio(state_manager.get_item('source_paths'))
    has_source_image = has_image(state_manager.get_item('source_paths'))
    has_source_video = is_video(state_manager.get_item('source_paths'))

    SOURCE_FILE = gradio.File(
        file_count='single',
        file_types=['image', 'video'],
        label=wording.get('uis.source_file'),
        value=state_manager.get_item('source_paths') if has_source_audio or has_source_image or has_source_video else None
    )

    source_file_path = state_manager.get_item('source_paths')[0] if state_manager.get_item('source_paths') else None
    source_image_args = {'show_label': False, 'visible': False}
    source_video_args = {'show_label': False, 'visible': False}

    if has_source_image:
        source_image_args['value'] = source_file_path
        source_image_args['visible'] = True

    if has_source_video:
        if get_file_size(source_file_path) > FILE_SIZE_LIMIT:
            preview_vision_frame = normalize_frame_color(get_video_frame(source_file_path))
            source_image_args['value'] = preview_vision_frame
            source_image_args['visible'] = True
        else:
            source_video_args['value'] = source_file_path
            source_video_args['visible'] = True

    SOURCE_IMAGE = gradio.Image(**source_image_args)
    SOURCE_VIDEO = gradio.Video(**source_video_args)

    register_ui_component('source_image', SOURCE_IMAGE)
    register_ui_component('source_video', SOURCE_VIDEO)


def listen() -> None:
    SOURCE_FILE.change(update, inputs=SOURCE_FILE, outputs=[SOURCE_IMAGE, SOURCE_VIDEO])


def update(file: File) -> Tuple[gradio.Image, gradio.Video]:
    if file and has_image([file.name]):
        state_manager.set_item('source_paths', [file.name])
        return gradio.Image(value=file.name, visible=True), gradio.Video(value=None, visible=False)
    if file and is_video(file.name):
        state_manager.set_item('source_paths', [file.name])
        if get_file_size(file.name) > FILE_SIZE_LIMIT:
            preview_vision_frame = normalize_frame_color(get_video_frame(file.name))
            return gradio.Image(value=preview_vision_frame, visible=True), gradio.Video(value=None, visible=False)
        return gradio.Image(value=None, visible=False), gradio.Video(value=file.name, visible=True)
    state_manager.clear_item('source_paths')
    return gradio.Image(value=None, visible=False), gradio.Video(value=None, visible=False)


# Función para descargar un archivo desde URL
def download_file_from_url(url: str) -> Optional[str]:
    try:
        response = requests.get(url, stream=True)
        response.raise_for_status()
        temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(url)[-1])
        with open(temp_file.name, 'wb') as file:
            for chunk in response.iter_content(chunk_size=8192):
                file.write(chunk)
        return temp_file.name
    except Exception as e:
        print(f"Error al descargar el archivo: {e}")
        return None


def handle_url_input(url: str) -> Tuple[gradio.Image, gradio.Video]:
    downloaded_file_path = download_file_from_url(url)
    if downloaded_file_path:
        state_manager.set_item('source_paths', [downloaded_file_path])
        if has_image([downloaded_file_path]):
            return gradio.Image(value=downloaded_file_path, visible=True), gradio.Video(value=None, visible=False)
        if is_video(downloaded_file_path):
            if get_file_size(downloaded_file_path) > FILE_SIZE_LIMIT:
                preview_vision_frame = normalize_frame_color(get_video_frame(downloaded_file_path))
                return gradio.Image(value=preview_vision_frame, visible=True), gradio.Video(value=None, visible=False)
            return gradio.Image(value=None, visible=False), gradio.Video(value=downloaded_file_path, visible=True)
    return gradio.Image(value=None, visible=False), gradio.Video(value=None, visible=False)


def handle_paste() -> Tuple[gradio.Image, gradio.Video]:
    try:
        image = ImageGrab.grabclipboard()
        if isinstance(image, Image.Image):
            temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
            image.save(temp_file.name)
            state_manager.set_item('source_paths', [temp_file.name])
            return gradio.Image(value=temp_file.name, visible=True), gradio.Video(value=None, visible=False)
    except Exception as e:
        print(f"Error al manejar el portapapeles: {e}")
    return gradio.Image(value=None, visible=False), gradio.Video(value=None, visible=False)


def cargar_archivo(archivo_seleccionado: str) -> Tuple[gradio.Image, gradio.Video]:
    state_manager.set_item('source_paths', [archivo_seleccionado])
    if has_image([archivo_seleccionado]):
        return gradio.Image(value=archivo_seleccionado, visible=True), gradio.Video(value=None, visible=False)
    if is_video(archivo_seleccionado):
        return gradio.Image(value=None, visible=False), gradio.Video(value=archivo_seleccionado, visible=True)
    return gradio.Image(value=None, visible=False), gradio.Video(value=None, visible=False)