udemy-userAPI 0.2.4__py3-none-any.whl → 0.2.5__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.
@@ -0,0 +1,7 @@
1
+ # m3u8_analyzer/__init__.py
2
+
3
+ from .M3u8Analyzer import M3u8Analyzer, Wrapper,EncryptSuport
4
+
5
+ __all__ = ['M3u8Analyzer', 'Wrapper','EncryptSuport']
6
+ if __name__ == '__main__':
7
+ raise RuntimeError("no escope!")
@@ -0,0 +1 @@
1
+ __version__ = '1.0.4.1'
@@ -0,0 +1,82 @@
1
+ class M3u8AnalyzerExceptions(Exception):
2
+ def __init__(self, message="Erro na análise da playlist M3U8", errors=None):
3
+ """
4
+ Exceção base para erros relacionados à análise de playlists M3U8.
5
+
6
+ Args:
7
+ message (str): Mensagem descritiva do erro. Padrão é "Erro na análise da playlist M3U8".
8
+ errors (list, optional): Lista de erros adicionais ou detalhes para diagnóstico. Padrão é None.
9
+ """
10
+ super().__init__(message)
11
+ self.errors = errors
12
+
13
+ def __str__(self):
14
+ """
15
+ Retorna a representação em string da exceção.
16
+
17
+ Returns:
18
+ str: Mensagem de erro formatada com detalhes adicionais, se presentes.
19
+ """
20
+ if self.errors:
21
+ return f"{super().__str__()} | Erros adicionais: {self.errors}"
22
+ return super().__str__()
23
+
24
+
25
+ class M3u8DownloadError(M3u8AnalyzerExceptions):
26
+ def __init__(self, message="Erro durante o download da playlist M3U8", errors=None):
27
+ """
28
+ Exceção para erros específicos ocorridos durante o download de uma playlist M3U8.
29
+
30
+ Args:
31
+ message (str): Mensagem descritiva do erro. Padrão é "Erro durante o download da playlist M3U8".
32
+ errors (list, optional): Lista de erros adicionais ou detalhes para diagnóstico. Padrão é None.
33
+ """
34
+ super().__init__(message, errors)
35
+
36
+
37
+ class M3u8FfmpegDownloadError(M3u8AnalyzerExceptions):
38
+ def __init__(self, message="Erro durante o download da playlist M3U8 com ffmpeg", errors=None):
39
+ """
40
+ Exceção para erros específicos ocorridos durante o download de uma playlist M3U8 usando ffmpeg.
41
+
42
+ Args:
43
+ message (str): Mensagem descritiva do erro. Padrão é "Erro durante o download da playlist M3U8 com ffmpeg".
44
+ errors (list, optional): Lista de erros adicionais ou detalhes para diagnóstico. Padrão é None.
45
+ """
46
+ super().__init__(message, errors)
47
+
48
+
49
+ class M3u8NetworkingError(M3u8AnalyzerExceptions):
50
+ def __init__(self, message="Erro de rede durante o download da playlist M3U8", errors=None):
51
+ """
52
+ Exceção para erros relacionados à rede durante o download de uma playlist M3U8.
53
+
54
+ Args:
55
+ message (str): Mensagem descritiva do erro. Padrão é "Erro de rede durante o download da playlist M3U8".
56
+ errors (list, optional): Lista de erros adicionais ou detalhes para diagnóstico. Padrão é None.
57
+ """
58
+ super().__init__(message, errors)
59
+
60
+
61
+ class M3u8Error(M3u8AnalyzerExceptions):
62
+ def __init__(self, message="Erro inesperado na análise de playlist M3U8", errors=None):
63
+ """
64
+ Exceção para erros inesperados que não se encaixam em outras categorias.
65
+
66
+ Args:
67
+ message (str): Mensagem descritiva do erro. Padrão é "Erro inesperado na análise de playlist M3U8".
68
+ errors (list, optional): Lista de erros adicionais ou detalhes para diagnóstico. Padrão é None.
69
+ """
70
+ super().__init__(message, errors)
71
+
72
+
73
+ class M3u8FileError(M3u8AnalyzerExceptions):
74
+ def __init__(self, message="Erro ao manipular o arquivo da playlist M3U8", errors=None):
75
+ """
76
+ Exceção para erros ocorridos ao manipular arquivos relacionados a playlists M3U8.
77
+
78
+ Args:
79
+ message (str): Mensagem descritiva do erro. Padrão é "Erro ao manipular o arquivo da playlist M3U8".
80
+ errors (list, optional): Lista de erros adicionais ou detalhes para diagnóstico. Padrão é None.
81
+ """
82
+ super().__init__(message, errors)
@@ -1,4 +1,4 @@
1
- __version__ = '0.2.4'
1
+ __version__ = '0.2.5'
2
2
  __lib_name__ = 'udemy_userAPI' # local name
3
3
  __repo_name__ = 'udemy-userAPI'
4
4
  __autor__ = 'PauloCesar-dev404'
@@ -1,10 +1,14 @@
1
1
  import json
2
2
  import os
3
3
  import pickle
4
+ import traceback
5
+
4
6
  import requests
5
7
  from .exeptions import UnhandledExceptions, UdemyUserApiExceptions, LoginException
6
8
  import cloudscraper
7
9
 
10
+ DEBUG = False
11
+
8
12
 
9
13
  class UdemyAuth:
10
14
  def __init__(self):
@@ -23,14 +27,6 @@ class UdemyAuth:
23
27
  file_name = '.udemy_userAPI' # Nome do arquivo
24
28
  self.__file_path = os.path.join(self.__user_dir, file_name)
25
29
 
26
- def __make_cookies(self, client_id: str, access_token: str, csrf_token: str):
27
- self.__cookie_dict = {
28
- 'client_id': client_id,
29
- 'access_token': access_token,
30
- 'csrf_token': csrf_token
31
- }
32
-
33
- @property
34
30
  def verif_login(self):
35
31
  """verificar se o usuario estar logado."""
36
32
 
@@ -43,6 +39,9 @@ class UdemyAuth:
43
39
  cookies_str = "; ".join([f"{key}={value}" for key, value in cookies_dict.items()])
44
40
  return cookies_str
45
41
  except Exception as e:
42
+ if DEBUG:
43
+ e = traceback.format_exc()
44
+ raise LoginException(e)
46
45
  return False
47
46
 
48
47
  log = verif_config()
@@ -70,7 +69,7 @@ class UdemyAuth:
70
69
  resp = requests.get(url=url, headers=headers)
71
70
  if resp.status_code == 200:
72
71
  convert = json.loads(resp.text)
73
- isLoggedIn = convert.get('header', {}).get('isLoggedIn',False)
72
+ isLoggedIn = convert.get('header', {}).get('isLoggedIn', False)
74
73
  if isLoggedIn:
75
74
  if isLoggedIn == True:
76
75
  return True
@@ -143,7 +142,6 @@ class UdemyAuth:
143
142
 
144
143
  # Verifica a resposta para determinar se o login foi bem-sucedido
145
144
  if "returnUrl" in r.text:
146
- self.__make_cookies(r.cookies.get("client_id"), r.cookies.get("access_token"), csrf_token)
147
145
  self.__save_cookies(s.cookies)
148
146
  else:
149
147
  login_error = r.json().get("error", {}).get("data", {}).get("formErrors", [])[0]
@@ -156,30 +154,37 @@ class UdemyAuth:
156
154
 
157
155
  return s
158
156
  except Exception as e:
159
- LoginException(e)
157
+ if DEBUG:
158
+ e = traceback.format_exc()
159
+ raise LoginException(e)
160
160
 
161
161
  def __save_cookies(self, cookies):
162
162
  try:
163
163
  with open(fr'{self.__file_path}', 'wb') as f:
164
164
  pickle.dump(cookies, f)
165
165
  except Exception as e:
166
- LoginException(e)
166
+ raise LoginException(e)
167
167
 
168
168
  @property
169
169
  def load_cookies(self) -> str:
170
- """carrega cookies e retorna-os em uma string formatada"""
170
+ """Carrega cookies e retorna-os em uma string formatada"""
171
171
  try:
172
- file = os.path.join(fr'{self.__file_path}')
173
- if os.path.exists(file):
174
- with open(fr'{self.__file_path}', 'rb') as f:
172
+ file = os.path.join(self.__file_path)
173
+ if os.path.exists(file) and os.path.getsize(file) > 0: # Verifica se o arquivo existe e não está vazio
174
+ with open(file, 'rb') as f:
175
175
  cookies = pickle.load(f)
176
+ # Converte cookies em formato de string
176
177
  cookies_dict = {cookie.name: cookie.value for cookie in cookies}
177
178
  cookies_str = "; ".join([f"{key}={value}" for key, value in cookies_dict.items()])
178
179
  return cookies_str
179
180
  else:
180
- return 'None'
181
+ return "" # Retorna uma string vazia se o arquivo não existir ou estiver vazio
182
+ except (EOFError, pickle.UnpicklingError): # Trata arquivos vazios ou corrompidos
183
+ return "" # Retorna uma string vazia
181
184
  except Exception as e:
182
- LoginException(e)
185
+ if DEBUG:
186
+ e = traceback.format_exc()
187
+ raise LoginException(f"Erro ao carregar cookies: {e}")
183
188
 
184
189
  def remove_cookies(self):
185
190
  if os.path.exists(self.__file_path):
udemy_userAPI/udemy.py CHANGED
@@ -19,7 +19,6 @@ class Udemy:
19
19
  if verif_login is None:
20
20
  raise LoginException("User Not Logged!")
21
21
 
22
- @property
23
22
  def my_subscribed_courses_by_plan(self) -> list[dict]:
24
23
  """obtém os cursos que o usuário esatá inscrito, obtidos atraves de planos(assinatura)"""
25
24
  try:
@@ -28,7 +27,6 @@ class Udemy:
28
27
  except UdemyUserApiExceptions as e:
29
28
  UnhandledExceptions(e)
30
29
 
31
- @property
32
30
  def my_subscribed_courses(self) -> list[dict]:
33
31
  """Obtém os cursos que o usuário está inscrito, excluindo listas vazias ou nulas"""
34
32
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: udemy_userAPI
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: Obtenha detalhes de cursos que o usuário esteja inscrito da plataforma Udemy,usando o EndPoint de usuário o mesmo que o navegador utiliza para acessar e redenrizar os cursos.
5
5
  Author: PauloCesar-dev404
6
6
  Author-email: paulocesar0073dev404@gmail.com
@@ -0,0 +1,29 @@
1
+ animation_consoles/__init__.py,sha256=5uHhe-PVZ54FHWxbF1sNvNt4fuQf3FtZWVo2Mjo11a8,40
2
+ animation_consoles/animation.py,sha256=ZreNtdD0HYeqlRx-f1d1twUU4sOFTR7vJ3S6tMQpnHM,2122
3
+ ffmpeg_for_python/__config__.py,sha256=nCPrYs1NkMnyfyg5ITw9wOar4nUJOxwONrItVpVBVBM,4719
4
+ ffmpeg_for_python/__init__.py,sha256=-BMtoX8Yof_pnHra2OzoV3faxMubpMvUedMy8TqI8dc,214
5
+ ffmpeg_for_python/__utils.py,sha256=Qy3J5f4lOIPcSNbTwiawfiHjYPdZ_tq7hafStnnqwA4,3263
6
+ ffmpeg_for_python/__version__.py,sha256=HLFuN4n_leeJE5twr7yH2AAFyfIcEHzxElLRP1FUKmQ,422
7
+ ffmpeg_for_python/exeptions.py,sha256=tg-TBdaq_NHxZOCAhkMttzwtJVILPAQPLOKqofe5PPA,3627
8
+ ffmpeg_for_python/ffmpeg.py,sha256=G2VGHOIhErsqQI4OVlUnIQGmleNCjxyFqzNAMNnoD6I,7920
9
+ m3u8_analyzer/M3u8Analyzer.py,sha256=aUgxk2jS84MFDNbjlOT8FRiJerFI_jGcKMu9uv1EwcE,36620
10
+ m3u8_analyzer/__init__.py,sha256=v7CiVqsCq2YH347C-QR1kHPJtXFFdru8qole3E9adCY,217
11
+ m3u8_analyzer/__version__.py,sha256=YP3yT87ZKrU3eARUUdQ_pg4xAXLGfBXjH4ZgEoZSq1I,25
12
+ m3u8_analyzer/exeptions.py,sha256=fK6bU3YxNSbfsPmCp4yudUvmwy_g6dj2KwIkH0dW4LI,3672
13
+ udemy_userAPI/__init__.py,sha256=BPle89xE_CMTKKe_Lw6jioYLgpH-q_Lpho2S-n1PIUA,206
14
+ udemy_userAPI/__version__.py,sha256=av-dYivm9FvwaeydwdCTzwY6FYMnAjRiqjIqUkZFNAs,405
15
+ udemy_userAPI/api.py,sha256=dpwFtXewQmKwgG1IvzDFYZoEHNTwZbLIuv4WKgbqjOg,18817
16
+ udemy_userAPI/authenticate.py,sha256=faIoOZdU5StQvUZfLEwZ3xfPba2FrFbc2HKEOeVY7w4,8246
17
+ udemy_userAPI/bultins.py,sha256=XCXMe_5qKig_q5vbSFXBtx1vM87pE3UvEMKyUy6JCRo,12202
18
+ udemy_userAPI/exeptions.py,sha256=nuZoAt4i-ctrW8zx9LZtejrngpFXDHOVE5cEXM4RtrY,508
19
+ udemy_userAPI/sections.py,sha256=zPyDhvTIQCL0nbf7OJZG28Kax_iooILQ_hywUwvHoL8,4043
20
+ udemy_userAPI/udemy.py,sha256=2UIy70wxWJAU7qZxvMDb3sHd1uQaffUXhib04ShIuI8,2124
21
+ udemy_userAPI/.cache/.udemy_userAPI,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ udemy_userAPI/mpd_analyzer/__init__.py,sha256=i3JVWyvcFLaj5kPmx8c1PgjsLht7OUIQQClD4yqYbo8,102
23
+ udemy_userAPI/mpd_analyzer/bin.wvd,sha256=1rAJdCc120hQlX9qe5KUS628eY2ZHYxQSmyhGNefSzo,2956
24
+ udemy_userAPI/mpd_analyzer/mpd_parser.py,sha256=_vw1feJXDjw5fQLOmA5-H3UklX_30Pbl__HtDUqvp3c,17283
25
+ udemy_userAPI-0.2.5.dist-info/LICENSE,sha256=l4jdKYt8gSdDFOGr09vCKnMn_Im55XIcQKqTDEtFfNs,1095
26
+ udemy_userAPI-0.2.5.dist-info/METADATA,sha256=jx7z2l2U-YUTezhxrBjEgC6Ohq01YsqjjRXJ5jPYoGM,1394
27
+ udemy_userAPI-0.2.5.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
28
+ udemy_userAPI-0.2.5.dist-info/top_level.txt,sha256=SrUygl6WJt34qYigm-FiGqKCs2M4S_f-aU2i6oJ3nDM,65
29
+ udemy_userAPI-0.2.5.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ animation_consoles
2
+ ffmpeg_for_python
3
+ m3u8_analyzer
4
+ udemy_userAPI
@@ -1,17 +0,0 @@
1
- udemy_userAPI/__init__.py,sha256=BPle89xE_CMTKKe_Lw6jioYLgpH-q_Lpho2S-n1PIUA,206
2
- udemy_userAPI/__version__.py,sha256=yRNB4bHSJhN7ugz9iJp6x2b-P_k3yGzI60MkeoyisfQ,405
3
- udemy_userAPI/api.py,sha256=dpwFtXewQmKwgG1IvzDFYZoEHNTwZbLIuv4WKgbqjOg,18817
4
- udemy_userAPI/authenticate.py,sha256=JWqDHgcBh7pnRrHOL_RP3Lx32txrdCtS4biUsHq49LE,7950
5
- udemy_userAPI/bultins.py,sha256=XCXMe_5qKig_q5vbSFXBtx1vM87pE3UvEMKyUy6JCRo,12202
6
- udemy_userAPI/exeptions.py,sha256=nuZoAt4i-ctrW8zx9LZtejrngpFXDHOVE5cEXM4RtrY,508
7
- udemy_userAPI/sections.py,sha256=zPyDhvTIQCL0nbf7OJZG28Kax_iooILQ_hywUwvHoL8,4043
8
- udemy_userAPI/udemy.py,sha256=ceaXVTbQhSYkHnPIpYWUVtT6IT6jBvzYO_k4B7EFyj8,2154
9
- udemy_userAPI/.cache/.udemy_userAPI,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- udemy_userAPI/mpd_analyzer/__init__.py,sha256=i3JVWyvcFLaj5kPmx8c1PgjsLht7OUIQQClD4yqYbo8,102
11
- udemy_userAPI/mpd_analyzer/bin.wvd,sha256=1rAJdCc120hQlX9qe5KUS628eY2ZHYxQSmyhGNefSzo,2956
12
- udemy_userAPI/mpd_analyzer/mpd_parser.py,sha256=_vw1feJXDjw5fQLOmA5-H3UklX_30Pbl__HtDUqvp3c,17283
13
- udemy_userAPI-0.2.4.dist-info/LICENSE,sha256=l4jdKYt8gSdDFOGr09vCKnMn_Im55XIcQKqTDEtFfNs,1095
14
- udemy_userAPI-0.2.4.dist-info/METADATA,sha256=IWt_ESRHpa9rDwcg3Kgsm3KlE7pvY1NyDCHdBZEaE3s,1394
15
- udemy_userAPI-0.2.4.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
16
- udemy_userAPI-0.2.4.dist-info/top_level.txt,sha256=ijTINaSDRKhdahY_X7dmSRFTxBIwQErWv9ATCG55mog,14
17
- udemy_userAPI-0.2.4.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- udemy_userAPI