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