udemy-userAPI 0.3.10__py3-none-any.whl → 0.3.11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- udemy_userAPI/__version__.py +1 -1
- udemy_userAPI/authenticate.py +22 -22
- {udemy_userAPI-0.3.10.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.10.dist-info/RECORD +0 -29
- {udemy_userAPI-0.3.10.dist-info → udemy_userAPI-0.3.11.dist-info}/LICENSE +0 -0
- {udemy_userAPI-0.3.10.dist-info → udemy_userAPI-0.3.11.dist-info}/WHEEL +0 -0
- {udemy_userAPI-0.3.10.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
|