-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfileworks.py
151 lines (139 loc) · 4.97 KB
/
fileworks.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
145
146
147
148
149
150
151
from tkinter import filedialog
from typing import Tuple
import ffmpeg
import tkinter
import os
import pysubs2
import tkinter.messagebox
from configs import get_value, get_config, SUBS_LANGS_DICT
from ffmpeg._run import Error
def comparator(sub: str) -> bool:
if (
'text' not in sub
and 'sign' not in sub
and 'надпись' not in sub
and 'caption' not in sub
and 'title' not in sub
and 'song' not in sub
and 'screen' not in sub
and 'typedigital' not in sub
and 'phonetics' not in sub
):
return True
return False
def subs_extract(video_path, folder, master) -> str or None:
lang = SUBS_LANGS_DICT[get_config()['OPTIONS']['subs_lang']]
input_file = ffmpeg.input(video_path)
subs_path = f'{folder}subs.ass'
copy = ''
while os.path.exists(subs_path):
copy += 'copy'
subs_path = f'{folder}subs_{copy}.ass'
master.nametowidget('pb').start()
try:
output = ffmpeg.output(
input_file, subs_path, map=f'0:s:m:language:{lang}'
)
ffmpeg.run(output)
master.nametowidget('pb').stop()
return subs_path
except Error:
master.nametowidget('pb').stop()
tkinter.messagebox.showerror(
'Нет субтитров',
'Выбранного языка субтитров нет в видео.'
)
return None
def subs_edit(path: str) -> None:
subs = pysubs2.load(path)
to_delete = []
char = '{'
for i, sub in enumerate(subs.events):
if comparator(sub.name.lower()):
to_delete.append(i)
elif comparator(sub.name.lower()):
to_delete.append(i)
if len(to_delete) == len(subs.events):
to_delete = [
i for i, sub in enumerate(subs.events) if char not in sub.text
]
to_delete.sort()
for i in reversed(to_delete):
del subs[i]
subs.save(path)
def name_generator(file: str, ext: str) -> str:
ext = ext.replace('.', '')
name = file.split('/')[-1]
name = (''.join(i for i in name if i.isalnum())).lower()
name = name.replace(ext, '')
return name
def choice_files(
master: tkinter.Tk
) -> (
Tuple[str or None,
str or None,
str or None,
str or None,
str or None]
):
try:
video = filedialog.askopenfilename(
title='Выберите видео',
filetypes=[('Видео mkv и mp4', '*.mkv *.mp4')],
)
if video:
filename = os.path.basename(video)
folder = video.replace(filename, '')
video_ext = os.path.splitext(video)[-1]
name = name_generator(video, video_ext)
video_path = f'{folder}{name}{video_ext}'
copy = ''
while os.path.exists(video_path):
copy += 'copy'
video_path = f'{folder}{name}_{copy}{video_ext}'
os.rename(video, video_path)
video = os.path.basename(video_path)
if get_value('subs_extract') and video_ext == '.mkv':
subs_path = subs_extract(video_path, folder, master)
subs_ext = '.ass'
else:
subs = filedialog.askopenfilename(
title='Выберите субтитры',
filetypes=[('Субтитры ass и srt', '*.ass *.srt')]
)
if subs:
filename = os.path.basename(subs)
subs_ext = os.path.splitext(subs)[-1]
name = name_generator(subs, subs_ext)
subs_path = f'{folder}{name}{subs_ext}'
copy = ''
while os.path.exists(subs_path):
copy += 'copy'
subs_path = f'{folder}{name}_{copy}{subs_ext}'
os.rename(subs, subs_path)
else:
return None, None, None, None, None
if subs_path:
if subs_ext == '.ass':
if get_value('subs_cleaner'):
subs_edit(subs_path)
subs = os.path.basename(subs_path)
else:
subs = None
else:
return None, None, None, None, None
except PermissionError:
tkinter.messagebox.showerror(
'Отказано в доступе',
f'Отказано в доступе к "{folder}". '
'Попробуйте воспользоваться не системным диском '
'или не его корневым разделом.'
)
except OSError:
tkinter.messagebox.showerror(
'Файлы находятся на разных дисках',
f'Переместите файлы "{video}" и "{subs}" на один диск.'
)
return video_ext, subs_ext, folder, video, subs
if __name__ == '__main__':
pass