Moibe commited on
Commit
6d83a58
1 Parent(s): feb9e51
Files changed (7) hide show
  1. app.py +4 -22
  2. auth.py +10 -28
  3. batcher.py +0 -2
  4. frameFixer.py +1 -2
  5. roop/utilities.py +195 -199
  6. sulkuPypi.py +113 -130
  7. tools.py +4 -9
app.py CHANGED
@@ -1,33 +1,23 @@
1
  import gradio as gr
2
  import sulkuPypi
3
  from funciones import mass
4
- from data import usuarios
5
- import time
6
- import nycklar.nodes
7
  import tools
8
  import auth
9
- import ast
10
 
11
  #Funciones
12
 
13
  #Función principal
14
  def perform(input1, input2, request: gr.Request):
15
 
16
- print("5.- Entré a Perform, checando persistencia...")
17
-
18
  tokens = sulkuPypi.getTokens(sulkuPypi.encripta(request.username).decode("utf-8")) #Todo en una línea.
19
- print("Ahora tienes 555: ", tokens)
20
-
21
  #Después autoriza.
22
  #Si está autorizada puede ejecutar la tarea, ésta lógica si está a cargo aquí, por parte de la app y su desarrollador, no de Sulku.
23
-
24
  autorizacion = sulkuPypi.authorize(gr.State.tokens, 'picswap')
25
  print("La autorización es: ", autorizacion)
26
 
27
- if autorizacion is True:
28
-
29
  path = mass(input1,input2)
30
-
31
  else:
32
  info_window = "Out of credits..."
33
  path = 'no-credits.png'
@@ -75,7 +65,6 @@ source_image = gr.Image(label="Source")
75
  destination_image = gr.Image(label="Destination")
76
 
77
  #Outputs
78
- print("1.- Entré en app.py...")
79
  creditos = None
80
  result_image = gr.Image(label="Blend Result")
81
  txt_credits = gr.Textbox(label="Credits Available", value="", interactive=False)
@@ -83,21 +72,14 @@ html_credits = gr.HTML()
83
  lbl_console = gr.Label(label="AI Terminal Messages", value="AI Engine ready...", container=True)
84
  btn_buy = gr.Button("Buy More", visible=False, size='lg')
85
 
86
- #valor = gr.State.tokens
87
- valor = ""
88
-
89
  with gr.Blocks(theme=gr.themes.Base(), css="footer {visibility: hidden}") as main:
90
-
91
- print("2.- Estoy imprimiendo desde blocks...")
92
-
93
- #Función, input, output
94
  main.load(display_tokens, None, html_credits)
95
 
96
  with gr.Row():
97
-
98
  demo = gr.Interface(
99
  fn=perform,
100
- title="",
101
  inputs=[source_image, destination_image],
102
  outputs=[result_image, lbl_console, html_credits, btn_buy],
103
  allow_flagging='never'
 
1
  import gradio as gr
2
  import sulkuPypi
3
  from funciones import mass
 
 
 
4
  import tools
5
  import auth
 
6
 
7
  #Funciones
8
 
9
  #Función principal
10
  def perform(input1, input2, request: gr.Request):
11
 
 
 
12
  tokens = sulkuPypi.getTokens(sulkuPypi.encripta(request.username).decode("utf-8")) #Todo en una línea.
13
+
 
14
  #Después autoriza.
15
  #Si está autorizada puede ejecutar la tarea, ésta lógica si está a cargo aquí, por parte de la app y su desarrollador, no de Sulku.
 
16
  autorizacion = sulkuPypi.authorize(gr.State.tokens, 'picswap')
17
  print("La autorización es: ", autorizacion)
18
 
19
+ if autorizacion is True:
 
20
  path = mass(input1,input2)
 
21
  else:
22
  info_window = "Out of credits..."
23
  path = 'no-credits.png'
 
65
  destination_image = gr.Image(label="Destination")
66
 
67
  #Outputs
 
68
  creditos = None
69
  result_image = gr.Image(label="Blend Result")
70
  txt_credits = gr.Textbox(label="Credits Available", value="", interactive=False)
 
72
  lbl_console = gr.Label(label="AI Terminal Messages", value="AI Engine ready...", container=True)
73
  btn_buy = gr.Button("Buy More", visible=False, size='lg')
74
 
 
 
 
75
  with gr.Blocks(theme=gr.themes.Base(), css="footer {visibility: hidden}") as main:
76
+
77
+ #Cargado en Load, Función, input, output
 
 
78
  main.load(display_tokens, None, html_credits)
79
 
80
  with gr.Row():
 
81
  demo = gr.Interface(
82
  fn=perform,
 
83
  inputs=[source_image, destination_image],
84
  outputs=[result_image, lbl_console, html_credits, btn_buy],
85
  allow_flagging='never'
auth.py CHANGED
@@ -1,47 +1,29 @@
1
  #from data import usuarios
2
  import gradio as gr
3
  import sulkuPypi
4
- import time
5
  import ast
6
 
7
- def authenticate(username, password) :
8
-
9
- print("3.- Entré a authenticate...")
10
-
11
- #Future: Obten el dict usuarios desde la API no localmente en ésta app.
12
- cadena_usuarios = sulkuPypi.getData()
13
-
14
- # Convertir la cadena en una lista de tuplas
15
- print("Ahora voy a convertir la cadena de usuarios en una lista: ")
16
  lista_usuarios = ast.literal_eval(cadena_usuarios)
17
 
18
- for u, p, f in lista_usuarios:
19
  #Si el usuario y la contraseña son correctas...
20
  if username == u and password == p:
21
- #Agrego el nombre del usuario al estado general.
22
- gr.State.usuario = username
23
- #Bienvenida al usuario...
24
- print("Welcome 182:", gr.State.usuario)
25
- if f == "new":
26
- print("Usuario Nuevo...")
27
- else:
28
- print("Usuario Normal...")
29
 
30
  #Capsule es el usuario encriptado que enviarás a la API de Sulku.
31
  #El encriptador ahora será parte de Sulku, porque es una herramienta que se requiere para...
32
  #...las comunicaciones con Sulku.
33
-
34
- capsule = sulkuPypi.encripta(gr.State.usuario).decode("utf-8") #decode es para quitarle el 'b
35
- gr.State.capsule = capsule
36
-
37
  #Checa cuantos tokens tiene ese usuario via la API de Sulku:
38
  #FUTURE: Checa si vale la pena guardar éstos estados.
39
  gr.State.tokens = sulkuPypi.getTokens(capsule)
40
-
41
- print(f"Tienes: {gr.State.tokens} tokens. ")
42
- creditos = gr.State.tokens
43
- print(f"Ésta es la cantidad guardada en creditos: {creditos}")
44
-
45
  return True
46
 
47
  #Si no hubo coincidencia regresas un false.
 
1
  #from data import usuarios
2
  import gradio as gr
3
  import sulkuPypi
 
4
  import ast
5
 
6
+ def authenticate(username, password):
7
+ #Future: Obten el dict usuarios desde la API no localmente en ésta app. OK!
8
+ cadena_usuarios = sulkuPypi.getData()
9
+ #Convertir la cadena en una lista de tuplas
 
 
 
 
 
10
  lista_usuarios = ast.literal_eval(cadena_usuarios)
11
 
12
+ for u, p in lista_usuarios:
13
  #Si el usuario y la contraseña son correctas...
14
  if username == u and password == p:
15
+ #Future: Considerar que a más usuarios, más se tardará en repasar ésta lista.
16
+ #Future, pensar como se va a corelacionar con login via Firebase.
 
 
 
 
 
 
17
 
18
  #Capsule es el usuario encriptado que enviarás a la API de Sulku.
19
  #El encriptador ahora será parte de Sulku, porque es una herramienta que se requiere para...
20
  #...las comunicaciones con Sulku.
21
+ capsule = sulkuPypi.encripta(username).decode("utf-8") #decode es para quitarle el 'b
22
+
 
 
23
  #Checa cuantos tokens tiene ese usuario via la API de Sulku:
24
  #FUTURE: Checa si vale la pena guardar éstos estados.
25
  gr.State.tokens = sulkuPypi.getTokens(capsule)
26
+
 
 
 
 
27
  return True
28
 
29
  #Si no hubo coincidencia regresas un false.
batcher.py CHANGED
@@ -6,7 +6,6 @@ pics_dir = "D:/Organizar/ZJB/Esyle/art"
6
  #pics_dir = "D:/Esyle-Prod/videos/next"
7
  pics_name = os.path.basename(pics_dir)
8
  print(pics_name)
9
- time.sleep(1)
10
 
11
  #Crea un nuevo directorio dentro de resultados-pics que contendrá los resultados de éste batch.
12
  resultados_dir = "D:/Esyle-Prod/resultados_pics/"
@@ -27,7 +26,6 @@ for pic in pics:
27
  print("Listo para correr el comando, nos faltan: ", cuantos)
28
  command = "python run.py -s D:/Esyle-Prod/fotos/irina.jpg -t " + pics_dir + "/" + pic + " -o " + resultados_dir + pics_name + "/irina-" + pic + " --frame-processor face_swapper"
29
  print(command)
30
- time.sleep(1)
31
  proc = os.popen(command)
32
  output = proc.read()
33
  cuantos -= 1
 
6
  #pics_dir = "D:/Esyle-Prod/videos/next"
7
  pics_name = os.path.basename(pics_dir)
8
  print(pics_name)
 
9
 
10
  #Crea un nuevo directorio dentro de resultados-pics que contendrá los resultados de éste batch.
11
  resultados_dir = "D:/Esyle-Prod/resultados_pics/"
 
26
  print("Listo para correr el comando, nos faltan: ", cuantos)
27
  command = "python run.py -s D:/Esyle-Prod/fotos/irina.jpg -t " + pics_dir + "/" + pic + " -o " + resultados_dir + pics_name + "/irina-" + pic + " --frame-processor face_swapper"
28
  print(command)
 
29
  proc = os.popen(command)
30
  output = proc.read()
31
  cuantos -= 1
frameFixer.py CHANGED
@@ -69,8 +69,7 @@ def frameFixer(video):
69
  # Si el número del archivo no coincide con el contador, significa que hay un número faltante
70
  print("Archivo y contador diferente:")
71
  print(f"Falta el archivo {i}.png.")
72
- time.sleep(1)
73
-
74
  archivo_faltante = i
75
  #Aquí empieza el proceso de crear el nombre del duplicador:
76
  # Convertimos la variable a string
 
69
  # Si el número del archivo no coincide con el contador, significa que hay un número faltante
70
  print("Archivo y contador diferente:")
71
  print(f"Falta el archivo {i}.png.")
72
+
 
73
  archivo_faltante = i
74
  #Aquí empieza el proceso de crear el nombre del duplicador:
75
  # Convertimos la variable a string
roop/utilities.py CHANGED
@@ -1,199 +1,195 @@
1
- import sys
2
- import time
3
- import glob
4
- import mimetypes
5
- import os
6
- import platform
7
- import shutil
8
- import ssl
9
- import subprocess
10
- import urllib
11
- from pathlib import Path
12
- from typing import List, Optional
13
- from tqdm import tqdm
14
-
15
- import roop.globals
16
-
17
- TEMP_DIRECTORY = 'temp'
18
- TEMP_VIDEO_FILE = 'temp.mp4'
19
-
20
- # monkey patch ssl for mac
21
- if platform.system().lower() == 'darwin':
22
- ssl._create_default_https_context = ssl._create_unverified_context
23
-
24
-
25
- def run_ffmpeg(args: List[str]) -> bool:
26
- print("MOI: Entré a run_ffmpeg...")
27
- commands = ['ffmpeg', '-hide_banner', '-loglevel', roop.globals.log_level]
28
- commands.extend(args)
29
- try:
30
- print("MOI: Estoy en el try del subproceso.")
31
- subprocess.check_output(commands, stderr=subprocess.STDOUT)
32
- return True
33
- except Exception:
34
- print("Moi: Imprimiendo el error...")
35
- print(sys.exc_info()[0])
36
- pass
37
- return False
38
-
39
-
40
- def detect_fps(target_path: str) -> float:
41
- command = ['ffprobe', '-v', 'error', '-select_streams', 'v:0', '-show_entries', 'stream=r_frame_rate', '-of', 'default=noprint_wrappers=1:nokey=1', target_path]
42
- output = subprocess.check_output(command).decode().strip().split('/')
43
- try:
44
- numerator, denominator = map(int, output)
45
- return numerator / denominator
46
- except Exception:
47
- pass
48
- return 30
49
-
50
-
51
- def extract_frames(target_path: str, fps: float = 30) -> bool:
52
- temp_directory_path = get_temp_directory_path(target_path)
53
- temp_frame_quality = roop.globals.temp_frame_quality * 31 // 100
54
- return run_ffmpeg(['-hwaccel', 'auto', '-i', target_path, '-q:v', str(temp_frame_quality), '-pix_fmt', 'rgb24', '-vf', 'fps=' + str(fps), os.path.join(temp_directory_path, '%04d.' + roop.globals.temp_frame_format)])
55
-
56
-
57
- def create_video(target_path: str, fps: float = 30) -> bool:
58
- temp_output_path = get_temp_output_path(target_path)
59
- temp_directory_path = get_temp_directory_path(target_path)
60
- output_video_quality = (roop.globals.output_video_quality + 1) * 51 // 100
61
- commands = ['-hwaccel', 'auto', '-r', str(fps), '-i', os.path.join(temp_directory_path, '%04d.' + roop.globals.temp_frame_format), '-c:v', roop.globals.output_video_encoder]
62
- if roop.globals.output_video_encoder in ['libx264', 'libx265', 'libvpx']:
63
- commands.extend(['-crf', str(output_video_quality)])
64
- if roop.globals.output_video_encoder in ['h264_nvenc', 'hevc_nvenc']:
65
- commands.extend(['-cq', str(output_video_quality)])
66
- commands.extend(['-pix_fmt', 'yuv420p', '-vf', 'colorspace=bt709:iall=bt601-6-625:fast=1', '-y', temp_output_path])
67
-
68
- print("Y así quedan los commands:", commands)
69
- time.sleep(4)
70
- print("MOI: Y se supone que aquí estará a punto de crear el video:")
71
- time.sleep(4)
72
-
73
- # while True:
74
- # # Imprime un mensaje
75
- # print("Pulsa la tecla Y para hacer el video...")
76
-
77
- # # Espera un segundo
78
- # time.sleep(1)
79
-
80
- # # Lee un carácter de la entrada estándar
81
- # key = input()
82
-
83
- # # Si se presiona la tecla Y, sale del bucle
84
- # if key == "Y":
85
- # break
86
-
87
- return run_ffmpeg(commands)
88
-
89
-
90
- def restore_audio(target_path: str, output_path: str) -> None:
91
- print("MOI: Estamos en restore_audio...")
92
- print("Los parámetros recibidos son:")
93
- print("target_path:", target_path)
94
- time.sleep(1)
95
- print("output_path:", output_path)
96
- temp_output_path = get_temp_output_path(target_path)
97
- print("MOI: Éste es el temp_output_path, es audio o video?:")
98
- print(temp_output_path)
99
- time.sleep(1)
100
-
101
- try:
102
- args = ['-i', temp_output_path, '-i', target_path, '-c:v', 'copy', '-map', '0:v:0', '-map', '1:a:0', '-y', output_path]
103
- print("Estos son los args de audio:")
104
- time.sleep(2)
105
- print(args)
106
- time.sleep(10)
107
- done = run_ffmpeg(args)
108
- #done = run_ffmpeg(['-i', temp_output_path, '-i', target_path, '-c:v', 'copy', '-map', '0:v:0', '-map', '1:a:0', '-y', output_path])
109
-
110
- except:
111
- print("Ocurrió un error")
112
- print(sys.exc_info()[0])
113
-
114
- if not done:
115
- move_temp(target_path, output_path)
116
- print("Entre a not done :(")
117
- print("Terminé audio...")
118
- time.sleep(3)
119
-
120
-
121
- def get_temp_frame_paths(target_path: str) -> List[str]:
122
- temp_directory_path = get_temp_directory_path(target_path)
123
- return glob.glob((os.path.join(glob.escape(temp_directory_path), '*.' + roop.globals.temp_frame_format)))
124
-
125
-
126
- def get_temp_directory_path(target_path: str) -> str:
127
- target_name, _ = os.path.splitext(os.path.basename(target_path))
128
- target_directory_path = os.path.dirname(target_path)
129
- return os.path.join(target_directory_path, TEMP_DIRECTORY, target_name)
130
-
131
-
132
- def get_temp_output_path(target_path: str) -> str:
133
- temp_directory_path = get_temp_directory_path(target_path)
134
- return os.path.join(temp_directory_path, TEMP_VIDEO_FILE)
135
-
136
-
137
- def normalize_output_path(source_path: str, target_path: str, output_path: str) -> Optional[str]:
138
- if source_path and target_path and output_path:
139
- source_name, _ = os.path.splitext(os.path.basename(source_path))
140
- target_name, target_extension = os.path.splitext(os.path.basename(target_path))
141
- if os.path.isdir(output_path):
142
- return os.path.join(output_path, source_name + '-' + target_name + target_extension)
143
- return output_path
144
-
145
-
146
- def create_temp(target_path: str) -> None:
147
- temp_directory_path = get_temp_directory_path(target_path)
148
- Path(temp_directory_path).mkdir(parents=True, exist_ok=True)
149
-
150
-
151
- def move_temp(target_path: str, output_path: str) -> None:
152
- temp_output_path = get_temp_output_path(target_path)
153
- if os.path.isfile(temp_output_path):
154
- if os.path.isfile(output_path):
155
- os.remove(output_path)
156
- shutil.move(temp_output_path, output_path)
157
-
158
-
159
- def clean_temp(target_path: str) -> None:
160
- temp_directory_path = get_temp_directory_path(target_path)
161
- parent_directory_path = os.path.dirname(temp_directory_path)
162
- if not roop.globals.keep_frames and os.path.isdir(temp_directory_path):
163
- shutil.rmtree(temp_directory_path)
164
- if os.path.exists(parent_directory_path) and not os.listdir(parent_directory_path):
165
- os.rmdir(parent_directory_path)
166
-
167
-
168
- def has_image_extension(image_path: str) -> bool:
169
- return image_path.lower().endswith(('png', 'jpg', 'jpeg', 'webp'))
170
-
171
-
172
- def is_image(image_path: str) -> bool:
173
- if image_path and os.path.isfile(image_path):
174
- mimetype, _ = mimetypes.guess_type(image_path)
175
- return bool(mimetype and mimetype.startswith('image/'))
176
- return False
177
-
178
-
179
- def is_video(video_path: str) -> bool:
180
- if video_path and os.path.isfile(video_path):
181
- mimetype, _ = mimetypes.guess_type(video_path)
182
- return bool(mimetype and mimetype.startswith('video/'))
183
- return False
184
-
185
-
186
- def conditional_download(download_directory_path: str, urls: List[str]) -> None:
187
- if not os.path.exists(download_directory_path):
188
- os.makedirs(download_directory_path)
189
- for url in urls:
190
- download_file_path = os.path.join(download_directory_path, os.path.basename(url))
191
- if not os.path.exists(download_file_path):
192
- request = urllib.request.urlopen(url) # type: ignore[attr-defined]
193
- total = int(request.headers.get('Content-Length', 0))
194
- with tqdm(total=total, desc='Downloading', unit='B', unit_scale=True, unit_divisor=1024) as progress:
195
- urllib.request.urlretrieve(url, download_file_path, reporthook=lambda count, block_size, total_size: progress.update(block_size)) # type: ignore[attr-defined]
196
-
197
-
198
- def resolve_relative_path(path: str) -> str:
199
- return os.path.abspath(os.path.join(os.path.dirname(__file__), path))
 
1
+ import sys
2
+ import time
3
+ import glob
4
+ import mimetypes
5
+ import os
6
+ import platform
7
+ import shutil
8
+ import ssl
9
+ import subprocess
10
+ import urllib
11
+ from pathlib import Path
12
+ from typing import List, Optional
13
+ from tqdm import tqdm
14
+
15
+ import roop.globals
16
+
17
+ TEMP_DIRECTORY = 'temp'
18
+ TEMP_VIDEO_FILE = 'temp.mp4'
19
+
20
+ # monkey patch ssl for mac
21
+ if platform.system().lower() == 'darwin':
22
+ ssl._create_default_https_context = ssl._create_unverified_context
23
+
24
+
25
+ def run_ffmpeg(args: List[str]) -> bool:
26
+ print("MOI: Entré a run_ffmpeg...")
27
+ commands = ['ffmpeg', '-hide_banner', '-loglevel', roop.globals.log_level]
28
+ commands.extend(args)
29
+ try:
30
+ print("MOI: Estoy en el try del subproceso.")
31
+ subprocess.check_output(commands, stderr=subprocess.STDOUT)
32
+ return True
33
+ except Exception:
34
+ print("Moi: Imprimiendo el error...")
35
+ print(sys.exc_info()[0])
36
+ pass
37
+ return False
38
+
39
+
40
+ def detect_fps(target_path: str) -> float:
41
+ command = ['ffprobe', '-v', 'error', '-select_streams', 'v:0', '-show_entries', 'stream=r_frame_rate', '-of', 'default=noprint_wrappers=1:nokey=1', target_path]
42
+ output = subprocess.check_output(command).decode().strip().split('/')
43
+ try:
44
+ numerator, denominator = map(int, output)
45
+ return numerator / denominator
46
+ except Exception:
47
+ pass
48
+ return 30
49
+
50
+
51
+ def extract_frames(target_path: str, fps: float = 30) -> bool:
52
+ temp_directory_path = get_temp_directory_path(target_path)
53
+ temp_frame_quality = roop.globals.temp_frame_quality * 31 // 100
54
+ return run_ffmpeg(['-hwaccel', 'auto', '-i', target_path, '-q:v', str(temp_frame_quality), '-pix_fmt', 'rgb24', '-vf', 'fps=' + str(fps), os.path.join(temp_directory_path, '%04d.' + roop.globals.temp_frame_format)])
55
+
56
+
57
+ def create_video(target_path: str, fps: float = 30) -> bool:
58
+ temp_output_path = get_temp_output_path(target_path)
59
+ temp_directory_path = get_temp_directory_path(target_path)
60
+ output_video_quality = (roop.globals.output_video_quality + 1) * 51 // 100
61
+ commands = ['-hwaccel', 'auto', '-r', str(fps), '-i', os.path.join(temp_directory_path, '%04d.' + roop.globals.temp_frame_format), '-c:v', roop.globals.output_video_encoder]
62
+ if roop.globals.output_video_encoder in ['libx264', 'libx265', 'libvpx']:
63
+ commands.extend(['-crf', str(output_video_quality)])
64
+ if roop.globals.output_video_encoder in ['h264_nvenc', 'hevc_nvenc']:
65
+ commands.extend(['-cq', str(output_video_quality)])
66
+ commands.extend(['-pix_fmt', 'yuv420p', '-vf', 'colorspace=bt709:iall=bt601-6-625:fast=1', '-y', temp_output_path])
67
+
68
+ print("Y así quedan los commands:", commands)
69
+ print("MOI: Y se supone que aquí estará a punto de crear el video:")
70
+
71
+ # while True:
72
+ # # Imprime un mensaje
73
+ # print("Pulsa la tecla Y para hacer el video...")
74
+
75
+ # # Espera un segundo
76
+ # time.sleep(1)
77
+
78
+ # # Lee un carácter de la entrada estándar
79
+ # key = input()
80
+
81
+ # # Si se presiona la tecla Y, sale del bucle
82
+ # if key == "Y":
83
+ # break
84
+
85
+ return run_ffmpeg(commands)
86
+
87
+
88
+ def restore_audio(target_path: str, output_path: str) -> None:
89
+ print("MOI: Estamos en restore_audio...")
90
+ print("Los parámetros recibidos son:")
91
+ print("target_path:", target_path)
92
+ time.sleep(1)
93
+ print("output_path:", output_path)
94
+ temp_output_path = get_temp_output_path(target_path)
95
+ print("MOI: Éste es el temp_output_path, es audio o video?:")
96
+ print(temp_output_path)
97
+
98
+ try:
99
+ args = ['-i', temp_output_path, '-i', target_path, '-c:v', 'copy', '-map', '0:v:0', '-map', '1:a:0', '-y', output_path]
100
+ print("Estos son los args de audio:")
101
+ print(args)
102
+ time.sleep(10)
103
+ done = run_ffmpeg(args)
104
+ #done = run_ffmpeg(['-i', temp_output_path, '-i', target_path, '-c:v', 'copy', '-map', '0:v:0', '-map', '1:a:0', '-y', output_path])
105
+
106
+ except:
107
+ print("Ocurrió un error")
108
+ print(sys.exc_info()[0])
109
+
110
+ if not done:
111
+ move_temp(target_path, output_path)
112
+ print("Entre a not done :(")
113
+ print("Terminé audio...")
114
+ time.sleep(3)
115
+
116
+
117
+ def get_temp_frame_paths(target_path: str) -> List[str]:
118
+ temp_directory_path = get_temp_directory_path(target_path)
119
+ return glob.glob((os.path.join(glob.escape(temp_directory_path), '*.' + roop.globals.temp_frame_format)))
120
+
121
+
122
+ def get_temp_directory_path(target_path: str) -> str:
123
+ target_name, _ = os.path.splitext(os.path.basename(target_path))
124
+ target_directory_path = os.path.dirname(target_path)
125
+ return os.path.join(target_directory_path, TEMP_DIRECTORY, target_name)
126
+
127
+
128
+ def get_temp_output_path(target_path: str) -> str:
129
+ temp_directory_path = get_temp_directory_path(target_path)
130
+ return os.path.join(temp_directory_path, TEMP_VIDEO_FILE)
131
+
132
+
133
+ def normalize_output_path(source_path: str, target_path: str, output_path: str) -> Optional[str]:
134
+ if source_path and target_path and output_path:
135
+ source_name, _ = os.path.splitext(os.path.basename(source_path))
136
+ target_name, target_extension = os.path.splitext(os.path.basename(target_path))
137
+ if os.path.isdir(output_path):
138
+ return os.path.join(output_path, source_name + '-' + target_name + target_extension)
139
+ return output_path
140
+
141
+
142
+ def create_temp(target_path: str) -> None:
143
+ temp_directory_path = get_temp_directory_path(target_path)
144
+ Path(temp_directory_path).mkdir(parents=True, exist_ok=True)
145
+
146
+
147
+ def move_temp(target_path: str, output_path: str) -> None:
148
+ temp_output_path = get_temp_output_path(target_path)
149
+ if os.path.isfile(temp_output_path):
150
+ if os.path.isfile(output_path):
151
+ os.remove(output_path)
152
+ shutil.move(temp_output_path, output_path)
153
+
154
+
155
+ def clean_temp(target_path: str) -> None:
156
+ temp_directory_path = get_temp_directory_path(target_path)
157
+ parent_directory_path = os.path.dirname(temp_directory_path)
158
+ if not roop.globals.keep_frames and os.path.isdir(temp_directory_path):
159
+ shutil.rmtree(temp_directory_path)
160
+ if os.path.exists(parent_directory_path) and not os.listdir(parent_directory_path):
161
+ os.rmdir(parent_directory_path)
162
+
163
+
164
+ def has_image_extension(image_path: str) -> bool:
165
+ return image_path.lower().endswith(('png', 'jpg', 'jpeg', 'webp'))
166
+
167
+
168
+ def is_image(image_path: str) -> bool:
169
+ if image_path and os.path.isfile(image_path):
170
+ mimetype, _ = mimetypes.guess_type(image_path)
171
+ return bool(mimetype and mimetype.startswith('image/'))
172
+ return False
173
+
174
+
175
+ def is_video(video_path: str) -> bool:
176
+ if video_path and os.path.isfile(video_path):
177
+ mimetype, _ = mimetypes.guess_type(video_path)
178
+ return bool(mimetype and mimetype.startswith('video/'))
179
+ return False
180
+
181
+
182
+ def conditional_download(download_directory_path: str, urls: List[str]) -> None:
183
+ if not os.path.exists(download_directory_path):
184
+ os.makedirs(download_directory_path)
185
+ for url in urls:
186
+ download_file_path = os.path.join(download_directory_path, os.path.basename(url))
187
+ if not os.path.exists(download_file_path):
188
+ request = urllib.request.urlopen(url) # type: ignore[attr-defined]
189
+ total = int(request.headers.get('Content-Length', 0))
190
+ with tqdm(total=total, desc='Downloading', unit='B', unit_scale=True, unit_divisor=1024) as progress:
191
+ urllib.request.urlretrieve(url, download_file_path, reporthook=lambda count, block_size, total_size: progress.update(block_size)) # type: ignore[attr-defined]
192
+
193
+
194
+ def resolve_relative_path(path: str) -> str:
195
+ return os.path.abspath(os.path.join(os.path.dirname(__file__), path))
 
 
 
 
sulkuPypi.py CHANGED
@@ -1,130 +1,113 @@
1
- import requests
2
- import time
3
- import nycklar.nodes as nodes
4
- from cryptography.fernet import Fernet
5
-
6
- #Sulkupypi será el que en un futuro se volverá un paquete de python que instalarás y en el futuro quizá comercializarás.
7
-
8
- base_url = "https://moibe-sulku-fastapi-docker.hf.space/"
9
- userfile = "gAAAAABmEZA4SLBC2YczouOrjIEi9WNCNGOIvyUcqBUnzxNsftXTdy54KaX9x8mAjFkABSI6FJrdZDQKk_5lpJOgJoMChxlniw=="
10
- #Ojo, cuando el userfile termina con símbolo igual y supongo que también si empieza, causa problemas, la solución, ...
11
- #... implementar más adelante desde ser agregar un caractér delimitador y despúes quitarlo, esto para evitar problemas...
12
- #... con el símbolo =, ? y &. Dicho problema solo sucede cuando lo recibe como query params no como path params.
13
- work = "picswap"
14
-
15
- #Todas son llamadas a la API, excepto encrypta, que es una herramienta para prepara precisamente, ...
16
- #lo que le vas a enviar a la API.
17
- def encripta(username):
18
-
19
- key = nodes.key
20
- fernet = Fernet(key)
21
-
22
- string_original = username
23
- string_encriptado = fernet.encrypt(string_original.encode("utf-8"))
24
- string_desencriptado = fernet.decrypt(string_encriptado).decode("utf-8")
25
-
26
- print("String original:", string_original)
27
- print("String encriptado:", string_encriptado)
28
- print("String desencriptado:", string_desencriptado)
29
-
30
- return string_encriptado
31
-
32
- def getData():
33
-
34
- method = "getData/"
35
-
36
- api_url = base_url + method
37
-
38
- response = requests.get(api_url)
39
-
40
- if response.status_code == 200:
41
- print("Conexión a Sulku successful...")
42
- data = response.json()
43
- print("Data:", data)
44
- else:
45
- print("Error al obtener el elemento todo:", response.status_code)
46
-
47
- return data
48
-
49
- def getTokens(userfile):
50
-
51
- method = "getTokens/"
52
-
53
- api_url = base_url + method + userfile
54
-
55
- response = requests.get(api_url)
56
-
57
- if response.status_code == 200:
58
- print("Conexión a Sulku successful...")
59
- tokens = response.json()
60
- print("Tokens:", tokens)
61
- else:
62
- print("Error al obtener el elemento todo:", response.status_code)
63
-
64
- return tokens
65
-
66
- def authorize(tokens, work):
67
-
68
- method = "authorize/"
69
-
70
- api_url = base_url + method + str(tokens) + "/" + work
71
-
72
- print("Apiurl es: ", api_url)
73
-
74
- response = requests.get(api_url)
75
-
76
- if response.status_code == 200:
77
- print("Conexión a Sulku successful...")
78
- autorizacion = response.json()
79
- print("Autorización:", autorizacion)
80
- else:
81
- print("Error al obtener el elemento todo:", response.status_code)
82
-
83
- return autorizacion
84
-
85
- def debitTokens(userfile, work):
86
-
87
- method = "debitTokens/"
88
-
89
- api_url = base_url + method + userfile + "/" + work
90
-
91
- print("Apiurl es: ", api_url)
92
-
93
- response = requests.get(api_url)
94
-
95
- if response.status_code == 200:
96
- print("Conexión a Sulku successful...")
97
- tokens = response.json()
98
- print("Tokens:", tokens)
99
- else:
100
- print("Error al obtener el elemento todo:", response.status_code)
101
-
102
- return tokens
103
-
104
- def debitTokensQ(userfile, work):
105
-
106
- #debitTokens pero con QueryParams, (los query params sirve para ocasiones en los que usas dos de un mismo query param para abtener el resultado de un AND o rangos como...
107
- #... clima por ejemplo.)
108
- method = "debitTokens?"
109
-
110
- api_url = base_url + method + "userfile=" + userfile + "&" + "work=" + work
111
-
112
- print("Apiurl es: ", api_url)
113
-
114
- response = requests.get(api_url)
115
-
116
- if response.status_code == 200:
117
- print("Conexión a Sulku successful...")
118
- tokens = response.json()
119
- print("Tokens:", tokens)
120
- else:
121
- print("Error al obtener el elemento todo:", response.status_code)
122
-
123
- return tokens
124
-
125
- if __name__ == "__main__":
126
- getTokens(userfile)
127
- authorize(18,'picswap')
128
- debitTokens(userfile, work)
129
- #debitTokensQ(userfile, work)
130
- #pass
 
1
+ import requests
2
+ import time
3
+ import nycklar.nodes as nodes
4
+ from cryptography.fernet import Fernet
5
+
6
+ #Sulkupypi será el que en un futuro se volverá un paquete de python que instalarás y en el futuro quizá comercializarás.
7
+
8
+ base_url = "https://moibe-sulku-fastapi-docker.hf.space/"
9
+ userfile = "gAAAAABmEZA4SLBC2YczouOrjIEi9WNCNGOIvyUcqBUnzxNsftXTdy54KaX9x8mAjFkABSI6FJrdZDQKk_5lpJOgJoMChxlniw=="
10
+ #Ojo, cuando el userfile termina con símbolo igual y supongo que también si empieza, causa problemas, la solución, ...
11
+ #... implementar más adelante desde ser agregar un caractér delimitador y despúes quitarlo, esto para evitar problemas...
12
+ #... con el símbolo =, ? y &. Dicho problema solo sucede cuando lo recibe como query params no como path params.
13
+ work = "picswap"
14
+
15
+ #Todas son llamadas a la API, excepto encrypta, que es una herramienta para prepara precisamente, ...
16
+ #lo que le vas a enviar a la API.
17
+ def encripta(username):
18
+
19
+ key = nodes.key
20
+ fernet = Fernet(key)
21
+
22
+ string_original = username
23
+ string_encriptado = fernet.encrypt(string_original.encode("utf-8"))
24
+ string_desencriptado = fernet.decrypt(string_encriptado).decode("utf-8")
25
+
26
+ print("String original:", string_original)
27
+ print("String encriptado:", string_encriptado)
28
+ print("String desencriptado:", string_desencriptado)
29
+
30
+ return string_encriptado
31
+
32
+ def getData():
33
+
34
+ method = "getData/"
35
+ api_url = base_url + method
36
+ response = requests.get(api_url)
37
+
38
+ if response.status_code == 200:
39
+ print("Conexión a Sulku successful...")
40
+ data = response.json()
41
+ #IMPORTANTE: Aquí se obtuvo la lista completa de accesos.
42
+ #Future, se puede optimizar eso en cuanto a seguridad?
43
+ else:
44
+ print("Error al obtener el elemento todo:", response.status_code)
45
+
46
+ return data
47
+
48
+ def getTokens(userfile):
49
+
50
+ method = "getTokens/"
51
+ api_url = base_url + method + userfile
52
+ response = requests.get(api_url)
53
+
54
+ if response.status_code == 200:
55
+ print("Conexión a Sulku successful...")
56
+ tokens = response.json()
57
+ print("Tokens:", tokens)
58
+ else:
59
+ print("Error al obtener el elemento todo:", response.status_code)
60
+
61
+ return tokens
62
+
63
+ def authorize(tokens, work):
64
+
65
+ method = "authorize/"
66
+ api_url = base_url + method + str(tokens) + "/" + work
67
+ response = requests.get(api_url)
68
+
69
+ if response.status_code == 200:
70
+ print("Conexión a Sulku successful...")
71
+ autorizacion = response.json()
72
+ print("Autorización:", autorizacion)
73
+ else:
74
+ print("Error al obtener el elemento todo:", response.status_code)
75
+
76
+ return autorizacion
77
+
78
+ def debitTokens(userfile, work):
79
+
80
+ method = "debitTokens/"
81
+ api_url = base_url + method + userfile + "/" + work
82
+ response = requests.get(api_url)
83
+
84
+ if response.status_code == 200:
85
+ print("Conexión a Sulku successful...")
86
+ tokens = response.json()
87
+ print("Tokens:", tokens)
88
+ else:
89
+ print("Error al obtener el elemento todo:", response.status_code)
90
+
91
+ return tokens
92
+
93
+ def debitTokensQ(userfile, work):
94
+
95
+ #debitTokens pero con QueryParams, (los query params sirve para ocasiones en los que usas dos de un mismo query param para abtener el resultado de un AND o rangos como...
96
+ #... clima por ejemplo.)
97
+ method = "debitTokens?"
98
+ api_url = base_url + method + "userfile=" + userfile + "&" + "work=" + work
99
+ response = requests.get(api_url)
100
+
101
+ if response.status_code == 200:
102
+ print("Conexión a Sulku successful...")
103
+ tokens = response.json()
104
+ print("Tokens:", tokens)
105
+ else:
106
+ print("Error al obtener el elemento todo:", response.status_code)
107
+
108
+ return tokens
109
+
110
+ if __name__ == "__main__":
111
+ getTokens(userfile)
112
+ authorize(18,'picswap')
113
+ debitTokens(userfile, work)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tools.py CHANGED
@@ -1,14 +1,9 @@
1
- import gradio as gr
2
-
3
  def actualizar_creditos(nuevos_creditos, usuario):
4
 
5
  html_credits = f"""
6
- <div style="text-align: right;">💶<b>Username: </b> {usuario}</div><div style="text-align: right;">💶<b>Credits Available: </b> {nuevos_creditos}</div>
 
 
7
  """
8
 
9
- return html_credits
10
-
11
-
12
-
13
- # Para actualizar los créditos a 500:
14
- actualizar_creditos(500, "Moibe")
 
 
 
1
  def actualizar_creditos(nuevos_creditos, usuario):
2
 
3
  html_credits = f"""
4
+ <div>
5
+ <div style="text-align: left;">👤<b>Username: </b> {usuario}</div><div style="text-align: right;">💶<b>Credits Available: </b> {nuevos_creditos}</div>
6
+ </div>
7
  """
8
 
9
+ return html_credits