Unit3Dup 0.8.17__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.
- {unit3dup-0.8.17 → unit3dup-0.8.19}/PKG-INFO +1 -1
- {unit3dup-0.8.17 → unit3dup-0.8.19}/Unit3Dup.egg-info/PKG-INFO +1 -1
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/settings.py +1 -1
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/utility.py +5 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/pyproject.toml +1 -1
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/__main__.py +1 -1
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/automode.py +1 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/duplicate.py +1 -1
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/ContentManager.py +5 -3
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/common.py +1 -1
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/pvtTracker.py +18 -17
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/upload.py +18 -7
- {unit3dup-0.8.17 → unit3dup-0.8.19}/LICENSE +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/README.rst +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/Unit3Dup.egg-info/SOURCES.txt +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/Unit3Dup.egg-info/dependency_links.txt +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/Unit3Dup.egg-info/entry_points.txt +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/Unit3Dup.egg-info/requires.txt +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/Unit3Dup.egg-info/top_level.txt +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/bdinfo_string.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/bittorrent.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/command.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/constants.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/database.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/ftpx/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/ftpx/client.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/ftpx/core/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/ftpx/core/ftpx_service.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/ftpx/core/ftpx_session.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/ftpx/core/menu.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/ftpx/core/models/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/ftpx/core/models/list.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/igdb/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/igdb/client.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/igdb/core/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/igdb/core/api.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/igdb/core/models/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/igdb/core/models/search.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/igdb/core/platformid.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/igdb/core/tags.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/imageHost.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/imdb.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/mediaresult.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/sessions/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/sessions/agents.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/sessions/exceptions.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/sessions/session.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/api.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/keywords.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/alternative_titles.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/details.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/movie.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/nowplaying.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/release_info.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/alternative.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/details.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/on_the_air.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/translations.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/tvshow.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/videos.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/trailers/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/trailers/api.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/trailers/response.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/extractor.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/frames.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/mediainfo.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/mediainfo_string.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/title.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/torrent_clients.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/trackers/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/trackers/data.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/trackers/itt.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/trackers/sis.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/common/trackers/trackers.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/requirements.txt +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/setup.cfg +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/bot.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/exceptions.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/DocuManager.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/GameManager.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/MediaInfoManager.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/SeedManager.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/TorrentManager.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/VideoManager.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/media_manager/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/pvtDocu.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/pvtTorrent.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/pvtVideo.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/torrent.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/web/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/unit3dup/web/main.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/view/__init__.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/view/custom_console.py +0 -0
- {unit3dup-0.8.17 → unit3dup-0.8.19}/view/web_console.py +0 -0
|
@@ -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.
|
|
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"
|
|
@@ -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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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=
|
|
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,
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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,
|
|
114
|
-
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/details.py
RENAMED
|
File without changes
|
{unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/movie/movie.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unit3dup-0.8.17 → unit3dup-0.8.19}/common/external_services/theMovieDB/core/models/tvshow/tvshow.py
RENAMED
|
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
|
|
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
|