-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathExtractAudio.py
144 lines (127 loc) · 5.45 KB
/
ExtractAudio.py
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Required: moviepy
# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple moviepy
# Coded by @Abyss_Seeker!
import os
try:
import moviepy.editor as mp
except:
try:
os.system('pip install -i https://pypi.tuna.tsinghua.edu.cn/simple moviepy')
except:
os.system('pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple moviepy')
finally:
import moviepy.editor as mp
from time import asctime as t
# This is just a note
# log.insert('end', f'ERROR: Probably invalid path: {path}\n')
# log.see(END)
# log.update()
tail = '/extracts' # Config this to change the output path
def vid2mp3(path: str, output_path: str, log=None, output_dir_tail=tail,
output_format='mp3'): # input_path, output_path, log text box path, output_dir, output_format
if log is not None:
log.insert('end', f'{t()}\n')
log.see('end')
# Basic
config = {
'output': output_format,
'output_dir': path + output_dir_tail
} # output can be wav or mp3; output dir can be modified, default is inside path/extracts
# if input is video
video_file_suffixes = ['webm', '.mov', '.mp4', '.avi', '.ogv', '.mkv'] # Extract valid video formats
dir_mark = '/'
if '\\' in path:
dir_mark = '\\'
if path[-4:].lower() in video_file_suffixes:
# Decide output dir
output_dir_pass = 0
while output_dir_pass == 0:
output_dir_pass = 1
output_dir = output_path.strip()
if output_dir == '':
_ = path.split(dir_mark)
if len(_) > 1:
config['output_dir'] = dir_mark.join(_[:-1])
else:
print('ERROR: Probably invalid path')
if log is not None:
log.insert('end', f'ERROR: Probably invalid path: {path}\n')
log.see('end')
log.update()
else:
if os.path.exists(output_dir):
config['output_dir'] = output_dir
print('-' * 50, '\n', config, '\n', '-' * 50)
if log is not None:
log.insert('end', f'{"-" * 50}\n{config}\n{"-" * 50}\n')
log.see('end')
log.update()
# Find last section of file name (with .mp4), don't know if it works in mac
file_name = path.split(dir_mark)[-1]
pure_file_name = file_name[:-5] if file_name[-4:].lower() == 'webm' else file_name[:-4] # No .mp4 only name
# pure_file_name = file_name[:-4].split('(')[1][:-1] # For my made in abyss music use only
video = mp.VideoFileClip(path)
audio = video.audio
if audio is not None:
audio.write_audiofile(f"{config['output_dir']}/{pure_file_name}.{config['output']}")
else:
print('This video does not have audio')
if log is not None:
log.insert('end', 'This video does not have audio\n')
log.see('end')
log.update()
# If input is folder
# Decide output dir
else:
file_names = os.listdir(path)
output_dir_pass = 0
while output_dir_pass == 0:
output_dir_pass = 1
output_dir = output_path.strip()
if output_dir != '':
config['output_dir'] = output_dir
print('-' * 50, '\n', config, '\n', '-' * 50)
if log is not None:
log.insert('end', f'{"-" * 50}\n{config}\n{"-" * 50}\n')
log.see('end')
log.update()
# Make output dir if needed
if not os.path.exists(config['output_dir']):
os.makedirs(config['output_dir'])
# Convert + write files
process_len = len(file_names)
current = 0
for file_name in file_names:
if file_name[
-4:].lower() in video_file_suffixes: # This would actually yield issues if folder name ends in webm (lazy)
file_dir = path + '/' + file_name
pure_file_name = file_name[:-5] if file_name[-4:].lower() == 'webm' else file_name[
:-4] # No .mp4 only name
# pure_file_name = file_name[:-4].split('(')[1][:-1] # For my made in abyss music use only
video = mp.VideoFileClip(file_dir)
audio = video.audio
if audio is not None:
audio.write_audiofile(f"{config['output_dir']}/{pure_file_name}.{config['output']}")
else:
print(f'Video {file_name} does not have audio')
if log is not None:
log.insert('end', f'Video {file_name} does not have audio\n')
log.see('end')
log.update()
current += 1
print(f'Completed {current}/{process_len}')
if log is not None:
log.insert('end', f'Completed {current}/{process_len}\n')
log.see('end')
log.update()
print('\n' + '=' * 50)
if log is not None:
log.insert('end', f"\n{'=' * 50}\n")
log.update()
log.see('end')
print(f"Success. The files in {path} \n have been written to directory {config['output_dir']}")
if log is not None:
log.insert('end', f'{t()}\n')
log.insert('end', f"Success. The files in {path} have been written to directory {config['output_dir']}\n")
log.see('end')
log.update()