Update app.py
Browse files
app.py
CHANGED
@@ -166,12 +166,43 @@ def mock_analytics():
|
|
166 |
"Instagram": {"Views": random.randint(500, 3000), "Engagement Rate": f"{random.uniform(10, 20):.2f}%"},
|
167 |
}
|
168 |
|
169 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
output_video_path = "output_video.mp4"
|
171 |
-
updated_translations = json.loads(edited_translations)
|
172 |
|
173 |
-
|
174 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
return output_video_path
|
176 |
|
177 |
# Core functionalities
|
@@ -226,10 +257,19 @@ def build_interface():
|
|
226 |
with gr.Column(scale=5):
|
227 |
|
228 |
gr.Markdown("## Edit Translations")
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
)
|
234 |
save_changes_button = gr.Button("Save Changes")
|
235 |
processed_video_output = gr.File(label="Download Processed Video", interactive=True) # Download button
|
@@ -254,7 +294,7 @@ def build_interface():
|
|
254 |
|
255 |
save_changes_button.click(
|
256 |
update_translations,
|
257 |
-
inputs=[file_input,
|
258 |
outputs=[processed_video_output]
|
259 |
)
|
260 |
|
|
|
166 |
"Instagram": {"Views": random.randint(500, 3000), "Engagement Rate": f"{random.uniform(10, 20):.2f}%"},
|
167 |
}
|
168 |
|
169 |
+
import json
|
170 |
+
|
171 |
+
def update_translations(file, edited_table):
|
172 |
+
"""
|
173 |
+
Update translations from the Gradio editable table and process the video.
|
174 |
+
|
175 |
+
Parameters:
|
176 |
+
file: Uploaded video file object.
|
177 |
+
edited_table: Updated translations from the Gradio editable table (list of dictionaries).
|
178 |
+
|
179 |
+
Returns:
|
180 |
+
output_video_path: The path to the video with updated translations.
|
181 |
+
"""
|
182 |
output_video_path = "output_video.mp4"
|
|
|
183 |
|
184 |
+
try:
|
185 |
+
# Ensure edited_table is in the expected format
|
186 |
+
if not isinstance(edited_table, list):
|
187 |
+
raise ValueError("Edited table must be a list of dictionaries.")
|
188 |
+
|
189 |
+
# Validate and preprocess each entry in the edited_table
|
190 |
+
for entry in edited_table:
|
191 |
+
if not all(key in entry for key in ["start", "original", "translated", "end"]):
|
192 |
+
raise ValueError("Each entry must contain 'start', 'original', 'translated', and 'end' keys.")
|
193 |
+
if not isinstance(entry["start"], (float, int)):
|
194 |
+
raise ValueError("'start' must be a number.")
|
195 |
+
if not isinstance(entry["end"], (float, int)):
|
196 |
+
raise ValueError("'end' must be a number.")
|
197 |
+
if not isinstance(entry["original"], str) or not isinstance(entry["translated"], str):
|
198 |
+
raise ValueError("'original' and 'translated' must be strings.")
|
199 |
+
|
200 |
+
# Call the function to add subtitles to the video
|
201 |
+
add_transcript_to_video(file.name, edited_table, output_video_path)
|
202 |
+
|
203 |
+
except Exception as e:
|
204 |
+
raise ValueError(f"Error updating translations: {e}")
|
205 |
+
|
206 |
return output_video_path
|
207 |
|
208 |
# Core functionalities
|
|
|
257 |
with gr.Column(scale=5):
|
258 |
|
259 |
gr.Markdown("## Edit Translations")
|
260 |
+
|
261 |
+
# Editable JSON Data
|
262 |
+
editable_table = gr.Dataframe(
|
263 |
+
value=[
|
264 |
+
{"start": entry["start"], "original": entry["original"], "translated": entry["translated", "end": entry["end"]]}
|
265 |
+
for entry in editable_translations
|
266 |
+
],
|
267 |
+
headers=["start", "original", "translated", "end"],
|
268 |
+
datatype=["number", "str", "str", "number"],
|
269 |
+
row_count=len(translated_json),
|
270 |
+
col_count=4,
|
271 |
+
interactive=[False, True, True, False], # Control editability
|
272 |
+
label="Edit Translations",
|
273 |
)
|
274 |
save_changes_button = gr.Button("Save Changes")
|
275 |
processed_video_output = gr.File(label="Download Processed Video", interactive=True) # Download button
|
|
|
294 |
|
295 |
save_changes_button.click(
|
296 |
update_translations,
|
297 |
+
inputs=[file_input, editable_table],
|
298 |
outputs=[processed_video_output]
|
299 |
)
|
300 |
|