udemy-userAPI 0.3.9__py3-none-any.whl → 0.3.11__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- udemy_userAPI/__version__.py +1 -1
- udemy_userAPI/authenticate.py +22 -22
- udemy_userAPI/bultins.py +115 -4
- {udemy_userAPI-0.3.9.dist-info → udemy_userAPI-0.3.11.dist-info}/METADATA +2 -2
- udemy_userAPI-0.3.11.dist-info/RECORD +17 -0
- animation_consoles/__init__.py +0 -1
- animation_consoles/animation.py +0 -64
- ffmpeg_for_python/__config__.py +0 -118
- ffmpeg_for_python/__init__.py +0 -8
- ffmpeg_for_python/__utils.py +0 -78
- ffmpeg_for_python/__version__.py +0 -6
- ffmpeg_for_python/exeptions.py +0 -91
- ffmpeg_for_python/ffmpeg.py +0 -203
- m3u8_analyzer/M3u8Analyzer.py +0 -807
- m3u8_analyzer/__init__.py +0 -7
- m3u8_analyzer/__version__.py +0 -1
- m3u8_analyzer/exeptions.py +0 -82
- udemy_userAPI-0.3.9.dist-info/RECORD +0 -29
- {udemy_userAPI-0.3.9.dist-info → udemy_userAPI-0.3.11.dist-info}/LICENSE +0 -0
- {udemy_userAPI-0.3.9.dist-info → udemy_userAPI-0.3.11.dist-info}/WHEEL +0 -0
- {udemy_userAPI-0.3.9.dist-info → udemy_userAPI-0.3.11.dist-info}/top_level.txt +0 -0
ffmpeg_for_python/ffmpeg.py
DELETED
@@ -1,203 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import platform
|
3
|
-
import subprocess
|
4
|
-
import time
|
5
|
-
from typing import List
|
6
|
-
from .__config__ import Configurate
|
7
|
-
from .exeptions import wraper_erros, FFmpegExceptions
|
8
|
-
|
9
|
-
parser = Configurate()
|
10
|
-
parser.configure()
|
11
|
-
ffmpeg_binarie = os.path.join(parser.INSTALL_DIR, parser.FFMPEG_BINARY)
|
12
|
-
|
13
|
-
|
14
|
-
def ffmpeg(cls):
|
15
|
-
"""Decorador que instancia automaticamente a classe FFmpeg."""
|
16
|
-
|
17
|
-
def wrapper(*args, **kwargs):
|
18
|
-
# Cria e retorna uma instância da classe FFmpeg
|
19
|
-
instance = cls(*args, **kwargs)
|
20
|
-
return instance
|
21
|
-
|
22
|
-
return wrapper
|
23
|
-
|
24
|
-
|
25
|
-
@ffmpeg
|
26
|
-
class FFmpeg:
|
27
|
-
"""Wrapper para o binário FFmpeg, permitindo o uso de comandos FFmpeg via Python."""
|
28
|
-
|
29
|
-
def __init__(self):
|
30
|
-
# Verifica se o binário do FFmpeg existe
|
31
|
-
if not self.__verify_path(bin_path=ffmpeg_binarie, path_type='file'):
|
32
|
-
parser.install_bins()
|
33
|
-
self.__ffmpeg_path = str(ffmpeg_binarie)
|
34
|
-
self.__command = [self.__ffmpeg_path]
|
35
|
-
self.__overwrite_output = False
|
36
|
-
|
37
|
-
def args(self, arguments: List[str]) -> 'FFmpeg':
|
38
|
-
"""Adiciona múltiplos argumentos personalizados ao comando FFmpeg."""
|
39
|
-
if not all(isinstance(arg, str) for arg in arguments):
|
40
|
-
raise TypeError("All arguments should be provided as strings.")
|
41
|
-
self.__command.extend(arguments)
|
42
|
-
return self
|
43
|
-
|
44
|
-
def run(self, capture_output: bool = False):
|
45
|
-
"""Executa o comando FFmpeg construído.
|
46
|
-
|
47
|
-
Args:
|
48
|
-
capture_output (bool): Se verdadeiro, captura a saída e printa no console.
|
49
|
-
Se False, a saída é retornada assincronamente em tempo real.
|
50
|
-
|
51
|
-
Yields:
|
52
|
-
str: Cada linha da saída filtrada do FFmpeg quando capture_output é False.
|
53
|
-
"""
|
54
|
-
|
55
|
-
configs = self.__oculte_comands_your_system.get('startupinfo')
|
56
|
-
|
57
|
-
# Executa o comando utilizando subprocess
|
58
|
-
with subprocess.Popen(
|
59
|
-
self.__command,
|
60
|
-
startupinfo=configs,
|
61
|
-
stdout=subprocess.PIPE,
|
62
|
-
stderr=subprocess.PIPE,
|
63
|
-
stdin=subprocess.PIPE,
|
64
|
-
text=True,
|
65
|
-
bufsize=1, # Linha por linha
|
66
|
-
universal_newlines=True # Garante que novas linhas sejam interpretadas corretamente
|
67
|
-
) as process:
|
68
|
-
try:
|
69
|
-
# Lê a saída de erro padrão (stderr) em tempo real
|
70
|
-
for linha in process.stderr:
|
71
|
-
time.sleep(0.01) # Simulação de latência, opcional
|
72
|
-
|
73
|
-
# Filtra a linha de erro padrão
|
74
|
-
linha_filtrada = wraper_erros(linha)
|
75
|
-
|
76
|
-
if linha_filtrada:
|
77
|
-
# Se houver um erro detectado, o processo é encerrado
|
78
|
-
process.terminate()
|
79
|
-
raise FFmpegExceptions(message=f'Erro na execução do ffmpeg: "{linha_filtrada}"')
|
80
|
-
else:
|
81
|
-
if capture_output:
|
82
|
-
# Se `capture_output` estiver ativado, imprime a saída
|
83
|
-
print(linha.strip())
|
84
|
-
else:
|
85
|
-
# Retorna a linha assincronamente quando capture_output é False
|
86
|
-
yield linha.strip()
|
87
|
-
|
88
|
-
# Aguarda a conclusão do processo
|
89
|
-
process.wait()
|
90
|
-
|
91
|
-
except Exception as e:
|
92
|
-
process.terminate()
|
93
|
-
raise FFmpegExceptions(message=f'Erro no processo FFmpeg: {str(e)}')
|
94
|
-
|
95
|
-
def input(self, file_path: str) -> 'FFmpeg':
|
96
|
-
"""Define o arquivo de entrada para o FFmpeg."""
|
97
|
-
cmd = ['-i', file_path]
|
98
|
-
self.args(cmd)
|
99
|
-
return self
|
100
|
-
|
101
|
-
def output(self, output_path: str) -> 'FFmpeg':
|
102
|
-
"""Define o arquivo de saída para o FFmpeg e verifica se a sobrescrita está permitida."""
|
103
|
-
if os.path.exists(output_path):
|
104
|
-
if not self.__overwrite_output:
|
105
|
-
raise FFmpegExceptions(f"O arquivo de saída '{output_path}' já existe! Use 'overwrite_output' para "
|
106
|
-
f"sobrescrevê-lo.")
|
107
|
-
|
108
|
-
# Adiciona o arquivo de saída ao comando
|
109
|
-
cmd = [output_path]
|
110
|
-
self.args(cmd)
|
111
|
-
return self
|
112
|
-
|
113
|
-
@property
|
114
|
-
def overwrite_output(self):
|
115
|
-
"""
|
116
|
-
Adiciona o parâmetro '-y' ao comando FFmpeg, o que permite sobrescrever o arquivo de saída
|
117
|
-
caso ele já exista.
|
118
|
-
|
119
|
-
Importante: Esta propriedade deve ser definida antes dos parâmetros de entrada e saída
|
120
|
-
para garantir que o comando FFmpeg seja construído corretamente. Caso contrário, o comando
|
121
|
-
pode não ser executado como esperado.
|
122
|
-
|
123
|
-
Returns:
|
124
|
-
FFmpeg: Retorna a instância atual para encadeamento de métodos.
|
125
|
-
"""
|
126
|
-
self.__overwrite_output = True
|
127
|
-
cmd = ['-y']
|
128
|
-
self.args(cmd)
|
129
|
-
return self
|
130
|
-
|
131
|
-
@property
|
132
|
-
def hide_banner(self) -> 'FFmpeg':
|
133
|
-
"""oculta o baner do ffmpeg"""
|
134
|
-
self.__command.extend(['-hide_banner'])
|
135
|
-
return self
|
136
|
-
|
137
|
-
@property
|
138
|
-
def copy(self) -> 'FFmpeg':
|
139
|
-
"""Adiciona o parâmetro '-c copy"""
|
140
|
-
self.__command.extend(['-c', 'copy'])
|
141
|
-
return self
|
142
|
-
|
143
|
-
@property
|
144
|
-
def copy_codecs(self):
|
145
|
-
"""para remuxar"""
|
146
|
-
self.__command.extend(['-c:a', 'copy', '-c:v', 'copy'])
|
147
|
-
return self
|
148
|
-
|
149
|
-
def reset_ffmpeg(self) -> 'FFmpeg':
|
150
|
-
"""Reseta o comando para reutilização do objeto,isso é necessário em caso de uso em loops,
|
151
|
-
a cada execução execute o reset para ter certeza que estar limpo o cache de comandos"""
|
152
|
-
self.__command = [self.__ffmpeg_path]
|
153
|
-
return self
|
154
|
-
|
155
|
-
@staticmethod
|
156
|
-
def __verify_path(bin_path, path_type: str) -> bool:
|
157
|
-
"""
|
158
|
-
Verifica se um caminho de arquivo ou diretório existe.
|
159
|
-
|
160
|
-
Args:
|
161
|
-
bin_path : O caminho a ser verificado.
|
162
|
-
path_type (str): O tipo de caminho ('file' para arquivo, 'dir' para diretório).
|
163
|
-
|
164
|
-
Returns:
|
165
|
-
bool: True se o caminho existir e for do tipo especificado, False caso contrário.
|
166
|
-
"""
|
167
|
-
if path_type == 'file':
|
168
|
-
return os.path.isfile(bin_path)
|
169
|
-
elif path_type == 'dir':
|
170
|
-
return os.path.isdir(bin_path)
|
171
|
-
else:
|
172
|
-
raise ValueError("Invalid path_type. Use 'file' or 'dir'.")
|
173
|
-
|
174
|
-
@property
|
175
|
-
def __oculte_comands_your_system(self) -> dict:
|
176
|
-
"""Identifica o sistema do usuário e cria um dicionário de parâmetros para ocultar saídas de janelas e do
|
177
|
-
terminal."""
|
178
|
-
system_user = platform.system()
|
179
|
-
startupinfo_options = {}
|
180
|
-
|
181
|
-
if system_user == "Windows":
|
182
|
-
# Configuração específica para ocultar o terminal no Windows
|
183
|
-
startupinfo = subprocess.STARTUPINFO()
|
184
|
-
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
|
185
|
-
startupinfo.wShowWindow = subprocess.SW_HIDE
|
186
|
-
startupinfo_options['startupinfo'] = startupinfo
|
187
|
-
|
188
|
-
# Definindo stdout, stderr e stdin para DEVNULL para esconder saídas
|
189
|
-
startupinfo_options['stdout'] = subprocess.DEVNULL
|
190
|
-
startupinfo_options['stderr'] = subprocess.DEVNULL
|
191
|
-
startupinfo_options['stdin'] = subprocess.DEVNULL
|
192
|
-
|
193
|
-
elif system_user in ["Linux", "Darwin"]:
|
194
|
-
# Para Linux e macOS, ocultar stdout, stderr e stdin
|
195
|
-
startupinfo_options['stdout'] = subprocess.DEVNULL
|
196
|
-
startupinfo_options['stderr'] = subprocess.DEVNULL
|
197
|
-
startupinfo_options['stdin'] = subprocess.DEVNULL
|
198
|
-
|
199
|
-
else:
|
200
|
-
# Exceção para sistemas não suportados
|
201
|
-
raise NotImplementedError(f"O sistema {system_user} não é suportado para ocultação de comandos.")
|
202
|
-
|
203
|
-
return startupinfo_options
|