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.
@@ -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