weeb-cli 2.9.4__tar.gz → 2.10.0__tar.gz

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.
Files changed (97) hide show
  1. {weeb_cli-2.9.4/weeb_cli.egg-info → weeb_cli-2.10.0}/PKG-INFO +1 -1
  2. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/pyproject.toml +1 -1
  3. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_providers.py +94 -0
  4. weeb_cli-2.10.0/weeb_cli/__init__.py +1 -0
  5. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/__init__.py +1 -0
  6. weeb_cli-2.10.0/weeb_cli/providers/weeb.py +113 -0
  7. {weeb_cli-2.9.4 → weeb_cli-2.10.0/weeb_cli.egg-info}/PKG-INFO +1 -1
  8. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/SOURCES.txt +1 -0
  9. weeb_cli-2.9.4/weeb_cli/__init__.py +0 -1
  10. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/LICENSE +0 -0
  11. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/README.md +0 -0
  12. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/setup.cfg +0 -0
  13. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_anilist_tracker.py +0 -0
  14. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_api.py +0 -0
  15. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_cache.py +0 -0
  16. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_exceptions.py +0 -0
  17. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_kitsu_tracker.py +0 -0
  18. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_mal_tracker.py +0 -0
  19. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_sanitizer.py +0 -0
  20. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_sanitizer_security.py +0 -0
  21. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/__main__.py +0 -0
  22. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/api.py +0 -0
  23. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/downloads.py +0 -0
  24. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/library.py +0 -0
  25. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/__init__.py +0 -0
  26. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/anime_details.py +0 -0
  27. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/download_flow.py +0 -0
  28. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/episode_utils.py +0 -0
  29. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/search_handlers.py +0 -0
  30. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/stream_utils.py +0 -0
  31. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/watch_flow.py +0 -0
  32. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search.py +0 -0
  33. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/serve.py +0 -0
  34. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/__init__.py +0 -0
  35. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_backup.py +0 -0
  36. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_cache.py +0 -0
  37. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_config.py +0 -0
  38. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_download.py +0 -0
  39. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_drives.py +0 -0
  40. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_menu.py +0 -0
  41. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_shortcuts.py +0 -0
  42. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_trackers.py +0 -0
  43. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings.py +0 -0
  44. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/setup.py +0 -0
  45. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/watchlist.py +0 -0
  46. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/config.py +0 -0
  47. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/exceptions.py +0 -0
  48. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/i18n.py +0 -0
  49. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/locales/en.json +0 -0
  50. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/locales/tr.json +0 -0
  51. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/main.py +0 -0
  52. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/allanime.py +0 -0
  53. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/animecix.py +0 -0
  54. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/anizle.py +0 -0
  55. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/base.py +0 -0
  56. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/extractors/__init__.py +0 -0
  57. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/extractors/megacloud.py +0 -0
  58. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/hianime.py +0 -0
  59. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/registry.py +0 -0
  60. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/turkanime.py +0 -0
  61. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/__init__.py +0 -0
  62. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/_base.py +0 -0
  63. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/_tracker_base.py +0 -0
  64. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/cache.py +0 -0
  65. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/database.py +0 -0
  66. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/dependency_manager.py +0 -0
  67. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/details.py +0 -0
  68. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/discord_rpc.py +0 -0
  69. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/downloader.py +0 -0
  70. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/error_handler.py +0 -0
  71. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/headless_downloader.py +0 -0
  72. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/local_library.py +0 -0
  73. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/logger.py +0 -0
  74. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/notifier.py +0 -0
  75. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/player.py +0 -0
  76. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/progress.py +0 -0
  77. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/scraper.py +0 -0
  78. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/search.py +0 -0
  79. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/shortcuts.py +0 -0
  80. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/stream_validator.py +0 -0
  81. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/tracker.py +0 -0
  82. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/updater.py +0 -0
  83. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/watch.py +0 -0
  84. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/templates/anilist_error.html +0 -0
  85. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/templates/anilist_success.html +0 -0
  86. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/templates/mal_error.html +0 -0
  87. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/templates/mal_success.html +0 -0
  88. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/ui/__init__.py +0 -0
  89. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/ui/header.py +0 -0
  90. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/ui/menu.py +0 -0
  91. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/ui/prompt.py +0 -0
  92. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/utils/__init__.py +0 -0
  93. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/utils/sanitizer.py +0 -0
  94. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/dependency_links.txt +0 -0
  95. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/entry_points.txt +0 -0
  96. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/requires.txt +0 -0
  97. {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: weeb-cli
3
- Version: 2.9.4
3
+ Version: 2.10.0
4
4
  Summary: Tarayıcı yok, reklam yok, dikkat dağıtıcı unsur yok. Sadece siz ve eşsiz bir anime izleme deneyimi.
5
5
  Author-email: ewgsta <ewgst@proton.me>
6
6
  License-Expression: GPL-3.0-only
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "weeb-cli"
7
- version = "2.9.4"
7
+ version = "2.10.0"
8
8
  description = "Tarayıcı yok, reklam yok, dikkat dağıtıcı unsur yok. Sadece siz ve eşsiz bir anime izleme deneyimi."
9
9
  readme = "README.md"
10
10
  authors = [{ name = "ewgsta", email = "ewgst@proton.me" }]
@@ -5,7 +5,9 @@ from weeb_cli.providers.turkanime import TurkAnimeProvider
5
5
  from weeb_cli.providers.anizle import AnizleProvider
6
6
  from weeb_cli.providers.hianime import HiAnimeProvider
7
7
  from weeb_cli.providers.allanime import AllAnimeProvider
8
+ from weeb_cli.providers.weeb import WeebProvider
8
9
  from weeb_cli.providers.base import AnimeResult, AnimeDetails, Episode, StreamLink
10
+ import json
9
11
 
10
12
 
11
13
  class TestAnimeCixProvider:
@@ -331,3 +333,95 @@ class TestAllAnimeProvider:
331
333
  if episodes:
332
334
  assert isinstance(episodes[0], Episode)
333
335
  assert episodes[0].number == 1
336
+
337
+
338
+ class TestWeebProvider:
339
+
340
+ @pytest.fixture
341
+ def provider(self):
342
+ return WeebProvider()
343
+
344
+ def test_search(self, provider):
345
+ with patch.object(WeebProvider, '_request') as mock_request:
346
+ mock_request.return_value = {
347
+ "data": [
348
+ {
349
+ "id": "1",
350
+ "name": "Ubel Blatt",
351
+ "slug": "ubel-blatt",
352
+ "first_image": "https://test.com/image.jpg"
353
+ }
354
+ ]
355
+ }
356
+
357
+ results = provider.search("Ubel Blatt")
358
+
359
+ assert len(results) == 1
360
+ assert isinstance(results[0], AnimeResult)
361
+ assert results[0].title == "Ubel Blatt"
362
+ assert results[0].id == "ubel-blatt"
363
+ assert results[0].cover == "https://test.com/image.jpg"
364
+
365
+ def test_get_details(self, provider):
366
+ with patch.object(WeebProvider, '_request') as mock_request:
367
+ mock_request.return_value = {
368
+ "data": {
369
+ "id": "1",
370
+ "name": "Ubel Blatt",
371
+ "slug": "ubel-blatt",
372
+ "description": "Test description",
373
+ "categories": ["Aksiyon", "Macera"],
374
+ "season_number": 1,
375
+ "episodes": [
376
+ {
377
+ "episode_number": 1,
378
+ "sources": [
379
+ {"label": "Primary", "watch_url": "/watch/token1"}
380
+ ]
381
+ }
382
+ ]
383
+ }
384
+ }
385
+
386
+ details = provider.get_details("ubel-blatt")
387
+
388
+ assert details is not None
389
+ assert isinstance(details, AnimeDetails)
390
+ assert details.title == "Ubel Blatt"
391
+ assert len(details.episodes) == 1
392
+ assert details.episodes[0].number == 1
393
+
394
+ sources = json.loads(details.episodes[0].id)
395
+ assert sources[0]["label"] == "Primary"
396
+
397
+ def test_get_streams_from_json_id(self, provider):
398
+ sources = [{"label": "Primary", "watch_url": "/watch/token1"}]
399
+ episode_id = json.dumps(sources)
400
+
401
+ streams = provider.get_streams("ubel-blatt", episode_id)
402
+
403
+ assert len(streams) == 1
404
+ assert isinstance(streams[0], StreamLink)
405
+ assert streams[0].url == "https://anime-api.ewgsta.workers.dev/watch/token1"
406
+ assert streams[0].server == "Primary"
407
+
408
+ def test_get_streams_fallback(self, provider):
409
+ with patch.object(WeebProvider, '_request') as mock_request:
410
+ mock_request.return_value = {
411
+ "data": {
412
+ "episodes": [
413
+ {
414
+ "episode_number": 1,
415
+ "sources": [
416
+ {"label": "Primary", "watch_url": "/watch/token1"}
417
+ ]
418
+ }
419
+ ]
420
+ }
421
+ }
422
+
423
+ streams = provider.get_streams("ubel-blatt", "1")
424
+
425
+ assert len(streams) == 1
426
+ assert streams[0].url == "https://anime-api.ewgsta.workers.dev/watch/token1"
427
+
@@ -0,0 +1 @@
1
+ __version__ = "2.10.0"
@@ -12,6 +12,7 @@ from weeb_cli.providers import anizle
12
12
  from weeb_cli.providers import turkanime
13
13
  from weeb_cli.providers import hianime
14
14
  from weeb_cli.providers import allanime
15
+ from weeb_cli.providers import weeb
15
16
 
16
17
  __all__ = [
17
18
  "BaseProvider",
@@ -0,0 +1,113 @@
1
+ import json
2
+ from typing import List, Optional
3
+
4
+ from weeb_cli.providers.base import (
5
+ AnimeDetails,
6
+ AnimeResult,
7
+ BaseProvider,
8
+ Episode,
9
+ StreamLink,
10
+ )
11
+ from weeb_cli.providers.registry import register_provider
12
+
13
+ BASE_URL = "https://anime-api.ewgsta.workers.dev"
14
+
15
+
16
+ @register_provider("weeb", lang="tr", region="TR")
17
+ class WeebProvider(BaseProvider):
18
+ def __init__(self):
19
+ super().__init__()
20
+ self.headers.update({"Accept": "application/json"})
21
+
22
+ def search(self, query: str) -> List[AnimeResult]:
23
+ if not query or len(query) < 2:
24
+ return []
25
+
26
+ data = self._request(f"{BASE_URL}/search", params={"q": query})
27
+ if not data or "data" not in data:
28
+ return []
29
+
30
+ results = []
31
+ for item in data["data"]:
32
+ results.append(
33
+ AnimeResult(
34
+ id=item["slug"], title=item["name"], cover=item.get("first_image")
35
+ )
36
+ )
37
+ return results
38
+
39
+ def get_details(self, anime_id: str) -> Optional[AnimeDetails]:
40
+ data = self._request(f"{BASE_URL}/animes/{anime_id}")
41
+ if not data or "data" not in data:
42
+ return None
43
+
44
+ anime_data = data["data"]
45
+ episodes = []
46
+
47
+ for ep in anime_data.get("episodes", []):
48
+ sources_json = json.dumps(ep.get("sources", []))
49
+ ep_num = ep.get("episode_number", 0)
50
+ episodes.append(
51
+ Episode(
52
+ id=sources_json,
53
+ number=ep_num,
54
+ title=f"Bölüm {ep_num}",
55
+ season=anime_data.get("season_number", 1),
56
+ )
57
+ )
58
+
59
+ return AnimeDetails(
60
+ id=anime_id,
61
+ title=anime_data.get("name", anime_id),
62
+ description=anime_data.get("description"),
63
+ cover=anime_data.get("first_image"),
64
+ genres=anime_data.get("categories", []),
65
+ episodes=episodes,
66
+ total_episodes=len(episodes),
67
+ )
68
+
69
+ def get_episodes(self, anime_id: str) -> List[Episode]:
70
+ details = self.get_details(anime_id)
71
+ return details.episodes if details else []
72
+
73
+ def get_streams(self, anime_id: str, episode_id: str) -> List[StreamLink]:
74
+ try:
75
+ sources = json.loads(episode_id)
76
+ if isinstance(sources, list):
77
+ streams = []
78
+ for src in sources:
79
+ watch_url = src.get("watch_url", "")
80
+ if watch_url:
81
+ streams.append(
82
+ StreamLink(
83
+ url=f"{BASE_URL}{watch_url}",
84
+ quality="auto",
85
+ server=src.get("label", "default"),
86
+ )
87
+ )
88
+ if streams:
89
+ return streams
90
+ except (json.JSONDecodeError, ValueError, TypeError):
91
+ pass
92
+
93
+ data = self._request(f"{BASE_URL}/animes/{anime_id}")
94
+ if not data or "data" not in data:
95
+ return []
96
+
97
+ anime_data = data["data"]
98
+ for ep in anime_data.get("episodes", []):
99
+ if str(ep.get("episode_number")) == str(episode_id):
100
+ streams = []
101
+ for src in ep.get("sources", []):
102
+ watch_url = src.get("watch_url", "")
103
+ if watch_url:
104
+ streams.append(
105
+ StreamLink(
106
+ url=f"{BASE_URL}{watch_url}",
107
+ quality="auto",
108
+ server=src.get("label", "default"),
109
+ )
110
+ )
111
+ return streams
112
+
113
+ return []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: weeb-cli
3
- Version: 2.9.4
3
+ Version: 2.10.0
4
4
  Summary: Tarayıcı yok, reklam yok, dikkat dağıtıcı unsur yok. Sadece siz ve eşsiz bir anime izleme deneyimi.
5
5
  Author-email: ewgsta <ewgst@proton.me>
6
6
  License-Expression: GPL-3.0-only
@@ -56,6 +56,7 @@ weeb_cli/providers/base.py
56
56
  weeb_cli/providers/hianime.py
57
57
  weeb_cli/providers/registry.py
58
58
  weeb_cli/providers/turkanime.py
59
+ weeb_cli/providers/weeb.py
59
60
  weeb_cli/providers/extractors/__init__.py
60
61
  weeb_cli/providers/extractors/megacloud.py
61
62
  weeb_cli/services/__init__.py
@@ -1 +0,0 @@
1
- __version__ = "2.9.4"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes