Unit3Dup 0.8.18__tar.gz → 0.8.19__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 (103) hide show
  1. {unit3dup-0.8.18 → unit3dup-0.8.19}/PKG-INFO +1 -1
  2. {unit3dup-0.8.18 → unit3dup-0.8.19}/Unit3Dup.egg-info/PKG-INFO +1 -1
  3. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/settings.py +1 -1
  4. {unit3dup-0.8.18 → unit3dup-0.8.19}/pyproject.toml +1 -1
  5. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/__main__.py +1 -1
  6. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/duplicate.py +1 -1
  7. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/ContentManager.py +5 -3
  8. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/common.py +1 -1
  9. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/pvtTracker.py +18 -17
  10. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/upload.py +18 -7
  11. {unit3dup-0.8.18 → unit3dup-0.8.19}/LICENSE +0 -0
  12. {unit3dup-0.8.18 → unit3dup-0.8.19}/README.rst +0 -0
  13. {unit3dup-0.8.18 → unit3dup-0.8.19}/Unit3Dup.egg-info/SOURCES.txt +0 -0
  14. {unit3dup-0.8.18 → unit3dup-0.8.19}/Unit3Dup.egg-info/dependency_links.txt +0 -0
  15. {unit3dup-0.8.18 → unit3dup-0.8.19}/Unit3Dup.egg-info/entry_points.txt +0 -0
  16. {unit3dup-0.8.18 → unit3dup-0.8.19}/Unit3Dup.egg-info/requires.txt +0 -0
  17. {unit3dup-0.8.18 → unit3dup-0.8.19}/Unit3Dup.egg-info/top_level.txt +0 -0
  18. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/__init__.py +0 -0
  19. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/bdinfo_string.py +0 -0
  20. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/bittorrent.py +0 -0
  21. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/command.py +0 -0
  22. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/constants.py +0 -0
  23. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/database.py +0 -0
  24. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/__init__.py +0 -0
  25. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/ftpx/__init__.py +0 -0
  26. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/ftpx/client.py +0 -0
  27. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/ftpx/core/__init__.py +0 -0
  28. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/ftpx/core/ftpx_service.py +0 -0
  29. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/ftpx/core/ftpx_session.py +0 -0
  30. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/ftpx/core/menu.py +0 -0
  31. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/ftpx/core/models/__init__.py +0 -0
  32. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/ftpx/core/models/list.py +0 -0
  33. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/igdb/__init__.py +0 -0
  34. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/igdb/client.py +0 -0
  35. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/igdb/core/__init__.py +0 -0
  36. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/igdb/core/api.py +0 -0
  37. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/igdb/core/models/__init__.py +0 -0
  38. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/igdb/core/models/search.py +0 -0
  39. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/igdb/core/platformid.py +0 -0
  40. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/igdb/core/tags.py +0 -0
  41. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/imageHost.py +0 -0
  42. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/imdb.py +0 -0
  43. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/mediaresult.py +0 -0
  44. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/sessions/__init__.py +0 -0
  45. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/sessions/agents.py +0 -0
  46. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/sessions/exceptions.py +0 -0
  47. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/sessions/session.py +0 -0
  48. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/__init__.py +0 -0
  49. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/__init__.py +0 -0
  50. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/api.py +0 -0
  51. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/keywords.py +0 -0
  52. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/__init__.py +0 -0
  53. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/__init__.py +0 -0
  54. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/alternative_titles.py +0 -0
  55. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/details.py +0 -0
  56. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/movie.py +0 -0
  57. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/nowplaying.py +0 -0
  58. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/release_info.py +0 -0
  59. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/__init__.py +0 -0
  60. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/alternative.py +0 -0
  61. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/details.py +0 -0
  62. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/on_the_air.py +0 -0
  63. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/translations.py +0 -0
  64. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/tvshow.py +0 -0
  65. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/videos.py +0 -0
  66. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/trailers/__init__.py +0 -0
  67. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/trailers/api.py +0 -0
  68. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/external_services/trailers/response.py +0 -0
  69. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/extractor.py +0 -0
  70. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/frames.py +0 -0
  71. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/mediainfo.py +0 -0
  72. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/mediainfo_string.py +0 -0
  73. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/title.py +0 -0
  74. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/torrent_clients.py +0 -0
  75. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/trackers/__init__.py +0 -0
  76. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/trackers/data.py +0 -0
  77. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/trackers/itt.py +0 -0
  78. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/trackers/sis.py +0 -0
  79. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/trackers/trackers.py +0 -0
  80. {unit3dup-0.8.18 → unit3dup-0.8.19}/common/utility.py +0 -0
  81. {unit3dup-0.8.18 → unit3dup-0.8.19}/requirements.txt +0 -0
  82. {unit3dup-0.8.18 → unit3dup-0.8.19}/setup.cfg +0 -0
  83. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/__init__.py +0 -0
  84. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/automode.py +0 -0
  85. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/bot.py +0 -0
  86. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/exceptions.py +0 -0
  87. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media.py +0 -0
  88. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/DocuManager.py +0 -0
  89. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/GameManager.py +0 -0
  90. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/MediaInfoManager.py +0 -0
  91. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/SeedManager.py +0 -0
  92. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/TorrentManager.py +0 -0
  93. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/VideoManager.py +0 -0
  94. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/media_manager/__init__.py +0 -0
  95. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/pvtDocu.py +0 -0
  96. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/pvtTorrent.py +0 -0
  97. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/pvtVideo.py +0 -0
  98. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/torrent.py +0 -0
  99. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/web/__init__.py +0 -0
  100. {unit3dup-0.8.18 → unit3dup-0.8.19}/unit3dup/web/main.py +0 -0
  101. {unit3dup-0.8.18 → unit3dup-0.8.19}/view/__init__.py +0 -0
  102. {unit3dup-0.8.18 → unit3dup-0.8.19}/view/custom_console.py +0 -0
  103. {unit3dup-0.8.18 → unit3dup-0.8.19}/view/web_console.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Unit3Dup
3
- Version: 0.8.18
3
+ Version: 0.8.19
4
4
  Summary: An uploader for the Unit3D torrent tracker
5
5
  Author: Parzival
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Unit3Dup
3
- Version: 0.8.18
3
+ Version: 0.8.19
4
4
  Summary: An uploader for the Unit3D torrent tracker
5
5
  Author: Parzival
6
6
  License-Expression: MIT
@@ -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.18"
16
+ version = "0.8.19"
17
17
 
18
18
  if os.name == "nt":
19
19
  PW_TORRENT_ARCHIVE_PATH: Path = Path(os.getenv("LOCALAPPDATA", ".")) / "Unit3Dup_config" / "pw_torrent_archive"
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  dynamic = ["dependencies"]
7
7
  name = "Unit3Dup"
8
- version = "0.8.18"
8
+ version = "0.8.19"
9
9
  description = "An uploader for the Unit3D torrent tracker"
10
10
  readme = "README.rst"
11
11
  requires-python = ">=3.10"
@@ -151,7 +151,7 @@ def main():
151
151
  # Dump
152
152
  if cli.args.dump:
153
153
  print("NOT YET IMPLEMENTED")
154
- # torrent_info.view_search(" ", inkey=False)
154
+ # torrent_info.view_search(" ", inkey=False,save=True) # Fix aggiunto Save
155
155
  return
156
156
 
157
157
  if cli.args.info:
@@ -139,7 +139,7 @@ class Duplicate:
139
139
  return self.search(torrent=self.torrent_info.search(self.query.guessit_title))
140
140
 
141
141
 
142
- def process_dead_torrents(self, tmdb_id: int)-> list[requests] | None:
142
+ def process_dead_torrents(self, tmdb_id: int)-> list[requests.Response] | None:
143
143
  # Get the dead torrents
144
144
  torrents = self.torrent_info.get_by_tmdb_id(tmdb_id=tmdb_id)
145
145
  dead_torrents = []
@@ -90,13 +90,15 @@ class ContentManager:
90
90
  media.display_name = self.display_name
91
91
 
92
92
  # Add language to the title from the media file when it's absent
93
- for found_languages in media.audio_languages:
94
- if found_languages not in media.display_name.upper():
95
- media.display_name = f"{media.display_name} {found_languages}"
93
+ if media.category == 'tv':
94
+ for found_languages in media.audio_languages:
95
+ if found_languages not in media.display_name.upper():
96
+ media.display_name = f"{media.display_name} {found_languages}"
96
97
  return media
97
98
  else:
98
99
  return False
99
100
 
101
+
100
102
  def search_ids(self):
101
103
  _id = re.findall(r"\{(imdb-\d+|tmdb-\d+|igdb-\d+)}", self.file_name, re.IGNORECASE)
102
104
  if _id:
@@ -166,7 +166,7 @@ class UserContent:
166
166
  return False
167
167
 
168
168
  @staticmethod
169
- def can_ressed(content: Media, tracker_name: str, cli: argparse.Namespace, tmdb_id :int) -> list[requests]:
169
+ def can_ressed(content: Media, tracker_name: str, cli: argparse.Namespace, tmdb_id :int) -> list[requests.Response]:
170
170
  """
171
171
  Search for a duplicate and compare with the user content. Delta = config.SIZE_TH
172
172
 
@@ -97,21 +97,10 @@ class Tracker(Myhttp):
97
97
  exit(1)
98
98
 
99
99
  def _post(self, file: dict, data: dict, params: dict):
100
- with open(file['torrent'], "rb") as torrent:
101
-
102
- # // Send content and mime type
103
- file_ = {
104
- "torrent": ("filename.torrent", torrent, "application/octet-stream"),
105
- }
106
-
107
- # // Send nfo
108
- if file.get('nfo', None):
109
- file_.update({"nfo": ("filename.nfo", file['nfo'], "text/plain")})
110
-
111
100
  try:
112
101
  return requests.post(
113
102
  url=self.upload_url,
114
- files=file_,
103
+ files=file,
115
104
  data=data,
116
105
  headers=self.headers,
117
106
  params=params,
@@ -327,12 +316,24 @@ class Torrents(Tracker):
327
316
 
328
317
 
329
318
  class Uploader(Tracker):
330
- def upload_t(self, data: dict, torrent_path: str, torrent_archive_path: str, nfo_path = None) -> requests:
331
- file_torrent = {"torrent": torrent_archive_path}
332
- if nfo_path:
333
- file_torrent.update({"nfo": self.encode_utf8(file_path=nfo_path)})
319
+ def upload_t(self, data: dict, torrent_archive_path: str, nfo_path=None) -> requests.Response:
320
+ files = {}
321
+ # Binary mode
322
+ with open(torrent_archive_path, 'rb') as torrent_file:
323
+ files['torrent'] = ('upload.torrent', torrent_file, 'application/x-bittorrent')
324
+
325
+ # Add the info file
326
+ if nfo_path:
327
+ with open(nfo_path, 'rb') as nfo_file:
328
+ files['nfo'] = ('file.nfo', nfo_file, 'text/plain')
329
+ # Post both
330
+ response = self._post(file=files, data=data, params=self.params)
331
+ else:
332
+ # Post the torrent
333
+ response = self._post(file=files, data=data, params=self.params)
334
+
335
+ return response
334
336
 
335
- return self._post(file=file_torrent, data=data, params=self.params)
336
337
 
337
338
  @staticmethod
338
339
  def encode_utf8(file_path:str) -> bytes | io.BytesIO:
@@ -15,9 +15,6 @@ from view import custom_console
15
15
 
16
16
  class UploadBot:
17
17
  def __init__(self, content: Media, tracker_name: str, cli: argparse):
18
-
19
- self.API_TOKEN = config_settings.tracker_config.ITT_APIKEY
20
- self.BASE_URL = config_settings.tracker_config.ITT_URL
21
18
  self.cli = cli
22
19
  self.content = content
23
20
  self.tracker_name = tracker_name
@@ -26,7 +23,7 @@ class UploadBot:
26
23
  self.sign = (f"[url=https://github.com/31December99/Unit3Dup][code][color=#00BFFF][size=14]Uploaded with Unit3Dup"
27
24
  f" {Load.version}[/size][/color][/code][/url]")
28
25
 
29
- def message(self,tracker_response: requests.Response) -> (requests, dict):
26
+ def message(self,tracker_response: requests.Response, torrent_archive: str) -> (requests, dict):
30
27
 
31
28
  name_error = ''
32
29
  info_hash_error = ''
@@ -38,6 +35,10 @@ class UploadBot:
38
35
  tracker_response_body = json.loads(tracker_response.text)
39
36
  custom_console.bot_log(f"\n[RESPONSE]-> '{self.tracker_name}'.....{tracker_response_body['message'].upper()}\n\n")
40
37
  custom_console.rule()
38
+ # https://github.com/HDInnovations/UNIT3D/pull/4910/files
39
+ # 08/09/2025
40
+ # We have to download the torrent file to get the new random info_hash generated
41
+ self.download_file(url=tracker_response_body["data"],destination_path=torrent_archive)
41
42
  return tracker_response_body["data"],{}
42
43
 
43
44
  elif tracker_response.status_code == 401:
@@ -110,7 +111,17 @@ class UploadBot:
110
111
 
111
112
  def send(self, torrent_archive: str, nfo_path = None) -> (requests, dict):
112
113
 
113
- tracker_response=self.tracker.upload_t(data=self.tracker.data, torrent_path=self.content.torrent_path,
114
- torrent_archive_path = torrent_archive,nfo_path=nfo_path)
115
- return self.message(tracker_response)
114
+ tracker_response=self.tracker.upload_t(data=self.tracker.data,torrent_archive_path = torrent_archive,
115
+ nfo_path=nfo_path)
116
+ return self.message(tracker_response=tracker_response, torrent_archive=torrent_archive)
117
+
116
118
 
119
+ @staticmethod
120
+ def download_file(url: str, destination_path: str) -> bool:
121
+ download = requests.get(url)
122
+ if download.status_code == 200:
123
+ # File archived
124
+ with open(destination_path, "wb") as file:
125
+ file.write(download.content)
126
+ return True
127
+ return False
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
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