Unit3Dup 0.8.6__py3-none-any.whl → 0.8.8__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.
@@ -5,7 +5,6 @@ import json
5
5
  import time
6
6
  import requests
7
7
 
8
- from PIL import Image
9
8
  from abc import ABC, abstractmethod
10
9
  from common import config_settings
11
10
  from view import custom_console
@@ -163,6 +162,20 @@ class ImgFi(ImageUploader):
163
162
  def get_field_name(self) -> str:
164
163
  return 'source'
165
164
 
165
+ class PassIMA(ImageUploader):
166
+
167
+ priority= config_settings.user_preferences.PASSIMA_PRIORITY
168
+ def get_endpoint(self) -> str:
169
+ return "https://passtheima.ge/api/1/upload"
170
+
171
+ def get_data(self) -> dict:
172
+ return {
173
+ "key": self.key,
174
+ "title": self.image_name,
175
+ }
176
+
177
+ def get_field_name(self) -> str:
178
+ return 'source'
166
179
 
167
180
 
168
181
  class ImageUploaderFallback:
@@ -213,6 +226,10 @@ class ImageUploaderFallback:
213
226
 
214
227
  if uploader_host == "ImgFi":
215
228
  return response['image']['url']
229
+
230
+ if uploader_host == "PassIMA":
231
+ return response['image']['url']
232
+
216
233
  return None
217
234
 
218
235
  class Build:
@@ -232,6 +249,7 @@ class Build:
232
249
  self.LENSDUMP_KEY= config_settings.tracker_config.LENSDUMP_KEY
233
250
  self.PTSCREENS_KEY= config_settings.tracker_config.PTSCREENS_KEY
234
251
  self.IMGFI_KEY = config_settings.tracker_config.IMGFI_KEY
252
+ self.PASSIMA_KEY = config_settings.tracker_config.PASSIMA_KEY
235
253
  self.extracted_frames = extracted_frames
236
254
 
237
255
 
@@ -251,6 +269,7 @@ class Build:
251
269
  PtScreens(img_bytes, self.PTSCREENS_KEY,image_name=image_name),
252
270
  LensDump(img_bytes, self.LENSDUMP_KEY,image_name=image_name),
253
271
  ImgFi(img_bytes, self.IMGFI_KEY,image_name=image_name),
272
+ PassIMA(img_bytes, self.PASSIMA_KEY, image_name=image_name),
254
273
  ]
255
274
 
256
275
  # Sorting list based on priority
common/settings.py CHANGED
@@ -13,7 +13,7 @@ from common.utility import ManageTitles
13
13
  from common import trackers
14
14
 
15
15
  config_file = "Unit3Dbot.json"
16
- version = "0.8.6"
16
+ version = "0.8.8"
17
17
 
18
18
  if os.name == "nt":
19
19
  PW_TORRENT_ARCHIVE_PATH: Path = Path(os.getenv("LOCALAPPDATA", ".")) / "Unit3Dup_config" / "pw_torrent_archive"
@@ -46,6 +46,14 @@ def get_default_path(field: str)-> str:
46
46
  return str(default_paths[field])
47
47
 
48
48
 
49
+
50
+ class Ccolors:
51
+ OKCYAN = '\033[96m'
52
+ OKGREEN = '\033[92m'
53
+ WARNING = '\033[93m'
54
+ FAIL = '\033[91m'
55
+ ENDC = '\033[0m'
56
+
49
57
  class TrackerConfig(BaseModel):
50
58
  ITT_URL: str
51
59
  ITT_APIKEY: str | None = None
@@ -60,6 +68,7 @@ class TrackerConfig(BaseModel):
60
68
  LENSDUMP_KEY: str | None = None
61
69
  PTSCREENS_KEY: str | None = None
62
70
  IMGFI_KEY: str | None = None
71
+ PASSIMA_KEY: str | None = None
63
72
  YOUTUBE_KEY: str | None = None
64
73
  IGDB_CLIENT_ID: str | None = None
65
74
  IGDB_ID_SECRET: str | None = None
@@ -92,6 +101,7 @@ class UserPreferences(BaseModel):
92
101
  FREE_IMAGE_PRIORITY: int = 2
93
102
  IMGBB_PRIORITY: int = 3
94
103
  IMGFI_PRIORITY: int = 4
104
+ PASSIMA_PRIORITY: int = 5
95
105
  NUMBER_OF_SCREENSHOTS: int = 4
96
106
  YOUTUBE_FAV_CHANNEL_ID: str | None = None
97
107
  YOUTUBE_CHANNEL_ENABLE: bool = False
@@ -113,7 +123,7 @@ class UserPreferences(BaseModel):
113
123
  CACHE_SCR: bool = False
114
124
  CACHE_DBONLINE: bool = False
115
125
  PERSONAL_RELEASE: bool = False
116
-
126
+ FAST_LOAD: int = 0
117
127
 
118
128
 
119
129
  class Options(BaseModel):
@@ -419,7 +429,7 @@ class Config(BaseModel):
419
429
  section[field] = Validate.string(value=section[field], field_name=field)
420
430
 
421
431
  if field in ['NUMBER_OF_SCREENSHOTS','COMPRESS_SCSHOT','IMGBB_PRIORITY','FREE_IMAGE_PRIORITY',
422
- 'LENSDUMP_PRIORITY','WATCHER_INTERVAL','SIZE_TH']:
432
+ 'LENSDUMP_PRIORITY','PASSIMA_PRIORITY','WATCHER_INTERVAL','SIZE_TH', 'FAST_LOAD']:
423
433
  section[field] = Validate.integer(value=section[field], field_name=field)
424
434
 
425
435
  if field == 'PREFERRED_LANG':
@@ -502,6 +512,7 @@ class Load:
502
512
  "LENSDUMP_KEY": "no_key",
503
513
  "PTSCREENS_KEY": "no_key",
504
514
  "IMGFI_KEY": "no_key",
515
+ "PASSIMA_KEY": "no_key",
505
516
  "YOUTUBE_KEY": "no_key",
506
517
  "IGDB_CLIENT_ID": "no_key",
507
518
  "IGDB_ID_SECRET": "no_key",
@@ -524,6 +535,7 @@ class Load:
524
535
  "SHARED_RTORR_PATH": "no_path",
525
536
  "TORRENT_CLIENT": "qbittorrent",
526
537
  "TAG": "ADDED TORRENTS",
538
+ "FAST_LOAD": "0",
527
539
  },
528
540
  "user_preferences": {
529
541
  "PTSCREENS_PRIORITY": 0,
@@ -531,6 +543,7 @@ class Load:
531
543
  "FREE_IMAGE_PRIORITY": 2,
532
544
  "IMGBB_PRIORITY": 3,
533
545
  "IMGFI_PRIORITY": 4,
546
+ "PASSIMA_PRIORITY": 5,
534
547
  "NUMBER_OF_SCREENSHOTS": 4,
535
548
  "YOUTUBE_FAV_CHANNEL_ID": "UCGCbxpnt25hWPFLSbvwfg_w",
536
549
  "YOUTUBE_CHANNEL_ENABLE": "False",
@@ -740,10 +753,11 @@ class JsonConfig:
740
753
  return json.loads(json_data)
741
754
 
742
755
  except json.JSONDecodeError as e:
743
- print(f"Config Loading error.. {e}")
744
- print(r"Try to Check '\\ characters. Example: ")
745
- print(r"C:\myfolder -> not correct ")
746
- print(r"C:/myfolder -> CORRECT ")
756
+ print(f"* Please fix the error{Ccolors.WARNING} near Line {e.lineno}{Ccolors.ENDC}"
757
+ f" and {Ccolors.WARNING}Column {e.colno}{Ccolors.ENDC} in the config file: *\n")
758
+ print(f"{e.msg}\n")
759
+ # Seek And...
760
+ self.aim(line=e.lineno,col=e.colno)
747
761
  exit(1)
748
762
  except FileNotFoundError:
749
763
  print(f"Configuration '{self.default_json_path}' not found")
@@ -796,3 +810,34 @@ class JsonConfig:
796
810
 
797
811
  print(message)
798
812
 
813
+ def aim(self, line: int, col: int):
814
+ """
815
+ Try to identify the exact location of json error
816
+ Args:
817
+ line: Error line from the try block
818
+ col: Error line from the try block
819
+ Returns:
820
+ None
821
+ """
822
+
823
+ # Open the configuration file
824
+ with open(self.default_json_path, 'r') as file:
825
+ lines = file.readlines()
826
+
827
+ # Test the line value
828
+ if line <= len(lines):
829
+ # Create a "context" around the error....
830
+ line_context1 = lines[line -2].rstrip('\n')
831
+ line_context2 = lines[line + 1].rstrip('\n')
832
+
833
+ # Try to identify the position
834
+ line_text = lines[line - 1].rstrip('\n')
835
+ print(f"{line_context1}")
836
+ print(f"{Ccolors.WARNING}>>> {line_text}{Ccolors.ENDC}")
837
+
838
+ # Put the cursor under the error
839
+ cursor = ' ' * (col-1) + '^'
840
+ print(f"{Ccolors.WARNING} {cursor}{Ccolors.ENDC}")
841
+ print(f"{line_context2}")
842
+ else:
843
+ print("Line number is out of range !")
@@ -29,6 +29,11 @@ class TorrentManager:
29
29
  self.games: list[Media] = []
30
30
  self.doc: list[Media] = []
31
31
  self.cli = cli
32
+ self.fast_load = config_settings.user_preferences.FAST_LOAD
33
+ if self.fast_load < 1 or self.fast_load > 150:
34
+ # full list
35
+ self.fast_load = None
36
+
32
37
 
33
38
  def process(self, contents: list) -> None:
34
39
  """
@@ -57,6 +62,7 @@ class TorrentManager:
57
62
  if content.category in {System.category_list.get(System.MOVIE), System.category_list.get(System.TV_SHOW)}
58
63
  ]
59
64
 
65
+
60
66
  # // Build a Doc list
61
67
  self.doc = [
62
68
  content for content in contents if content.category == System.category_list.get(System.DOCUMENTARY)
@@ -78,21 +84,24 @@ class TorrentManager:
78
84
  for selected_tracker in trackers_name_list:
79
85
  # Build the torrent file and upload each GAME to the tracker
80
86
  if self.games:
81
- game_manager = GameManager(contents=self.games, cli=self.cli)
87
+ game_manager = GameManager(contents=self.games[:self.fast_load],
88
+ cli=self.cli)
82
89
  game_process_results = game_manager.process(selected_tracker=selected_tracker,
83
90
  tracker_name_list=trackers_name_list,
84
91
  tracker_archive=self.tracker_archive)
85
92
 
86
93
  # Build the torrent file and upload each VIDEO to the trackers
87
94
  if self.videos:
88
- video_manager = VideoManager(contents=self.videos, cli=self.cli)
95
+ video_manager = VideoManager(contents=self.videos[:self.fast_load],
96
+ cli=self.cli)
89
97
  video_process_results = video_manager.process(selected_tracker=selected_tracker,
90
98
  tracker_name_list=trackers_name_list,
91
99
  tracker_archive=self.tracker_archive)
92
100
 
93
101
  # Build the torrent file and upload each DOC to the tracker
94
102
  if self.doc and not self.cli.reseed:
95
- docu_manager = DocuManager(contents=self.doc, cli=self.cli)
103
+ docu_manager = DocuManager(contents=self.doc[:self.fast_load],
104
+ cli=self.cli)
96
105
  docu_process_results = docu_manager.process(selected_tracker=selected_tracker,
97
106
  tracker_name_list=trackers_name_list,
98
107
  tracker_archive=self.tracker_archive)
File without changes
unit3dup/web/main.py ADDED
@@ -0,0 +1,46 @@
1
+ from fastapi import FastAPI, APIRouter
2
+ from random import randint
3
+ from common.torrent_clients import TransmissionClient, QbittorrentClient, RTorrentClient
4
+ from common.command import CommandLine
5
+ from common.settings import Load,DEFAULT_JSON_PATH
6
+
7
+ from unit3dup.torrent import View
8
+ from unit3dup import pvtTracker
9
+ from unit3dup.bot import Bot
10
+ from view import custom_console
11
+
12
+
13
+ import uvicorn
14
+ import argparse
15
+ from random import randint
16
+
17
+ app = FastAPI()
18
+
19
+ # Classe che gestisce gli endpoint
20
+ class WebApp:
21
+ def __init__(self, config: Load):
22
+ self.router = APIRouter()
23
+ self.numb = randint(0, 100)
24
+ self._setup_routes()
25
+
26
+ def _setup_routes(self):
27
+ # Add the endpoints
28
+ self.router.add_api_route("/", self.root, methods=["GET"])
29
+ self.router.add_api_route("/upload/{name}", self.upload, methods=["GET"])
30
+
31
+ async def root(self):
32
+ return {"message": f"Hello World {self.numb}"}
33
+
34
+ async def upload(self, name: str):
35
+
36
+
37
+
38
+ return {"message": f"Hello {name}, numb is {self.numb}"}
39
+
40
+
41
+ def web():
42
+ web_app = WebApp(config=Load().load_config())
43
+ app.include_router(web_app.router)
44
+ uvicorn.run("unit3dup.web.main:app", host="127.0.0.1", port=8000, reload=True)
45
+
46
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Unit3Dup
3
- Version: 0.8.6
3
+ Version: 0.8.8
4
4
  Summary: An uploader for the Unit3D torrent tracker
5
5
  Author: Parzival
6
6
  License-Expression: MIT
@@ -63,22 +63,22 @@ It performs the following tasks:
63
63
  - Add a custom title to your seasons
64
64
  - Generate info for a title using MediaInfo
65
65
 
66
- .. image:: https://img.shields.io/badge/Upload_PDF-gr
67
- :alt: Install Upload PDF
68
-
69
66
  unit3dup can grab the first page, convert it to an image (using xpdf),
70
67
  and then the bot can upload it to an image host, then add the link to the torrent page description.
71
68
 
72
- Ubuntu/Debian Installation
73
- --------------------------
69
+ .. image:: https://img.shields.io/badge/INSTALL-gr
70
+ :alt: install
71
+
72
+ Ubuntu/Debian
73
+ -------------
74
74
  pip install unit3dup
75
75
 
76
76
  Upgrade
77
77
  -------
78
- pip install --upgrade unit3dup
78
+ pip install unit3dup --upgrade
79
79
 
80
- Dependencies
81
- ------------
80
+ Ubuntu/Debian Dependencies
81
+ --------------------------
82
82
  sudo apt install ffmpeg
83
83
 
84
84
  Only for pdf
@@ -86,6 +86,18 @@ Only for pdf
86
86
  sudo apt install poppler-utils
87
87
 
88
88
 
89
+ Windows Dependencies
90
+ --------------------
91
+ 1. Download and unzip https://www.ffmpeg.org/download.html and add its folder to
92
+ PATH environment user variable
93
+
94
+
95
+ 1. Download and unzip poppler for Windows from https://github.com/oschwartz10612/poppler-windows/releases
96
+ 2. Put the folder 'bin' in the system path (e.g. ``C:\poppler-24.08.0\Library\bin``)
97
+ 3. *Close and reopen a new console window*
98
+ 4. Test it: Run ``pdftocairo`` in the terminal
99
+
100
+
89
101
  Alternative method
90
102
  ------------------
91
103
 
@@ -93,37 +105,34 @@ Alternative method
93
105
 
94
106
  2. unzip it
95
107
 
96
- 3. pip install -r requirements.txt
108
+ 3. pip install .
109
+
110
+ 4. unit3dup
111
+
97
112
 
98
- 4. python start.py
113
+ .. image:: https://img.shields.io/badge/Bot_UPDATE-gr
114
+ :alt: Bot Update
99
115
 
100
- .. image:: https://img.shields.io/badge/LINUX-gr
116
+ 1. pip install unit3dup --upgrade
101
117
 
102
- 1. Run: ``sudo apt install poppler-utils``
103
- 2. sudo apt install ffmpeg
104
118
 
105
119
 
106
- .. image:: https://img.shields.io/badge/WINDOWS-gr
120
+ RUN
121
+ ======
107
122
 
108
- 1. Download and unzip https://www.ffmpeg.org/download.html and add its folder to
109
- PATH environment user variable
123
+ .. code-block:: python
110
124
 
125
+ unit3dup -u <filepath>
126
+ unit3dup -f <folderpath>
127
+ unit3dup -scan <folderpath>
111
128
 
112
- 1. Download and unzip poppler for Windows from https://github.com/oschwartz10612/poppler-windows/releases
113
- 2. Put the folder 'bin' in the system path (e.g. ``C:\poppler-24.08.0\Library\bin``)
114
- 3. *Close and reopen a new console window*
115
- 4. Test it: Run ``pdftocairo`` in the terminal
116
129
 
117
130
 
131
+ DOC
132
+ ===
118
133
 
119
- .. image:: https://img.shields.io/badge/Bot_UPDATE-gr
120
- :alt: Bot Update
134
+ Link `Unit3DUP <https://unit3dup.readthedocs.io/en/latest/index.html#>`_
121
135
 
122
- 1. Delete only the bot folder
123
- 2. Download the release zip
124
- 3. Unzip it
125
- 4. No config needed
126
- 5. Done!
127
136
 
128
137
 
129
138
  Trackers
@@ -148,6 +157,7 @@ united by a shared passion for torrents and more
148
157
  :alt: Discord Server
149
158
 
150
159
 
160
+
151
161
  🎯 Streaming Community
152
162
  ======================
153
163
 
@@ -155,3 +165,12 @@ united by a shared passion for torrents and more
155
165
 
156
166
  An open-source script for downloading movies, TV shows, and anime from various websites,
157
167
  built by a community of people with a shared interest in programming.
168
+
169
+ .. image:: https://img.shields.io/badge/Telegram-Join-blue?logo=telegram
170
+ :target: https://t.me/+hj294GabGWJlMDI8
171
+ :alt: Unisciti su Telegram
172
+
173
+ .. image:: https://img.shields.io/badge/StreamingCommunity-blue.svg
174
+ :target: https://github.com/Arrowar/StreamingCommunity
175
+ :alt: StreamingCommunity Badge
176
+
@@ -7,12 +7,12 @@ common/extractor.py,sha256=WKZwt2kQfKO2VJ1rtwE_j6Zl84zICnowZq_Ql16wmRc,4564
7
7
  common/frames.py,sha256=p_jsaXII5tZTVt5ymu-w1hk2c_UMeOn3PZeuVR-wXWY,7973
8
8
  common/mediainfo.py,sha256=U2r1jJejBsV8GP3iPk4O8_NkHO5RQ9Kkh2bKwVNUBmg,6229
9
9
  common/mediainfo_string.py,sha256=8vuWlF2bqWRKpDbn81bV2fPA7hbl7RwOnxN2i4E3zNE,3958
10
- common/settings.py,sha256=SGNBJVWqe-BSLzlxARfh-cpFP1wzrF1AISQCaxDFsJQ,30448
10
+ common/settings.py,sha256=DI2BNX0LhcUSOCR9QCUNQruD_NM_wDAMgrZGcoIv-rE,32046
11
11
  common/title.py,sha256=nFainfUBTYW9ML4Y-CB9ZFD_Es-OZXcAMPUo6D09u3k,3793
12
12
  common/torrent_clients.py,sha256=NOIpYtLG_bA19HwcH9ahGFmGNtRkoMO6nAjma-JzDfs,12040
13
13
  common/utility.py,sha256=6VLhN4K8W9oJfYiHKK_nq5LGtbwHaSMjeojstoyqYfU,8575
14
14
  common/external_services/__init__.py,sha256=rU7HPEcZ7WQFD8eqDzuye2xHPBjxXPwPqpt7IT08mkM,178
15
- common/external_services/imageHost.py,sha256=-0lGHgkUskd2ySlgrJH5dhV2iebzo__9soxHvc5fxs4,8939
15
+ common/external_services/imageHost.py,sha256=UhrsypjycKrQy-ZQphVcako4OfFU-IZNlYaJArVaCno,9539
16
16
  common/external_services/imdb.py,sha256=AIo8CO-SfP_uNocDeNY08hpvCAnuotoI7hYUytDiMQA,579
17
17
  common/external_services/mediaresult.py,sha256=Yz-h7QROkfNHwaSSXZ1JRDSmG2YIZkmtQO5vmpkYWZ4,677
18
18
  common/external_services/Pw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -88,15 +88,17 @@ unit3dup/media_manager/DocuManager.py,sha256=oFt7jlxj-gIUty9PADBQV5a24bsv3yhjKhw
88
88
  unit3dup/media_manager/GameManager.py,sha256=9EmPeNrirOwaVOj-vkLr29Xo7daIA4ssqrrt0WyMl30,4090
89
89
  unit3dup/media_manager/MediaInfoManager.py,sha256=0NO9dgD7seJM67B3DRnwvRIdoy7bfquBUox-PnHInK8,1081
90
90
  unit3dup/media_manager/SeedManager.py,sha256=Vqpf_xpGbxsJHg0C3-kL0_tdF4f2FRPlZH7UpnmAE3g,1912
91
- unit3dup/media_manager/TorrentManager.py,sha256=-Hn29NZcuzm0DtPX0JqNY96v5JL-Y9ngCBdbos8hS-k,6133
91
+ unit3dup/media_manager/TorrentManager.py,sha256=qqM1d1TyfBuruXtKLRbQ8gFk3_2JNH9dOa6Yg-QnDCw,6507
92
92
  unit3dup/media_manager/VideoManager.py,sha256=O1NzGnWiWPfMgjyV6h9_b9b8M5tzFtpje9cvI2g6Nc0,5437
93
93
  unit3dup/media_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
94
  unit3dup/media_manager/common.py,sha256=hG2zOw7ocQfZyI1dhusbehxswpIrZK7T2aAbCNwULqA,10138
95
- unit3dup-0.8.6.dist-info/licenses/LICENSE,sha256=GNAZDLhU0xz8QPbIyHAOYlVnQYDvKWk2N9fZJMhqaG8,1090
95
+ unit3dup/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
+ unit3dup/web/main.py,sha256=BzjKDgAjKZMnoQwx7nDDbs_64kCrFO1VYpbHmsGiFVc,1267
97
+ unit3dup-0.8.8.dist-info/licenses/LICENSE,sha256=GNAZDLhU0xz8QPbIyHAOYlVnQYDvKWk2N9fZJMhqaG8,1090
96
98
  view/__init__.py,sha256=XIzb6rl58HmYPnksD73cYMFF88dn6FHa3u7bOHFbChk,81
97
99
  view/custom_console.py,sha256=QD7LjVi7qoBCZ9RpXxsouLfkGtRq-d5yVIQem2Q0SdI,4741
98
- unit3dup-0.8.6.dist-info/METADATA,sha256=o20pkpEudQGi5Gklk40Qr7LDXHohD-hTYvPngAL41xY,4919
99
- unit3dup-0.8.6.dist-info/WHEEL,sha256=GHB6lJx2juba1wDgXDNlMTyM13ckjBMKf-OnwgKOCtA,91
100
- unit3dup-0.8.6.dist-info/entry_points.txt,sha256=fxXSyI6-r6jy9_v-C5ZHm03q1aC3tE9EvCQZxC1NQnI,52
101
- unit3dup-0.8.6.dist-info/top_level.txt,sha256=19NVMnQNkJxBUKebRNaYCRs56A5CO4U1L67GMQCPiLU,21
102
- unit3dup-0.8.6.dist-info/RECORD,,
100
+ unit3dup-0.8.8.dist-info/METADATA,sha256=eqQb4Kj_wK_U1ZTc7g4S1Xct5Ue6vOE57e4rxPBLxOc,5224
101
+ unit3dup-0.8.8.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
102
+ unit3dup-0.8.8.dist-info/entry_points.txt,sha256=fxXSyI6-r6jy9_v-C5ZHm03q1aC3tE9EvCQZxC1NQnI,52
103
+ unit3dup-0.8.8.dist-info/top_level.txt,sha256=19NVMnQNkJxBUKebRNaYCRs56A5CO4U1L67GMQCPiLU,21
104
+ unit3dup-0.8.8.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.0)
2
+ Generator: setuptools (80.4.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5