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.
- {unit3dup-0.14.2 → unit3dup-0.14.4}/PKG-INFO +1 -1
- {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/PKG-INFO +1 -1
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/api.py +15 -11
- unit3dup-0.14.4/common/external_services/trailers/api.py +122 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/settings.py +5 -5
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/utility.py +4 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/pyproject.toml +1 -1
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media.py +5 -1
- unit3dup-0.14.2/common/external_services/trailers/api.py +0 -102
- {unit3dup-0.14.2 → unit3dup-0.14.4}/LICENSE +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/README.rst +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/SOURCES.txt +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/dependency_links.txt +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/entry_points.txt +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/requires.txt +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/Unit3Dup.egg-info/top_level.txt +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/bdinfo_string.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/bittorrent.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/command.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/constants.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/database.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/client.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/ftpx_service.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/ftpx_session.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/menu.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/models/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/ftpx/core/models/list.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/client.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/api.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/models/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/models/search.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/platformid.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/igdb/core/tags.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/imageHost.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/mediaresult.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/sessions/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/sessions/agents.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/sessions/exceptions.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/sessions/session.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/keywords.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/alternative.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/details.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/movie.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/nowplaying.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/release_info.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/translations.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/alternative.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/details.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/on_the_air.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/translations.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/tvshow/tvshow.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/videos.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/trailers/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/trailers/response.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/tvdb.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/extractor.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/frames.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/mediainfo.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/mediainfo_string.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/tags.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/title.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/torrent_clients.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/ast.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/ban_list.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/data.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/itt.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/ptt.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/signs_list.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/sis.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/tags_list.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/common/trackers/trackers.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/requirements.txt +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/setup.cfg +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/__main__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/automode.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/bot.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/duplicate.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/exceptions.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/ContentManager.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/DocuManager.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/GameManager.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/MediaInfoManager.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/SeedManager.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/TorrentManager.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/VideoManager.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/media_manager/common.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/pvtDocu.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/pvtTorrent.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/pvtTracker.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/pvtVideo.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/torrent.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/unit3dup/upload.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/view/__init__.py +0 -0
- {unit3dup-0.14.2 → unit3dup-0.14.4}/view/custom_console.py +0 -0
|
@@ -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=
|
|
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=
|
|
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
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
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
|
|
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.
|
|
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
|
|
@@ -323,7 +323,11 @@ class Media:
|
|
|
323
323
|
@property
|
|
324
324
|
def _resolution2(self):
|
|
325
325
|
if self.mediafile:
|
|
326
|
-
|
|
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
|
|
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.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unit3dup-0.14.2 → unit3dup-0.14.4}/common/external_services/theMovieDB/core/models/movie/details.py
RENAMED
|
File without changes
|
{unit3dup-0.14.2 → unit3dup-0.14.4}/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
|
|
File without changes
|
{unit3dup-0.14.2 → unit3dup-0.14.4}/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
|
|
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
|