Ericwang commited on
Commit
8059bbb
·
0 Parent(s):

initial commit

Browse files
Files changed (8) hide show
  1. .DS_Store +0 -0
  2. .gitattributes +34 -0
  3. .gitignore +2 -0
  4. Dockerfile +13 -0
  5. README.md +11 -0
  6. app.py +92 -0
  7. requirments.txt +3 -0
  8. utlis.py +35 -0
.DS_Store ADDED
Binary file (6.15 kB). View file
 
.gitattributes ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tflite filter=lfs diff=lfs merge=lfs -text
29
+ *.tgz filter=lfs diff=lfs merge=lfs -text
30
+ *.wasm filter=lfs diff=lfs merge=lfs -text
31
+ *.xz filter=lfs diff=lfs merge=lfs -text
32
+ *.zip filter=lfs diff=lfs merge=lfs -text
33
+ *.zst filter=lfs diff=lfs merge=lfs -text
34
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ flagged/
2
+ __pycache__/
Dockerfile ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.9-slim-buster
2
+
3
+ RUN apt-get update && apt-get install -y ffmpeg
4
+
5
+ WORKDIR /app
6
+
7
+ COPY requirements.txt .
8
+
9
+ RUN pip install --no-cache-dir -r requirements.txt
10
+
11
+ COPY . .
12
+
13
+ CMD ["python", "app.py"]
README.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Video Convertor
3
+ emoji: 👀
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: docker
7
+ pinned: false
8
+ license: mit
9
+ ---
10
+
11
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import subprocess
3
+ from pathlib import Path
4
+ from utlis import HHMMSS_to_sec
5
+
6
+ def trim_media(media_in, media_out, start, end):
7
+
8
+ # options for writing out audio if converting
9
+ WAV_CHANNELS = 1
10
+ WAV_SAMPLE_RATE = 16000
11
+
12
+ media_type = Path(media_in).suffix
13
+ ext = Path(media_out).suffix
14
+
15
+ if isinstance(start, str):
16
+ start_sec = HHMMSS_to_sec(start)
17
+ else:
18
+ start_sec = float(start)
19
+ if isinstance(end, str):
20
+ end_sec = HHMMSS_to_sec(end)
21
+ else:
22
+ end_sec = float(end)
23
+
24
+ if ext == '.wav':
25
+ # convert to wav with standard format for audio models
26
+ print(f'...Using ffmpeg to trim video from {start} to {end} \n and convert to {WAV_SAMPLE_RATE}Hz WAV with {WAV_CHANNELS} channels...')
27
+ print(f'...generating {media_out}...')
28
+
29
+ subprocess.call(['ffmpeg',
30
+ '-y',
31
+ '-i',
32
+ media_in,
33
+ '-ss',
34
+ f'{start_sec}',
35
+ '-to',
36
+ f'{end_sec}',
37
+ '-acodec',
38
+ 'pcm_s16le',
39
+ '-ac',
40
+ WAV_CHANNELS,
41
+ '-ar',
42
+ WAV_SAMPLE_RATE,
43
+ media_out,
44
+ '-hide_banner',
45
+ '-loglevel',
46
+ 'warning'
47
+ ], shell=False)
48
+
49
+ else:
50
+ print(f'...Using ffmpeg to trim video from {start_sec} to {end_sec}...')
51
+ print(f'...generating {media_out}...')
52
+
53
+ subprocess.call(['ffmpeg',
54
+ '-y',
55
+ '-i',
56
+ media_in,
57
+ '-ss',
58
+ f'{start_sec}',
59
+ '-to',
60
+ f'{end_sec}',
61
+ '-c',
62
+ 'copy',
63
+ media_out,
64
+ '-hide_banner',
65
+ '-loglevel',
66
+ 'warning'
67
+ ], shell=False)
68
+
69
+ def convert_video(input_file, output_format, start_time, end_time):
70
+ try:
71
+ # Set output file name and extension
72
+ output_file = f"{input_file.name.split('.')[0]}.{output_format}"
73
+
74
+ if start_time == "":
75
+ start_time = 0
76
+ if end_time == "":
77
+ end_time = 0
78
+ # Trim the video
79
+ trim_media(input_file.name, output_file, start_time, end_time)
80
+
81
+ return output_file
82
+ except Exception as e:
83
+ return f"Error: {str(e)}"
84
+
85
+ input_file = gr.File(label="Select video file")
86
+ output_format = gr.Dropdown(choices=["mkv", "MOV", "mp4", "wav"], label="Select output format")
87
+ start_time = gr.Textbox(label="Start time (in seconds or HH:MM:SS). Leave blank to start at beginning.")
88
+ end_time = gr.Textbox(label="End time (in seconds or HH:MM:SS). Leave blank to end at end.")
89
+ output_file = gr.File(label="Download converted file")
90
+
91
+ interface = gr.Interface(fn=convert_video, inputs=[input_file, output_format, start_time, end_time], outputs=output_file, title="Video Trimmer")
92
+ interface.launch(server_name="0.0.0.0", server_port=7860)
requirments.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ gradio==3.23.0
2
+ moviepy==1.0.3
3
+ panads==1.1.3
utlis.py ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import csv
3
+ import re
4
+ import pandas as pd
5
+ from pathlib import Path
6
+
7
+ def HHMMSS_to_sec(time_str):
8
+ """Get Seconds from timestamp string with milliseconds."""
9
+ if not time_str:
10
+ return None
11
+ if time_str.count(':')==2:
12
+ h, m, s = time_str.split(':')
13
+ elif time_str.count(':')==3:
14
+ # weird timestamps where there is a field followign seconds delimited by colon
15
+ h, m, s, u = time_str.split(':')
16
+ # determine whether ms field is in tenths or hundredths or thousandths by countng how many digits
17
+ if len(u)==1:
18
+ print('Weird time format detected - HH:MM:SS:tenths - please verify this is how you want the time interpreted')
19
+ ms = float(u)/10
20
+ elif len(u)==2: # hundredths
21
+ ms = float(u)/100
22
+ elif len(u)==3: # hundredths
23
+ ms = float(u)/1000
24
+ else:
25
+ print(f'input string format not supported: {time_str}')
26
+ return None
27
+ s = int(s)+ms
28
+ elif time_str.count(':')==1:
29
+ # print('missing HH from timestamp, assuming MM:SS')
30
+ m, s = time_str.split(':')
31
+ h=0
32
+ else:
33
+ print(f'input string format not supported: {time_str}')
34
+ return None
35
+ return int(h) * 3600 + int(m) * 60 + float(s)