Unit3Dup 0.14.3__tar.gz → 0.14.6__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.3 → unit3dup-0.14.6}/PKG-INFO +1 -1
  2. {unit3dup-0.14.3 → unit3dup-0.14.6}/Unit3Dup.egg-info/PKG-INFO +1 -1
  3. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/api.py +12 -8
  4. unit3dup-0.14.6/common/external_services/trailers/api.py +122 -0
  5. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/settings.py +4 -6
  6. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/signs_list.py +1 -0
  7. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/utility.py +4 -0
  8. {unit3dup-0.14.3 → unit3dup-0.14.6}/pyproject.toml +1 -1
  9. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/__main__.py +1 -0
  10. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media.py +5 -1
  11. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/pvtVideo.py +2 -2
  12. unit3dup-0.14.3/common/external_services/trailers/api.py +0 -102
  13. {unit3dup-0.14.3 → unit3dup-0.14.6}/LICENSE +0 -0
  14. {unit3dup-0.14.3 → unit3dup-0.14.6}/README.rst +0 -0
  15. {unit3dup-0.14.3 → unit3dup-0.14.6}/Unit3Dup.egg-info/SOURCES.txt +0 -0
  16. {unit3dup-0.14.3 → unit3dup-0.14.6}/Unit3Dup.egg-info/dependency_links.txt +0 -0
  17. {unit3dup-0.14.3 → unit3dup-0.14.6}/Unit3Dup.egg-info/entry_points.txt +0 -0
  18. {unit3dup-0.14.3 → unit3dup-0.14.6}/Unit3Dup.egg-info/requires.txt +0 -0
  19. {unit3dup-0.14.3 → unit3dup-0.14.6}/Unit3Dup.egg-info/top_level.txt +0 -0
  20. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/__init__.py +0 -0
  21. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/bdinfo_string.py +0 -0
  22. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/bittorrent.py +0 -0
  23. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/command.py +0 -0
  24. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/constants.py +0 -0
  25. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/database.py +0 -0
  26. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/__init__.py +0 -0
  27. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/ftpx/__init__.py +0 -0
  28. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/ftpx/client.py +0 -0
  29. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/ftpx/core/__init__.py +0 -0
  30. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/ftpx/core/ftpx_service.py +0 -0
  31. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/ftpx/core/ftpx_session.py +0 -0
  32. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/ftpx/core/menu.py +0 -0
  33. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/ftpx/core/models/__init__.py +0 -0
  34. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/ftpx/core/models/list.py +0 -0
  35. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/igdb/__init__.py +0 -0
  36. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/igdb/client.py +0 -0
  37. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/igdb/core/__init__.py +0 -0
  38. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/igdb/core/api.py +0 -0
  39. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/igdb/core/models/__init__.py +0 -0
  40. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/igdb/core/models/search.py +0 -0
  41. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/igdb/core/platformid.py +0 -0
  42. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/igdb/core/tags.py +0 -0
  43. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/imageHost.py +0 -0
  44. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/mediaresult.py +0 -0
  45. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/sessions/__init__.py +0 -0
  46. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/sessions/agents.py +0 -0
  47. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/sessions/exceptions.py +0 -0
  48. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/sessions/session.py +0 -0
  49. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/__init__.py +0 -0
  50. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/__init__.py +0 -0
  51. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/keywords.py +0 -0
  52. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/__init__.py +0 -0
  53. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/movie/__init__.py +0 -0
  54. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/movie/alternative.py +0 -0
  55. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/movie/details.py +0 -0
  56. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/movie/movie.py +0 -0
  57. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/movie/nowplaying.py +0 -0
  58. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/movie/release_info.py +0 -0
  59. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/movie/translations.py +0 -0
  60. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/tvshow/__init__.py +0 -0
  61. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/tvshow/alternative.py +0 -0
  62. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/tvshow/details.py +0 -0
  63. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/tvshow/on_the_air.py +0 -0
  64. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/tvshow/translations.py +0 -0
  65. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/models/tvshow/tvshow.py +0 -0
  66. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/theMovieDB/core/videos.py +0 -0
  67. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/trailers/__init__.py +0 -0
  68. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/trailers/response.py +0 -0
  69. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/external_services/tvdb.py +0 -0
  70. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/extractor.py +0 -0
  71. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/frames.py +0 -0
  72. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/mediainfo.py +0 -0
  73. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/mediainfo_string.py +0 -0
  74. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/tags.py +0 -0
  75. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/title.py +0 -0
  76. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/torrent_clients.py +0 -0
  77. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/__init__.py +0 -0
  78. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/ast.py +0 -0
  79. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/ban_list.py +0 -0
  80. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/data.py +0 -0
  81. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/itt.py +0 -0
  82. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/ptt.py +0 -0
  83. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/sis.py +0 -0
  84. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/tags_list.py +0 -0
  85. {unit3dup-0.14.3 → unit3dup-0.14.6}/common/trackers/trackers.py +0 -0
  86. {unit3dup-0.14.3 → unit3dup-0.14.6}/requirements.txt +0 -0
  87. {unit3dup-0.14.3 → unit3dup-0.14.6}/setup.cfg +0 -0
  88. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/__init__.py +0 -0
  89. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/automode.py +0 -0
  90. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/bot.py +0 -0
  91. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/duplicate.py +0 -0
  92. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/exceptions.py +0 -0
  93. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/ContentManager.py +0 -0
  94. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/DocuManager.py +0 -0
  95. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/GameManager.py +0 -0
  96. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/MediaInfoManager.py +0 -0
  97. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/SeedManager.py +0 -0
  98. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/TorrentManager.py +0 -0
  99. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/VideoManager.py +0 -0
  100. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/__init__.py +0 -0
  101. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/media_manager/common.py +0 -0
  102. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/pvtDocu.py +0 -0
  103. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/pvtTorrent.py +0 -0
  104. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/pvtTracker.py +0 -0
  105. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/torrent.py +0 -0
  106. {unit3dup-0.14.3 → unit3dup-0.14.6}/unit3dup/upload.py +0 -0
  107. {unit3dup-0.14.3 → unit3dup-0.14.6}/view/__init__.py +0 -0
  108. {unit3dup-0.14.3 → unit3dup-0.14.6}/view/custom_console.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Unit3Dup
3
- Version: 0.14.3
3
+ Version: 0.14.6
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.3
3
+ Version: 0.14.6
4
4
  Summary: An uploader for the Unit3D torrent tracker
5
5
  Author: Parzival
6
6
  License-Expression: MIT
@@ -430,6 +430,9 @@ class DbOnline(TmdbAPI):
430
430
  if 'no_key' in config_settings.tracker_config.YOUTUBE_KEY:
431
431
  return "not available"
432
432
 
433
+ if config_settings.user_preferences.SKIP_YOUTUBE:
434
+ return "Skipped"
435
+
433
436
  yt_trailer = YtTrailer(self.query)
434
437
  result = yt_trailer.get_trailer_link()
435
438
  if result:
@@ -437,13 +440,11 @@ class DbOnline(TmdbAPI):
437
440
  # todo compare against the media title especially for the favorite channel
438
441
  return result[0].items[0].id.videoId
439
442
  else:
440
- if not config_settings.user_preferences.SKIP_YOUTUBE:
441
- user_youtube_id = custom_console.user_input_str(message="Title not found."
442
- " Please digit a valid Youtube ID (0=skip)->")
443
- if user_youtube_id == 0:
444
- return "not available"
445
- return user_youtube_id
446
- 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
447
448
 
448
449
  def trailer(self, video_id: int) -> str | None:
449
450
  # Search for tmdb trailer
@@ -474,7 +475,10 @@ class DbOnline(TmdbAPI):
474
475
  if results.tvdb_id:
475
476
  custom_console.bot_warning_log(f"'TVDB ID'........ '{results.tvdb_id}'")
476
477
  custom_console.bot_log(f"'TMDB KEYWORDS'.. {results.keywords_list}")
477
- custom_console.bot_log(f"'TRAILER CODE' .. {results.trailer_key}")
478
+ if 'SKIPPED' in results.trailer_key.upper():
479
+ custom_console.bot_log(f"'TRAILER' ....... {results.trailer_key}")
480
+ else:
481
+ custom_console.bot_log(f"'TRAILER' ....... https://www.youtube.com/watch?v={results.trailer_key}")
478
482
 
479
483
  def load_cache(self, query: str) -> MediaResult | None:
480
484
  # 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.YOUTUBE_PREF_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.YOUTUBE_PREF_LANG.upper()
33
+ self.params['relevanceLanguage'] = config_settings.user_preferences.YOUTUBE_PREF_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.3"
27
+ version = "0.14.6"
28
28
 
29
29
  if os.name == "nt":
30
30
  WATCHER_DESTINATION_PATH: Path = Path(
@@ -128,8 +128,7 @@ 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_PREF_LANG: str | None = None
133
132
  DUPLICATE_ON: bool = False
134
133
  SKIP_DUPLICATE: bool = False
135
134
  SKIP_TMDB: bool = False
@@ -490,7 +489,7 @@ class Config(BaseModel):
490
489
  'FAST_LOAD']:
491
490
  section[field] = Validate.integer(value=section[field], field_name=field)
492
491
 
493
- if field == 'PREFERRED_LANG':
492
+ if field in ['PREFERRED_LANG', 'YOUTUBE_PREF_LANG']:
494
493
  section[field] = Validate.iso3166(value=section[field], field_name=field)
495
494
 
496
495
  if field == 'CACHE_PATH':
@@ -652,8 +651,7 @@ class Load:
652
651
  "multi", "acodec", "channels", "flag", "subtitle", "hdr", "vcodec",
653
652
  "video_encoder"],
654
653
 
655
- "YOUTUBE_FAV_CHANNEL_ID": "UCGCbxpnt25hWPFLSbvwfg_w",
656
- "YOUTUBE_CHANNEL_ENABLE": "False",
654
+ "YOUTUBE_PREF_LANG": "IT",
657
655
  "DUPLICATE_ON": "true",
658
656
  "SKIP_DUPLICATE": "false",
659
657
  "SKIP_TMDB": "false",
@@ -150,6 +150,7 @@ SIGNS_LIST = {
150
150
  "MADHEX": "releaser",
151
151
  "MADSKY": "releaser",
152
152
  "MADTIA": "releaser",
153
+ "MATITA": "releaser",
153
154
  "MAX": "releaser",
154
155
  "MAX2014": "releaser",
155
156
  "ME7ALH": "releaser",
@@ -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.3"
8
+ version = "0.14.6"
9
9
  description = "An uploader for the Unit3D torrent tracker"
10
10
  readme = "README.rst"
11
11
  requires-python = ">=3.10"
@@ -28,6 +28,7 @@ def main():
28
28
  custom_console.bot_log(f"[Watcher] '{config.user_preferences.WATCHER_PATH}'")
29
29
  custom_console.bot_log(f"[Watcher] '{config.user_preferences.WATCHER_DESTINATION_PATH}'")
30
30
  custom_console.bot_log(f"[Preferred Language] '{config.user_preferences.PREFERRED_LANG}'")
31
+ custom_console.bot_log(f"[Youtube Preferred Language] '{config.user_preferences.YOUTUBE_PREF_LANG}'")
31
32
  print()
32
33
 
33
34
  # /// Initialize command line interface
@@ -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"
@@ -21,7 +21,7 @@ class Video:
21
21
  self.display_name: str = media.display_name
22
22
 
23
23
  self.tmdb_id: int = tmdb_id
24
- self.trailer_key: int = trailer_key
24
+ self.trailer_key: str = trailer_key
25
25
  self.cache = diskcache.Cache(str(config_settings.user_preferences.CACHE_PATH))
26
26
 
27
27
  # Create a cache key for tmdb_id
@@ -94,7 +94,7 @@ class Video:
94
94
  [center][url={config_settings.user_preferences.MY_URL}]Tutte le mie release[/url][/center]
95
95
  """
96
96
 
97
- if self.trailer_key:
97
+ if 'SKIPPED' not in self.trailer_key.upper() and self.trailer_key.upper() is not None:
98
98
  self.description += (f"[b][spoiler=Spoiler: PLAY TRAILER][center][youtube]{self.trailer_key}[/youtube]"
99
99
  f"[/center][/spoiler][/b]")
100
100
  self.is_hd = is_hd
@@ -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