Aeidle commited on
Commit
70d9bc3
·
verified ·
1 Parent(s): 0b2b7dc

Upload folder using huggingface_hub

Browse files
Files changed (4) hide show
  1. .gradio/certificate.pem +31 -0
  2. README.md +1 -7
  3. app.py +94 -0
  4. requirements.txt +2 -0
.gradio/certificate.pem ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
31
+ -----END CERTIFICATE-----
README.md CHANGED
@@ -1,12 +1,6 @@
1
  ---
2
  title: VideoRotate
3
- emoji: 🦀
4
- colorFrom: gray
5
- colorTo: red
6
  sdk: gradio
7
  sdk_version: 5.49.1
8
- app_file: app.py
9
- pinned: false
10
  ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
  title: VideoRotate
3
+ app_file: app.py
 
 
4
  sdk: gradio
5
  sdk_version: 5.49.1
 
 
6
  ---
 
 
app.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import tempfile
3
+ import os
4
+ import subprocess
5
+ from imageio_ffmpeg import get_ffmpeg_exe
6
+
7
+
8
+ def rotate_video(input_file, rotation):
9
+ if not input_file:
10
+ return None, None
11
+ angles = {
12
+ "90° clockwise": -90,
13
+ "90° counter-clockwise": 90,
14
+ "180°": 180,
15
+ }
16
+ angle = angles.get(rotation, -90)
17
+ # Resolve input path from various possible formats (str path, dict with path/name, or file-like)
18
+ input_path = None
19
+ if isinstance(input_file, str) and os.path.exists(input_file):
20
+ input_path = input_file
21
+ elif isinstance(input_file, dict):
22
+ # Try common keys first
23
+ for k in ("path", "name", "video", "file"):
24
+ v = input_file.get(k)
25
+ if isinstance(v, str) and os.path.exists(v):
26
+ input_path = v
27
+ break
28
+ # Fallback: scan all values for a valid path string
29
+ if not input_path:
30
+ for v in input_file.values():
31
+ if isinstance(v, str) and os.path.exists(v):
32
+ input_path = v
33
+ break
34
+ elif hasattr(input_file, "name"):
35
+ v = getattr(input_file, "name", None)
36
+ if v and os.path.exists(v):
37
+ input_path = v
38
+ if not input_path:
39
+ return None, None
40
+ tmpdir = tempfile.mkdtemp(prefix="rotate_")
41
+ out_path = os.path.join(tmpdir, "rotated.mp4")
42
+
43
+ # Build FFmpeg transpose filter (no borders for multiples of 90)
44
+ if angle == -90: # clockwise
45
+ vf_filter = "transpose=1"
46
+ elif angle == 90: # counter-clockwise
47
+ vf_filter = "transpose=2"
48
+ elif angle == 180 or angle == -180:
49
+ vf_filter = "transpose=1,transpose=1" # 180°
50
+ else:
51
+ vf_filter = "transpose=1" # default safeguard
52
+
53
+ ffmpeg_exe = get_ffmpeg_exe()
54
+ base_cmd = [
55
+ ffmpeg_exe,
56
+ "-y",
57
+ "-i", input_path,
58
+ "-vf", vf_filter,
59
+ "-c:v", "libx264",
60
+ "-pix_fmt", "yuv420p",
61
+ "-preset", "medium",
62
+ "-crf", "20",
63
+ "-movflags", "+faststart",
64
+ "-c:a", "aac",
65
+ out_path,
66
+ ]
67
+ try:
68
+ subprocess.run(base_cmd, check=True)
69
+ except subprocess.CalledProcessError:
70
+ # Fallback: try without audio if AAC not available
71
+ cmd_no_audio = base_cmd.copy()
72
+ # replace audio settings with -an
73
+ if "-c:a" in cmd_no_audio:
74
+ idx = cmd_no_audio.index("-c:a")
75
+ # remove -c:a and its value
76
+ del cmd_no_audio[idx:idx+2]
77
+ cmd_no_audio.insert(-1, "-an")
78
+ subprocess.run(cmd_no_audio, check=True)
79
+ return out_path, out_path
80
+
81
+
82
+ with gr.Blocks() as demo:
83
+ gr.Markdown("# Video Rotate")
84
+ with gr.Row():
85
+ input_video = gr.Video(label="Input")
86
+ rotation = gr.Radio(choices=["90° clockwise", "90° counter-clockwise", "180°"], value="90° counter-clockwise", label="Rotation")
87
+ out_preview = gr.Video(label="Preview")
88
+ out_file = gr.File(label="Download MP4")
89
+ run_btn = gr.Button("Rotate")
90
+ run_btn.click(rotate_video, inputs=[input_video, rotation], outputs=[out_preview, out_file])
91
+
92
+
93
+ # Expose app for Hugging Face Spaces
94
+ app = demo
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ gradio>=5.49.1
2
+ imageio-ffmpeg>=0.6.0