Unit3Dup 0.14.2__tar.gz → 0.14.4__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 (108) hide show
  1. {unit3dup-0.14.2 → unit3dup-0.14.4}/PKG-INFO +1 -1
  2. {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/PKG-INFO +1 -1
  3. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/api.py +15 -11
  4. unit3dup-0.14.4/common/external_services/trailers/api.py +122 -0
  5. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/settings.py +5 -5
  6. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/utility.py +4 -0
  7. {unit3dup-0.14.2 → unit3dup-0.14.4}/pyproject.toml +1 -1
  8. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media.py +5 -1
  9. unit3dup-0.14.2/common/external_services/trailers/api.py +0 -102
  10. {unit3dup-0.14.2 → unit3dup-0.14.4}/LICENSE +0 -0
  11. {unit3dup-0.14.2 → unit3dup-0.14.4}/README.rst +0 -0
  12. {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/SOURCES.txt +0 -0
  13. {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/dependency_links.txt +0 -0
  14. {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/entry_points.txt +0 -0
  15. {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/requires.txt +0 -0
  16. {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/top_level.txt +0 -0
  17. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/__init__.py +0 -0
  18. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/bdinfo_string.py +0 -0
  19. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/bittorrent.py +0 -0
  20. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/command.py +0 -0
  21. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/constants.py +0 -0
  22. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/database.py +0 -0
  23. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/__init__.py +0 -0
  24. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/__init__.py +0 -0
  25. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/client.py +0 -0
  26. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/__init__.py +0 -0
  27. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/ftpx_service.py +0 -0
  28. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/ftpx_session.py +0 -0
  29. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/menu.py +0 -0
  30. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/models/__init__.py +0 -0
  31. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/models/list.py +0 -0
  32. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/__init__.py +0 -0
  33. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/client.py +0 -0
  34. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/__init__.py +0 -0
  35. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/api.py +0 -0
  36. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/models/__init__.py +0 -0
  37. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/models/search.py +0 -0
  38. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/platformid.py +0 -0
  39. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/tags.py +0 -0
  40. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/imageHost.py +0 -0
  41. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/mediaresult.py +0 -0
  42. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/sessions/__init__.py +0 -0
  43. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/sessions/agents.py +0 -0
  44. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/sessions/exceptions.py +0 -0
  45. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/sessions/session.py +0 -0
  46. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/__init__.py +0 -0
  47. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/__init__.py +0 -0
  48. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/keywords.py +0 -0
  49. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/__init__.py +0 -0
  50. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/__init__.py +0 -0
  51. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/alternative.py +0 -0
  52. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/details.py +0 -0
  53. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/movie.py +0 -0
  54. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/nowplaying.py +0 -0
  55. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/release_info.py +0 -0
  56. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/translations.py +0 -0
  57. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/__init__.py +0 -0
  58. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/alternative.py +0 -0
  59. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/details.py +0 -0
  60. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/on_the_air.py +0 -0
  61. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/translations.py +0 -0
  62. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/tvshow.py +0 -0
  63. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/videos.py +0 -0
  64. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/trailers/__init__.py +0 -0
  65. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/trailers/response.py +0 -0
  66. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/tvdb.py +0 -0
  67. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/extractor.py +0 -0
  68. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/frames.py +0 -0
  69. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/mediainfo.py +0 -0
  70. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/mediainfo_string.py +0 -0
  71. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/tags.py +0 -0
  72. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/title.py +0 -0
  73. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/torrent_clients.py +0 -0
  74. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/__init__.py +0 -0
  75. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/ast.py +0 -0
  76. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/ban_list.py +0 -0
  77. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/data.py +0 -0
  78. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/itt.py +0 -0
  79. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/ptt.py +0 -0
  80. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/signs_list.py +0 -0
  81. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/sis.py +0 -0
  82. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/tags_list.py +0 -0
  83. {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/trackers.py +0 -0
  84. {unit3dup-0.14.2 → unit3dup-0.14.4}/requirements.txt +0 -0
  85. {unit3dup-0.14.2 → unit3dup-0.14.4}/setup.cfg +0 -0
  86. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/__init__.py +0 -0
  87. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/__main__.py +0 -0
  88. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/automode.py +0 -0
  89. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/bot.py +0 -0
  90. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/duplicate.py +0 -0
  91. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/exceptions.py +0 -0
  92. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/ContentManager.py +0 -0
  93. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/DocuManager.py +0 -0
  94. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/GameManager.py +0 -0
  95. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/MediaInfoManager.py +0 -0
  96. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/SeedManager.py +0 -0
  97. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/TorrentManager.py +0 -0
  98. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/VideoManager.py +0 -0
  99. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/__init__.py +0 -0
  100. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/common.py +0 -0
  101. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/pvtDocu.py +0 -0
  102. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/pvtTorrent.py +0 -0
  103. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/pvtTracker.py +0 -0
  104. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/pvtVideo.py +0 -0
  105. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/torrent.py +0 -0
  106. {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/upload.py +0 -0
  107. {unit3dup-0.14.2 → unit3dup-0.14.4}/view/__init__.py +0 -0
  108. {unit3dup-0.14.2 → unit3dup-0.14.4}/view/custom_console.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Unit3Dup
3
- Version: 0.14.2
3
+ Version: 0.14.4
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.14.2
3
+ Version: 0.14.4
4
4
  Summary: An uploader for the Unit3D torrent tracker
5
5
  Author: Parzival
6
6
  License-Expression: MIT
@@ -35,6 +35,7 @@ base_url = "https://api.themoviedb.org/3"
35
35
  ENABLE_LOG = True
36
36
  T = TypeVar('T')
37
37
 
38
+
38
39
  class MovieEndpoint:
39
40
  @staticmethod
40
41
  def search(query: str) -> dict:
@@ -275,10 +276,12 @@ class DbOnline(TmdbAPI):
275
276
  continue
276
277
 
277
278
  # Search for title
278
- if ManageTitles.fuzzyit(str1=self.query, str2=ManageTitles.clean_text(result.get_title())) > 95:
279
+ if ManageTitles.fuzzyit(str1=ManageTitles.clean_text(self.query),
280
+ str2=ManageTitles.clean_text(result.get_title())) > 95:
279
281
  return result
280
282
 
281
- if ManageTitles.fuzzyit(str1=self.query, str2=ManageTitles.clean_text(result.get_original())) > 95:
283
+ if ManageTitles.fuzzyit(str1=ManageTitles.clean_text(self.query),
284
+ str2=ManageTitles.clean_text(result.get_original())) > 95:
282
285
  return result
283
286
 
284
287
  # Search for alternative title
@@ -336,8 +339,8 @@ class DbOnline(TmdbAPI):
336
339
 
337
340
  # or start an on-line search
338
341
  results = self._search(self.query, self.category)
339
- # Use imdb_id when tmdb_id is not available
340
342
 
343
+ # Use imdb_id when tmdb_id is not available
341
344
  tvdb_result = self.tvdb_search()
342
345
  if tvdb_result:
343
346
  self.tvdb_id = tvdb_result.get('tvdb_id', None)
@@ -427,6 +430,9 @@ class DbOnline(TmdbAPI):
427
430
  if 'no_key' in config_settings.tracker_config.YOUTUBE_KEY:
428
431
  return "not available"
429
432
 
433
+ if not config_settings.user_preferences.SKIP_YOUTUBE:
434
+ return "Skipped"
435
+
430
436
  yt_trailer = YtTrailer(self.query)
431
437
  result = yt_trailer.get_trailer_link()
432
438
  if result:
@@ -434,13 +440,11 @@ class DbOnline(TmdbAPI):
434
440
  # todo compare against the media title especially for the favorite channel
435
441
  return result[0].items[0].id.videoId
436
442
  else:
437
- if not config_settings.user_preferences.SKIP_YOUTUBE:
438
- user_youtube_id = custom_console.user_input_str(message="Title not found."
439
- " Please digit a valid Youtube ID (0=skip)->")
440
- if user_youtube_id == 0:
441
- return "not available"
442
- return user_youtube_id
443
- return None
443
+ user_youtube_id = custom_console.user_input_str(message="Sorry trailer not found."
444
+ " Please digit a valid Youtube ID (0=skip)->")
445
+ if user_youtube_id == 0:
446
+ return "not available"
447
+ return user_youtube_id
444
448
 
445
449
  def trailer(self, video_id: int) -> str | None:
446
450
  # Search for tmdb trailer
@@ -471,7 +475,7 @@ class DbOnline(TmdbAPI):
471
475
  if results.tvdb_id:
472
476
  custom_console.bot_warning_log(f"'TVDB ID'........ '{results.tvdb_id}'")
473
477
  custom_console.bot_log(f"'TMDB KEYWORDS'.. {results.keywords_list}")
474
- custom_console.bot_log(f"'TRAILER CODE' .. {results.trailer_key}")
478
+ custom_console.bot_log(f"'TRAILER' ....... https://www.youtube.com/watch?v={results.trailer_key}")
475
479
 
476
480
  def load_cache(self, query: str) -> MediaResult | None:
477
481
  # Check if the item is in the cache
@@ -0,0 +1,122 @@
1
+ # -*- coding: utf-8 -*-
2
+ import time
3
+ import requests
4
+
5
+ from .response import YouTubeSearchResponse, Thumbnails, Id, Item, PageInfo, Snippet
6
+
7
+ from common import config_settings
8
+ from common.utility import ManageTitles
9
+ from view import custom_console
10
+
11
+
12
+ class YtTrailer:
13
+ url = 'https://www.googleapis.com/youtube/v3/search'
14
+
15
+ def __init__(self, title: str):
16
+
17
+ # Add language to the query (title) string to increase the prob of getting results in the pref lang
18
+ force_query = ManageTitles.iso_3166_alpha2_to_alpha3.get(config_settings.user_preferences.PREFERRED_LANG.upper(), "")
19
+ self.title = f"{title} {force_query}"
20
+ self.params = {
21
+ 'part': 'snippet',
22
+ 'q': f'{self.title} trailer',
23
+ 'type': 'video',
24
+ 'key': config_settings.tracker_config.YOUTUBE_KEY,
25
+ 'maxResults': 3,
26
+ }
27
+
28
+ def get_trailer_link(self) -> list[YouTubeSearchResponse] | None:
29
+
30
+ # Use pref language for searching
31
+ self.params['userId'] = 'me'
32
+ self.params['regionCode'] = config_settings.user_preferences.PREFERRED_LANG.upper()
33
+ self.params['relevanceLanguage'] = config_settings.user_preferences.PREFERRED_LANG.lower()
34
+
35
+ attempt: int = 0
36
+ max_attempts: int = 3
37
+ response = None
38
+
39
+ while attempt < max_attempts:
40
+ custom_console.bot_log("Searching YouTube for a trailer...")
41
+ try:
42
+ response = requests.get(self.url, params=self.params, timeout=5)
43
+ if response.status_code == 200:
44
+ custom_console.bot_log("YouTube Response with no error")
45
+ break
46
+ except requests.RequestException:
47
+ custom_console.error(f"Could not connect to YouTube API {response.status_code}")
48
+
49
+ attempt += 1
50
+ custom_console.bot_log(self.params)
51
+ custom_console.bot_warning_log(
52
+ f"Attempt #{attempt} Server Response ({response.status_code})")
53
+ time.sleep(1)
54
+
55
+ if attempt == max_attempts:
56
+ return None
57
+
58
+ response_data = response.json()
59
+ youtube_responses = []
60
+
61
+ if response_data['items']:
62
+ for result in response_data['items']:
63
+ thumbnails_data = result['snippet']['thumbnails']
64
+ thumbnails = Thumbnails(
65
+ default=thumbnails_data['default'],
66
+ high=thumbnails_data['high'],
67
+ medium=thumbnails_data['medium']
68
+ )
69
+
70
+ snippet_data = result['snippet']
71
+ snippet = Snippet(
72
+ channelId=snippet_data['channelId'],
73
+ channelTitle=snippet_data['channelTitle'],
74
+ description=snippet_data['description'],
75
+ liveBroadcastContent=snippet_data['liveBroadcastContent'],
76
+ publishTime=snippet_data['publishTime'],
77
+ publishedAt=snippet_data['publishedAt'],
78
+ title=snippet_data['title'],
79
+ thumbnails=thumbnails
80
+ )
81
+
82
+ video_id = None
83
+ # Sometimes it returns a chennelId and not only the video id
84
+ if 'id' in result:
85
+ id_data = result['id']
86
+
87
+ # Check if the result is a video or a channel
88
+ if id_data['kind'] == 'youtube#video':
89
+ video_id = Id(
90
+ kind=id_data.get('kind', ''),
91
+ videoId=id_data.get('videoId', '')
92
+ )
93
+ elif id_data['kind'] == 'youtube#channel':
94
+ # Get video_di from the result
95
+ video_id = Id(
96
+ kind=id_data.get('kind', ''),
97
+ videoId=id_data.get('channelId', '')
98
+ )
99
+ else:
100
+ # Fail
101
+ pass
102
+
103
+ item = Item(
104
+ etag=result['etag'],
105
+ id=video_id,
106
+ kind=result['kind'],
107
+ snippet=snippet
108
+ )
109
+
110
+ page_info = PageInfo(**response_data['pageInfo'])
111
+ youtube_response = YouTubeSearchResponse(
112
+ etag=response_data['etag'],
113
+ items=[item],
114
+ kind=response_data['kind'],
115
+ pageInfo=page_info,
116
+ regionCode=response_data['regionCode']
117
+ )
118
+ youtube_responses.append(youtube_response)
119
+
120
+ return youtube_responses
121
+ else:
122
+ return None
@@ -24,7 +24,7 @@ user_tags_file = "tags_list.json"
24
24
  user_sign_file = "sign_list.json"
25
25
  bane_file = "ban_list.json"
26
26
 
27
- version = "0.14.2"
27
+ version = "0.14.4"
28
28
 
29
29
  if os.name == "nt":
30
30
  WATCHER_DESTINATION_PATH: Path = Path(
@@ -128,8 +128,8 @@ class UserPreferences(BaseModel):
128
128
  TAGS_POSITION_SERIE: list[str] | None = None
129
129
 
130
130
  NUMBER_OF_SCREENSHOTS: int = 4
131
- YOUTUBE_FAV_CHANNEL_ID: str | None = None
132
- YOUTUBE_CHANNEL_ENABLE: bool = False
131
+ # YOUTUBE_FAV_CHANNEL_ID: str | None = None
132
+ # YOUTUBE_CHANNEL_ENABLE: bool = False
133
133
  DUPLICATE_ON: bool = False
134
134
  SKIP_DUPLICATE: bool = False
135
135
  SKIP_TMDB: bool = False
@@ -652,8 +652,8 @@ class Load:
652
652
  "multi", "acodec", "channels", "flag", "subtitle", "hdr", "vcodec",
653
653
  "video_encoder"],
654
654
 
655
- "YOUTUBE_FAV_CHANNEL_ID": "UCGCbxpnt25hWPFLSbvwfg_w",
656
- "YOUTUBE_CHANNEL_ENABLE": "False",
655
+ # "YOUTUBE_FAV_CHANNEL_ID": "UCGCbxpnt25hWPFLSbvwfg_w",
656
+ # "YOUTUBE_CHANNEL_ENABLE": "False",
657
657
  "DUPLICATE_ON": "true",
658
658
  "SKIP_DUPLICATE": "false",
659
659
  "SKIP_TMDB": "false",
@@ -228,6 +228,10 @@ class ManageTitles:
228
228
  """
229
229
  str2 = str2.lower().replace("-", "")
230
230
  str2 = ManageTitles.clean(str2)
231
+
232
+ str1 = str1.lower().replace("-", "")
233
+ str1 = ManageTitles.clean(str1)
234
+
231
235
  return fuzz.ratio(ManageTitles.remove_accent(str1.lower()), ManageTitles.remove_accent(str2.lower()))
232
236
 
233
237
  @staticmethod
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  dynamic = ["dependencies"]
7
7
  name = "Unit3Dup"
8
- version = "0.14.2"
8
+ version = "0.14.4"
9
9
  description = "An uploader for the Unit3D torrent tracker"
10
10
  readme = "README.rst"
11
11
  requires-python = ">=3.10"
@@ -323,7 +323,11 @@ class Media:
323
323
  @property
324
324
  def _resolution2(self):
325
325
  if self.mediafile:
326
- width = int(self.mediafile.video_width)
326
+ try:
327
+ width = int(self.mediafile.video_width)
328
+ except ValueError:
329
+ print(f"{self.file_name} Video width unknown or file corrupted")
330
+ exit()
327
331
  if self.mediafile.video_width:
328
332
  if width >= 3200:
329
333
  return "2160p"
@@ -1,102 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- import requests
4
- from .response import YouTubeSearchResponse, Thumbnails, Id, Item, PageInfo, Snippet
5
-
6
- from common import config_settings
7
- from view import custom_console
8
-
9
- class YtTrailer:
10
- url = 'https://www.googleapis.com/youtube/v3/search'
11
-
12
- def __init__(self, title: str):
13
- self.title = title
14
- self.params = {
15
- 'part': 'snippet',
16
- 'q': f'{title} trailer',
17
- 'type': 'video',
18
- 'key': config_settings.tracker_config.YOUTUBE_KEY,
19
- 'channelId': '',
20
- 'maxResults': 3,
21
- }
22
-
23
- def get_trailer_link(self) -> list[YouTubeSearchResponse] | None:
24
-
25
- # Use a favorite channel if the flag is True
26
- # Otherwise use a global YouTube search
27
- if config_settings.user_preferences.YOUTUBE_CHANNEL_ENABLE:
28
- self.params['channelId'] = config_settings.user_preferences.YOUTUBE_FAV_CHANNEL_ID
29
-
30
- response = requests.get(self.url, params=self.params)
31
-
32
- if response.status_code == 200:
33
- response_data = response.json()
34
- youtube_responses = []
35
-
36
- if response_data['items']:
37
- for result in response_data['items']:
38
- thumbnails_data = result['snippet']['thumbnails']
39
- thumbnails = Thumbnails(
40
- default=thumbnails_data['default'],
41
- high=thumbnails_data['high'],
42
- medium=thumbnails_data['medium']
43
- )
44
-
45
- snippet_data = result['snippet']
46
- snippet = Snippet(
47
- channelId=snippet_data['channelId'],
48
- channelTitle=snippet_data['channelTitle'],
49
- description=snippet_data['description'],
50
- liveBroadcastContent=snippet_data['liveBroadcastContent'],
51
- publishTime=snippet_data['publishTime'],
52
- publishedAt=snippet_data['publishedAt'],
53
- title=snippet_data['title'],
54
- thumbnails=thumbnails
55
- )
56
-
57
- video_id = None
58
- # Sometimes it returns a chennelId and not only the video id
59
- if 'id' in result:
60
- id_data = result['id']
61
-
62
- # Check if the result is a video or a channel
63
- if id_data['kind'] == 'youtube#video':
64
- video_id = Id(
65
- kind=id_data.get('kind', ''),
66
- videoId=id_data.get('videoId', '')
67
- )
68
- elif id_data['kind'] == 'youtube#channel':
69
- # Get video_di from the result
70
- video_id = Id(
71
- kind=id_data.get('kind', ''),
72
- videoId=id_data.get('channelId', '')
73
- )
74
- else:
75
- # Fail
76
- pass
77
-
78
- item = Item(
79
- etag=result['etag'],
80
- id=video_id,
81
- kind=result['kind'],
82
- snippet=snippet
83
- )
84
-
85
- page_info = PageInfo(**response_data['pageInfo'])
86
- youtube_response = YouTubeSearchResponse(
87
- etag=response_data['etag'],
88
- items=[item],
89
- kind=response_data['kind'],
90
- pageInfo=page_info,
91
- regionCode=response_data['regionCode']
92
- )
93
- youtube_responses.append(youtube_response)
94
-
95
-
96
- return youtube_responses
97
- else:
98
- return None
99
- else:
100
- custom_console.wait_for_user_confirmation("No response from YouTube. Check your API_KEY\n"
101
- "Press Enter to continue or Ctrl-C to exit")
102
- return None
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