anipy-cli 3.5.9__py3-none-any.whl → 3.7.0__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.

Potentially problematic release.


This version of anipy-cli might be problematic. Click here for more details.

@@ -189,19 +189,19 @@ class MALMenu(MenuBase):
189
189
  config = Config()
190
190
 
191
191
  choices = []
192
- if config.mal_dub_tag:
192
+ if config.tracker_dub_tag:
193
193
  choices.append(
194
194
  Choice(
195
- value=config.mal_dub_tag,
196
- name=f"{config.mal_dub_tag} (sets wheter you prefer to watch a particular anime in dub)",
195
+ value=config.tracker_dub_tag,
196
+ name=f"{config.tracker_dub_tag} (sets wheter you prefer to watch a particular anime in dub)",
197
197
  )
198
198
  )
199
199
 
200
- if config.mal_ignore_tag:
200
+ if config.tracker_ignore_tag:
201
201
  choices.append(
202
202
  Choice(
203
- value=config.mal_ignore_tag,
204
- name=f"{config.mal_ignore_tag} (sets wheter anipy-cli will ignore a particular anime)",
203
+ value=config.tracker_ignore_tag,
204
+ name=f"{config.tracker_ignore_tag} (sets wheter anipy-cli will ignore a particular anime)",
205
205
  )
206
206
  )
207
207
 
@@ -275,7 +275,7 @@ class MALMenu(MenuBase):
275
275
  )
276
276
  DownloadComponent.serve_download_errors(errors)
277
277
 
278
- self.print_options(clear_screen=len(errors) == 0)
278
+ self.print_options(should_clear_screen=len(errors) == 0)
279
279
 
280
280
  def binge_latest(self):
281
281
  picked = self._choose_latest()
@@ -320,12 +320,12 @@ class MALMenu(MenuBase):
320
320
  with DotSpinner("Syncing Seasonals into MyAnimeList") as s:
321
321
  for k, v in mappings.items():
322
322
  tags = set()
323
- if config.mal_dub_tag:
323
+ if config.tracker_dub_tag:
324
324
  if k.language == LanguageTypeEnum.DUB:
325
- tags.add(config.mal_dub_tag)
325
+ tags.add(config.tracker_dub_tag)
326
326
 
327
327
  if v.my_list_status:
328
- if config.mal_ignore_tag in v.my_list_status.tags:
328
+ if config.tracker_ignore_tag in v.my_list_status.tags:
329
329
  continue
330
330
  tags |= set(v.my_list_status.tags)
331
331
 
@@ -343,8 +343,8 @@ class MALMenu(MenuBase):
343
343
  mappings = self._create_maps_mal(mylist)
344
344
  with DotSpinner("Syncing MyAnimeList into Seasonals") as s:
345
345
  for k, v in mappings.items():
346
- if config.mal_dub_tag:
347
- if k.my_list_status and config.mal_dub_tag in k.my_list_status.tags:
346
+ if config.tracker_dub_tag:
347
+ if k.my_list_status and config.tracker_dub_tag in k.my_list_status.tags:
348
348
  pref_lang = LanguageTypeEnum.DUB
349
349
  else:
350
350
  pref_lang = LanguageTypeEnum.SUB
@@ -444,8 +444,8 @@ class MALMenu(MenuBase):
444
444
  )
445
445
  continue
446
446
 
447
- if config.mal_dub_tag:
448
- if e.my_list_status and config.mal_dub_tag in e.my_list_status.tags:
447
+ if config.tracker_dub_tag:
448
+ if e.my_list_status and config.tracker_dub_tag in e.my_list_status.tags:
449
449
  pref_lang = LanguageTypeEnum.DUB
450
450
  else:
451
451
  pref_lang = LanguageTypeEnum.SUB
@@ -629,7 +629,7 @@ class MALMenu(MenuBase):
629
629
  def _format_mal_anime(anime: MALAnime) -> str:
630
630
  config = Config()
631
631
  dub = (
632
- config.mal_dub_tag in anime.my_list_status.tags
632
+ config.tracker_dub_tag in anime.my_list_status.tags
633
633
  if anime.my_list_status
634
634
  else False
635
635
  )
anipy_cli/menus/menu.py CHANGED
@@ -6,6 +6,7 @@ from InquirerPy.base.control import Choice
6
6
  from anipy_api.download import Downloader
7
7
  from anipy_api.provider import LanguageTypeEnum, ProviderStream
8
8
  from anipy_api.locallist import LocalList
9
+ import anipy_cli.logger as logger
9
10
 
10
11
  from anipy_cli.colors import colors, cprint
11
12
  from anipy_cli.config import Config
@@ -221,10 +222,12 @@ class Menu(MenuBase):
221
222
  def progress_indicator(percentage: float):
222
223
  s.set_text(f"Downloading ({percentage:.1f}%)")
223
224
 
224
- def info_display(message: str):
225
+ def info_display(message: str, exc_info: BaseException | None = None):
226
+ logger.info(message, exc_info, exc_info is not None)
225
227
  s.write(f"> {message}")
226
228
 
227
- def error_display(message: str):
229
+ def error_display(message: str, exc_info: BaseException | None = None):
230
+ logger.error(message, exc_info)
228
231
  s.write(f"{colors.RED}! {message}{colors.END}")
229
232
 
230
233
  downloader = Downloader(progress_indicator, info_display, error_display)
@@ -8,7 +8,7 @@ from anipy_api.anime import Anime
8
8
  from anipy_api.provider import LanguageTypeEnum
9
9
  from anipy_api.provider.base import Episode
10
10
  from anipy_api.locallist import LocalList, LocalListEntry
11
- from anipy_api.error import ProviderNotAvailable
11
+ from anipy_api.error import ProviderNotAvailableError
12
12
  from InquirerPy import inquirer
13
13
  from InquirerPy.base.control import Choice
14
14
  from InquirerPy.utils import get_style
@@ -67,7 +67,7 @@ class SeasonalMenu(MenuBase):
67
67
  for s in self.seasonal_list.get_all():
68
68
  try:
69
69
  anime = Anime.from_local_list_entry(s)
70
- except ProviderNotAvailable:
70
+ except ProviderNotAvailableError:
71
71
  error(
72
72
  f"Can not load '{s.name}' because the configured provider"
73
73
  f" '{s.provider}' was not found, maybe try to migrate"
@@ -212,7 +212,7 @@ class SeasonalMenu(MenuBase):
212
212
 
213
213
  def migrate_provider(self):
214
214
  migrate_provider("seasonal", self.seasonal_list)
215
- self.print_options(clear_screen=True)
215
+ self.print_options(should_clear_screen=True)
216
216
 
217
217
  def download_latest(self):
218
218
  picked = self._choose_latest()
@@ -232,7 +232,7 @@ class SeasonalMenu(MenuBase):
232
232
 
233
233
  if not self.options.auto_update:
234
234
  # Clear screen only if there were no issues
235
- self.print_options(clear_screen=len(failed_series) == 0)
235
+ self.print_options(should_clear_screen=len(failed_series) == 0)
236
236
 
237
237
  def binge_latest(self):
238
238
  picked = self._choose_latest()
anipy_cli/util.py CHANGED
@@ -1,8 +1,11 @@
1
+ import logging
2
+ import os
1
3
  import sys
2
4
  import subprocess as sp
3
5
  from pathlib import Path
4
6
  from typing import (
5
7
  TYPE_CHECKING,
8
+ Any,
6
9
  Iterator,
7
10
  List,
8
11
  Literal,
@@ -12,6 +15,8 @@ from typing import (
12
15
  overload,
13
16
  )
14
17
 
18
+ import anipy_cli.logger as logger
19
+
15
20
  from anipy_api.anime import Anime
16
21
  from anipy_api.download import Downloader, PostDownloadCallback
17
22
  from anipy_api.locallist import LocalListData
@@ -31,7 +36,7 @@ if TYPE_CHECKING:
31
36
 
32
37
 
33
38
  class DotSpinner(Yaspin):
34
- def __init__(self, *text_and_colors, **spinner_args):
39
+ def __init__(self, *text_and_colors: Any, **spinner_args: Any):
35
40
  super().__init__(
36
41
  text=color(*text_and_colors),
37
42
  color="cyan",
@@ -43,21 +48,26 @@ class DotSpinner(Yaspin):
43
48
  self.start()
44
49
  return self
45
50
 
46
- def set_text(self, *text_and_colors):
51
+ def set_text(self, *text_and_colors: Any):
47
52
  self.text = color(*text_and_colors)
48
53
 
49
54
 
50
55
  @overload
51
56
  def error(error: str, fatal: Literal[True]) -> NoReturn: ...
52
57
  @overload
53
- def error(error: str, fatal: Literal[False] = ...) -> None: ...
58
+ def error(
59
+ error: str, fatal: Literal[False] = ..., log_level: int = logging.INFO
60
+ ) -> None: ...
54
61
 
55
62
 
56
- def error(error: str, fatal: bool = False) -> Union[NoReturn, None]:
63
+ def error(
64
+ error: str, fatal: bool = False, log_level: int = logging.INFO
65
+ ) -> Union[NoReturn, None]:
57
66
  if not fatal:
58
67
  sys.stderr.write(
59
68
  color(colors.RED, "anipy-cli: error: ", colors.END, f"{error}\n")
60
69
  )
70
+ logger.log(log_level, error)
61
71
  return
62
72
 
63
73
  sys.stderr.write(
@@ -68,9 +78,16 @@ def error(error: str, fatal: bool = False) -> Union[NoReturn, None]:
68
78
  f"{error}, exiting\n",
69
79
  )
70
80
  )
81
+ logger.warn(error)
71
82
  sys.exit(1)
72
83
 
73
84
 
85
+ def clear_screen():
86
+ if logger.get_console_log_level() < 60:
87
+ return
88
+ os.system("cls" if os.name == "nt" else "clear")
89
+
90
+
74
91
  def get_prefered_providers(mode: str) -> Iterator["BaseProvider"]:
75
92
  config = Config()
76
93
  preferred_providers = config.providers[mode]
@@ -206,7 +223,7 @@ def get_configured_player(player_override: Optional[str] = None) -> "PlayerBase"
206
223
  return get_player(player, args, discord_cb)
207
224
 
208
225
 
209
- def get_anime_season(month):
226
+ def get_anime_season(month: int):
210
227
  if 1 <= month <= 3:
211
228
  return "Winter"
212
229
  elif 4 <= month <= 6:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: anipy-cli
3
- Version: 3.5.9
3
+ Version: 3.7.0
4
4
  Summary: Watch and Download anime from the comfort of your Terminal
5
5
  License: GPL-3.0
6
6
  Keywords: anime,cli
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.10
14
14
  Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Programming Language :: Python :: 3.13
17
- Requires-Dist: anipy-api (>=3.5.9,<4.0.0)
17
+ Requires-Dist: anipy-api (>=3.7.0,<4.0.0)
18
18
  Requires-Dist: appdirs (>=1.4.4,<2.0.0)
19
19
  Requires-Dist: inquirerpy (>=0.3.4,<0.4.0)
20
20
  Requires-Dist: pypresence (>=4.3.0,<5.0.0)
@@ -0,0 +1,31 @@
1
+ anipy_cli/__init__.py,sha256=EL0yP7gZXBY46LGldGizAg2y65A4G__8xgoFACNgKns,48
2
+ anipy_cli/anilist_proxy.py,sha256=Uc1fyiz6wOGNMZgBvt312qfVElkAWPkzz4RV8PQH_mw,7293
3
+ anipy_cli/arg_parser.py,sha256=eWoWZCtjMBCj-VY7Nc_Qd1tm4JKE0e4CO5K-yXY96bQ,7496
4
+ anipy_cli/cli.py,sha256=XHWIwjCRxRhzrwOB8sjaA7pf8UzJUH1DWMHucxYbhJ8,2902
5
+ anipy_cli/clis/__init__.py,sha256=zJrVQnb9E1sDsZKdFT1aoD9zNKrWxa291ZR0sPjBbRY,479
6
+ anipy_cli/clis/anilist_cli.py,sha256=XuDmEnAwOpXn3AtH2M3I7SHH_o0btOmEIaGh_jDHa3A,1857
7
+ anipy_cli/clis/base_cli.py,sha256=JfS7mnxNgTK4_Pqeg4IyjHluhfVyO_YLL_TqdyTtyiQ,803
8
+ anipy_cli/clis/binge_cli.py,sha256=ioZ-V0WfGYBqETFkd8epGrT9dPHwsRJ1qvIdqf4waIs,2551
9
+ anipy_cli/clis/default_cli.py,sha256=aJrJwtwdD7l-Z3dMjSHlvMvgTVnwA3_OXwS-9DZQIy8,3078
10
+ anipy_cli/clis/download_cli.py,sha256=sREoLhgiPk5nQ7eFzbbGznyt80_uaE4VhiOCxrg4ce0,2400
11
+ anipy_cli/clis/history_cli.py,sha256=2ccv6BpQQpUhY4K-KM7lO9qxVLXBrmCY5lec6czipSE,2863
12
+ anipy_cli/clis/mal_cli.py,sha256=_tSLgDUOa6GOZNyCncSSzaVj088y5GAKkHVRSndLLxk,2258
13
+ anipy_cli/clis/seasonal_cli.py,sha256=GV2TQNm9UotG1cxfYbrFFgg7Jmy8SFa7w_GlFtPdRVE,616
14
+ anipy_cli/colors.py,sha256=l4KJoAMnkie6guktKMnYcfAHajPTMamTsPHiUIxF92c,974
15
+ anipy_cli/config.py,sha256=lIs1eEwFWdmY_dAvY4AspHUQwUxp8kMBmiXanyuYFAo,18328
16
+ anipy_cli/discord.py,sha256=c6mdqnEdblzZBYs3cGP66oDeS4ySm59OfTRP-R-Duls,1160
17
+ anipy_cli/download_component.py,sha256=8W_AMeT1pIdA18uaMQosf6W7V9QhF-hf5nipZ0UwGvw,6216
18
+ anipy_cli/logger.py,sha256=beLn_fr4iRFU_AuUvhuA6Y25X4kheK7Hr6mQmugvXi0,5194
19
+ anipy_cli/mal_proxy.py,sha256=qlV-sLE_ergyM4zPjFSvTdCLvjzwdfIJZlwJNKTTHlY,7134
20
+ anipy_cli/menus/__init__.py,sha256=U9RLQ61ulY3MpHvz3Q02my_q61LoM3KY1SLd9v3JhnY,253
21
+ anipy_cli/menus/anilist_menu.py,sha256=54OHxBCqxME40227fhar4n685NQlFZPIqmpvGT8rtlc,24134
22
+ anipy_cli/menus/base_menu.py,sha256=vDvPI36grmk0Dklthj3d_3yE_vG9oyHWNrWwVvJLxpg,1132
23
+ anipy_cli/menus/mal_menu.py,sha256=9z8FbwLH8py6TY0pq7Llk3cNPRCVgKUnmBvcTbItQDk,23760
24
+ anipy_cli/menus/menu.py,sha256=BasA7VOLS8ajlAJ2pFANiHm9BeBiRDSdyThWBcA4AjE,8645
25
+ anipy_cli/menus/seasonal_menu.py,sha256=CdtK1Z98z31et0q18MeVqdsIrP3IWOxX9CALOyTRCDE,8949
26
+ anipy_cli/prompts.py,sha256=fegNqV7mPxY2bG6OjrB23hjFce9GvOyLisA3eHrJegs,11909
27
+ anipy_cli/util.py,sha256=D-eSkUakEk6WMT-eHfTdzfM8THdIrdQUV8z-wnEMtq8,7102
28
+ anipy_cli-3.7.0.dist-info/METADATA,sha256=iGLLRp1HMXMlT8Rc4APSUUUaCz2lJSbiJe0TH-Nqqm8,3481
29
+ anipy_cli-3.7.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
30
+ anipy_cli-3.7.0.dist-info/entry_points.txt,sha256=86iXpcm_ECFndrt0JAI2mqYfXC2Ar7mGi0iOaxCrNP0,51
31
+ anipy_cli-3.7.0.dist-info/RECORD,,
@@ -1,27 +0,0 @@
1
- anipy_cli/__init__.py,sha256=3dreDxFAFg1K_OCOBdPxVErQrRu-mCB5jbEa3bN2sVI,48
2
- anipy_cli/arg_parser.py,sha256=efUOHrMcKkEELbkxsudSzHC0FF2Z_tSFDTmDBqirVGY,6459
3
- anipy_cli/cli.py,sha256=Bk2H15VRF34yKLbGgKVq0A2vdByMJj-JTyx7Ep-JbH0,2238
4
- anipy_cli/clis/__init__.py,sha256=Y00uiPWiMvvRImxJMvfLA55BOkMUOrrx5vJUNvquNsY,411
5
- anipy_cli/clis/base_cli.py,sha256=JfS7mnxNgTK4_Pqeg4IyjHluhfVyO_YLL_TqdyTtyiQ,803
6
- anipy_cli/clis/binge_cli.py,sha256=ioZ-V0WfGYBqETFkd8epGrT9dPHwsRJ1qvIdqf4waIs,2551
7
- anipy_cli/clis/default_cli.py,sha256=aJrJwtwdD7l-Z3dMjSHlvMvgTVnwA3_OXwS-9DZQIy8,3078
8
- anipy_cli/clis/download_cli.py,sha256=sREoLhgiPk5nQ7eFzbbGznyt80_uaE4VhiOCxrg4ce0,2400
9
- anipy_cli/clis/history_cli.py,sha256=2ccv6BpQQpUhY4K-KM7lO9qxVLXBrmCY5lec6czipSE,2863
10
- anipy_cli/clis/mal_cli.py,sha256=_tSLgDUOa6GOZNyCncSSzaVj088y5GAKkHVRSndLLxk,2258
11
- anipy_cli/clis/seasonal_cli.py,sha256=GV2TQNm9UotG1cxfYbrFFgg7Jmy8SFa7w_GlFtPdRVE,616
12
- anipy_cli/colors.py,sha256=voXC7z1Fs9tHg4zzNTNMIrt9k-EVgJ3_xEf5KiW2xgo,916
13
- anipy_cli/config.py,sha256=Vc2KlfbZddQw7Jb8GNUAiUSAGjKVgdRo4h8icClW75k,17975
14
- anipy_cli/discord.py,sha256=c6mdqnEdblzZBYs3cGP66oDeS4ySm59OfTRP-R-Duls,1160
15
- anipy_cli/download_component.py,sha256=5TxlipuaN0tHZkysOmGJB8kd9CxJBXuD_CGnYzU4r-Q,5590
16
- anipy_cli/mal_proxy.py,sha256=me2ESB442pYeNEpHY8mqrOEb477UA0uAg2LprKcp8sM,7098
17
- anipy_cli/menus/__init__.py,sha256=aIzbphxAW-QGfZwR1DIegFZuTJp1O3tSUnai0f0f4lY,185
18
- anipy_cli/menus/base_menu.py,sha256=g5b9Z7SpvCxcq_vqObcPzxLwcXeGPltLgSwa0sEzyfk,1140
19
- anipy_cli/menus/mal_menu.py,sha256=jAVJh7K5d0BCnoT4qUIZ7CavrnrctXj-eg9k8E90ulE,23697
20
- anipy_cli/menus/menu.py,sha256=QEZfUr_9Epc9ghuZDZGxJxBkmcQK86ZXJaMChzzygko,8416
21
- anipy_cli/menus/seasonal_menu.py,sha256=rH_6XRKN_2DvMAo5LHuzoO8aATkHgz66dO3kGATnGLs,8925
22
- anipy_cli/prompts.py,sha256=fegNqV7mPxY2bG6OjrB23hjFce9GvOyLisA3eHrJegs,11909
23
- anipy_cli/util.py,sha256=Omoq_OtfyxUYvaWyjsinDv50xNVHtDEDVb2cQAGVwu8,6745
24
- anipy_cli-3.5.9.dist-info/METADATA,sha256=Qm19pWu5D4ZqqCUs0DC-QGnSBsVTWRHPPhJG_4JUfK8,3481
25
- anipy_cli-3.5.9.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
26
- anipy_cli-3.5.9.dist-info/entry_points.txt,sha256=86iXpcm_ECFndrt0JAI2mqYfXC2Ar7mGi0iOaxCrNP0,51
27
- anipy_cli-3.5.9.dist-info/RECORD,,