mirror of
https://github.com/SickGear/SickGear.git
synced 2024-11-15 01:15:05 +00:00
Fix py2 deprecation cleanups added exclusively by TvdbV4 code.
Refactor `timestamp_near` to `SGDatetime.timestamp_near` --- Simplify enforce_type + clean_data to clean_str. Change simplified all but one enforce_type use case. --- Add tvdb, trakt slug tvinfo search test cases Change direct tvdb slug search support via new api endpoint Fix origin_countries in tvdb_api_v4. --- Add new TV_Maze id to show obj ids in tvdb_api_v4. Fix a bug parsing social ids for tvshows in tvdb_api_v4. Change add language support to search API and tvdb_api_v4. Change add `updated_at` to artwork on tvdb_api_v4. Change add `finale` type to episodes. Change add method `get_top_rated` to tvdb_api_v4. optional params... - year=... argument to get only top rated of given year, if not it's all time Change returns result for shows until same day last year. Add youtube, reddit, fansite, tiktok, linkedin, wikidata to tv.py Add tiktok to indexer_config. Add fansite to tvdb_api_v4. Aadd fansite to TVInfoSocialIDs. Add source type parsing and add linkein to tvdb_api_v4. Add linkedin. Add tiktok parser to tvdb_api_v4. Change v4 to TVInfoIDs, TVInfoSocialIDs. Change add new id data. Add contentrating. Change fill in new fields to get_person results. ---- Change implement discover endpoint in tvdb_api_v4. Change filter '0000' year for firstaired field in tvdb_api_v4. Change use the default_season_type from api for website fallback. Change remove unneeded _auth_time. Add backup fetch for episode data. Change add multiple space remove to clean_data. Change move _get_tvdb_id to central function. Change fix minor warnings, code tidy + DRY. Change remove the show-edit option `Use DVD titles and numbers` until ready with multi TVInfo source. Add try_date and use to attempt conversion of unspecified date format types birthdate, deathdate, aired. Change tweaks, remove one warn, order imports. Change tidy up of other warnings, mismatched types, typos, a strange arg issue with deepcopy, and PEP8. Bug fix, bad key in get_item for TVInfoSocialIDs. Fix ambiguities of `show` used in sg versus external uses. Fix add data sanitisation of image field. Change make set_episode code more readable. Change fix final two warnings in api v4. Fix an API can return falsy as firstaired which crashes adding a show via load_from_tv_info() (The Andrew Marr Show@tvdbv4). Add cast, crew type mappings Only take Main Actors, Hosts, Interviewers, Presenters Change increase viewagble history menu items from 13 to 15.
This commit is contained in:
parent
79f0c829a7
commit
b55b29732b
10 changed files with 948 additions and 268 deletions
|
@ -342,7 +342,10 @@
|
||||||
* Add to config/media-process/File Handling, "Rename TBA" and "Rename any"
|
* Add to config/media-process/File Handling, "Rename TBA" and "Rename any"
|
||||||
* Add config to change media process log message if there is no media to process
|
* Add config to change media process log message if there is no media to process
|
||||||
* Change view-show text "invalid timeformat" to "time unknown"
|
* Change view-show text "invalid timeformat" to "time unknown"
|
||||||
|
* Add TVDb v4
|
||||||
|
* Add menu Shows/"TVDb Cards"
|
||||||
* Add menu Shows/"TMDB Cards"
|
* Add menu Shows/"TMDB Cards"
|
||||||
|
* Change increase viewable history menu items from 13 to 15
|
||||||
* Add a persons available socials (Youtube, LinkedIn, Reddit, Fansite, TikTok, Wikidata)
|
* Add a persons available socials (Youtube, LinkedIn, Reddit, Fansite, TikTok, Wikidata)
|
||||||
* Change use TVDb genres on view-show if config/General/Interface/"Enable IMDb info" is disabled
|
* Change use TVDb genres on view-show if config/General/Interface/"Enable IMDb info" is disabled
|
||||||
* Fix TVDb api episode issues
|
* Fix TVDb api episode issues
|
||||||
|
@ -503,6 +506,8 @@
|
||||||
* Change migrate Kodi addon to Kodi (Matrix), (Leia) and older can use repo source url /kodi-legacy
|
* Change migrate Kodi addon to Kodi (Matrix), (Leia) and older can use repo source url /kodi-legacy
|
||||||
* Change ensure XML header in Kodi nfo files
|
* Change ensure XML header in Kodi nfo files
|
||||||
* Change fix some typos
|
* Change fix some typos
|
||||||
|
* Add menu Shows/"TVDb Cards"
|
||||||
|
* Add menu Shows/"TMDB Cards"
|
||||||
|
|
||||||
|
|
||||||
### 0.25.60 (2023-01-03 13:30:00 UTC)
|
### 0.25.60 (2023-01-03 13:30:00 UTC)
|
||||||
|
@ -966,6 +971,7 @@
|
||||||
* Change improve the search progress text
|
* Change improve the search progress text
|
||||||
* Add "Size" filter '<0' in history view to filter already deleted media
|
* Add "Size" filter '<0' in history view to filter already deleted media
|
||||||
* Change swap `Episode` and `Label` columns in history view
|
* Change swap `Episode` and `Label` columns in history view
|
||||||
|
* Change add TheTVDb v4 support
|
||||||
|
|
||||||
|
|
||||||
### 0.24.17 (2021-08-31 01:00:00 UTC)
|
### 0.24.17 (2021-08-31 01:00:00 UTC)
|
||||||
|
|
|
@ -301,7 +301,7 @@ $(function() {
|
||||||
var filterValue = this.value;
|
var filterValue = this.value;
|
||||||
if (-1 == filterValue.indexOf('trakt') && -1 == filterValue.indexOf('imdb') && -1 == filterValue.indexOf('mc_')
|
if (-1 == filterValue.indexOf('trakt') && -1 == filterValue.indexOf('imdb') && -1 == filterValue.indexOf('mc_')
|
||||||
&& -1 == filterValue.indexOf('tmdb_') && -1 == filterValue.indexOf('tvc_')
|
&& -1 == filterValue.indexOf('tmdb_') && -1 == filterValue.indexOf('tvc_')
|
||||||
&& -1 == filterValue.indexOf('tvm_')
|
&& -1 == filterValue.indexOf('tvdb_') && -1 == filterValue.indexOf('tvm_')
|
||||||
&& -1 == filterValue.indexOf('ne_') && -1 == filterValue.indexOf('_ne')
|
&& -1 == filterValue.indexOf('ne_') && -1 == filterValue.indexOf('_ne')
|
||||||
&& -1 == filterValue.indexOf('default')) {
|
&& -1 == filterValue.indexOf('default')) {
|
||||||
var el$ = $('#container')
|
var el$ = $('#container')
|
||||||
|
@ -507,6 +507,14 @@ $(function() {
|
||||||
<option value="tmdb_trending_today"#echo ('', selected)['trending_today' == $mode]#>Trending today</option>
|
<option value="tmdb_trending_today"#echo ('', selected)['trending_today' == $mode]#>Trending today</option>
|
||||||
<option value="tmdb_trending_week"#echo ('', selected)['trending_week' == $mode]#>Trending this week</option>
|
<option value="tmdb_trending_week"#echo ('', selected)['trending_week' == $mode]#>Trending this week</option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
|
#elif 'TVDb' == $browse_type
|
||||||
|
<optgroup label="TVDb">
|
||||||
|
<option value="tvdb_upcoming"#echo ('', selected)['upcoming' == $mode]#>Upcoming</option>
|
||||||
|
<option value="tvdb_toprated"#echo ('', selected)['toprated' == $mode and not $kwargs.get('year')]#>Top rated all time</option>
|
||||||
|
#for $cur_y in $kwargs.get('rate_years') or []
|
||||||
|
<option value="$cur_y[1]"#echo ('', selected)[$cur_y[0] == $kwargs.get('year')]#>$cur_y[2]</option>
|
||||||
|
#end for
|
||||||
|
</optgroup>
|
||||||
#elif 'TVCalendar' == $browse_type
|
#elif 'TVCalendar' == $browse_type
|
||||||
<optgroup label="TVCalendar">
|
<optgroup label="TVCalendar">
|
||||||
#for $page in $kwargs.get('pages') or []
|
#for $page in $kwargs.get('pages') or []
|
||||||
|
|
|
@ -177,6 +177,10 @@
|
||||||
<li><a id="add-show-name" data-href="$sbRoot/add-shows/find/" tabindex="$tab#set $tab += 1#"><i class="sgicon-addshow"></i>
|
<li><a id="add-show-name" data-href="$sbRoot/add-shows/find/" tabindex="$tab#set $tab += 1#"><i class="sgicon-addshow"></i>
|
||||||
<input class="form-control form-control-inline input-sm" type="text" placeholder="Search" tabindex="$tab#set $tab += 1#">
|
<input class="form-control form-control-inline input-sm" type="text" placeholder="Search" tabindex="$tab#set $tab += 1#">
|
||||||
<div class="menu-item-desc opacity60">find show at TV info source</div></a></li>
|
<div class="menu-item-desc opacity60">find show at TV info source</div></a></li>
|
||||||
|
#set $tvdb_modes = dict(tvdb_upcoming='upcoming', tvdb_toprated='top rated')
|
||||||
|
#set $tvdb_mode = $tvdb_modes.get($sg_var('TVDB_MRU'), 'upcoming')
|
||||||
|
<li><a href="$sbRoot/add-shows/tvdb-default/" tabindex="$tab#set $tab += 1#"><i class="sgicon-addshow"></i>TVDb Cards
|
||||||
|
<div class="menu-item-desc opacity60">$tvdb_mode...</div></a></li>
|
||||||
#set $tvm_modes = dict(tvm_premieres='new shows', tvm_returning='returning')
|
#set $tvm_modes = dict(tvm_premieres='new shows', tvm_returning='returning')
|
||||||
#set $tvm_mode = $tvm_modes.get($sg_var('TVM_MRU'), 'new shows')
|
#set $tvm_mode = $tvm_modes.get($sg_var('TVM_MRU'), 'new shows')
|
||||||
<li><a href="$sbRoot/add-shows/tvm-default/" tabindex="$tab#set $tab += 1#"><i class="sgicon-tvmaze"></i>TVmaze Cards
|
<li><a href="$sbRoot/add-shows/tvm-default/" tabindex="$tab#set $tab += 1#"><i class="sgicon-tvmaze"></i>TVmaze Cards
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1809,7 +1809,7 @@ def is_virtualenv():
|
||||||
def enforce_type(value, allowed_types, default):
|
def enforce_type(value, allowed_types, default):
|
||||||
# type: (Any, Union[Type, Tuple[Type]], Any) -> Any
|
# type: (Any, Union[Type, Tuple[Type]], Any) -> Any
|
||||||
"""
|
"""
|
||||||
enforces that value is given type(s)
|
enforce value to supplied type(s)
|
||||||
:param value: value to check
|
:param value: value to check
|
||||||
:param allowed_types: type or tuple of types allowed
|
:param allowed_types: type or tuple of types allowed
|
||||||
:param default: value to return if other type
|
:param default: value to return if other type
|
||||||
|
@ -1817,3 +1817,12 @@ def enforce_type(value, allowed_types, default):
|
||||||
if not isinstance(value, allowed_types):
|
if not isinstance(value, allowed_types):
|
||||||
return default
|
return default
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def clean_str(value):
|
||||||
|
# type: (Any) -> AnyStr
|
||||||
|
"""
|
||||||
|
clean and enforced a value to a string type
|
||||||
|
:param value: to process
|
||||||
|
"""
|
||||||
|
return enforce_type(clean_data(value), str, '')
|
||||||
|
|
|
@ -625,6 +625,7 @@ MC_MRU = ''
|
||||||
NE_MRU = ''
|
NE_MRU = ''
|
||||||
TMDB_MRU = ''
|
TMDB_MRU = ''
|
||||||
TVC_MRU = ''
|
TVC_MRU = ''
|
||||||
|
TVDB_MRU = ''
|
||||||
TVM_MRU = ''
|
TVM_MRU = ''
|
||||||
|
|
||||||
COOKIE_SECRET = b64encodestring(uuid.uuid4().bytes + uuid.uuid4().bytes)
|
COOKIE_SECRET = b64encodestring(uuid.uuid4().bytes + uuid.uuid4().bytes)
|
||||||
|
@ -773,7 +774,7 @@ def init_stage_1(console_logging):
|
||||||
global USE_TRAKT, TRAKT_CONNECTED_ACCOUNT, TRAKT_ACCOUNTS, TRAKT_MRU, TRAKT_VERIFY, \
|
global USE_TRAKT, TRAKT_CONNECTED_ACCOUNT, TRAKT_ACCOUNTS, TRAKT_MRU, TRAKT_VERIFY, \
|
||||||
TRAKT_USE_WATCHLIST, TRAKT_REMOVE_WATCHLIST, TRAKT_TIMEOUT, TRAKT_METHOD_ADD, TRAKT_START_PAUSED, \
|
TRAKT_USE_WATCHLIST, TRAKT_REMOVE_WATCHLIST, TRAKT_TIMEOUT, TRAKT_METHOD_ADD, TRAKT_START_PAUSED, \
|
||||||
TRAKT_SYNC, TRAKT_DEFAULT_INDEXER, TRAKT_REMOVE_SERIESLIST, TRAKT_UPDATE_COLLECTION, \
|
TRAKT_SYNC, TRAKT_DEFAULT_INDEXER, TRAKT_REMOVE_SERIESLIST, TRAKT_UPDATE_COLLECTION, \
|
||||||
MC_MRU, NE_MRU, TMDB_MRU, TVC_MRU, TVM_MRU, \
|
MC_MRU, NE_MRU, TMDB_MRU, TVC_MRU, TVDB_MRU, TVM_MRU, \
|
||||||
USE_SLACK, SLACK_NOTIFY_ONSNATCH, SLACK_NOTIFY_ONDOWNLOAD, SLACK_NOTIFY_ONSUBTITLEDOWNLOAD, \
|
USE_SLACK, SLACK_NOTIFY_ONSNATCH, SLACK_NOTIFY_ONDOWNLOAD, SLACK_NOTIFY_ONSUBTITLEDOWNLOAD, \
|
||||||
SLACK_CHANNEL, SLACK_AS_AUTHED, SLACK_BOT_NAME, SLACK_ICON_URL, SLACK_ACCESS_TOKEN, \
|
SLACK_CHANNEL, SLACK_AS_AUTHED, SLACK_BOT_NAME, SLACK_ICON_URL, SLACK_ACCESS_TOKEN, \
|
||||||
USE_DISCORD, DISCORD_NOTIFY_ONSNATCH, DISCORD_NOTIFY_ONDOWNLOAD, \
|
USE_DISCORD, DISCORD_NOTIFY_ONSNATCH, DISCORD_NOTIFY_ONDOWNLOAD, \
|
||||||
|
@ -1214,6 +1215,7 @@ def init_stage_1(console_logging):
|
||||||
NE_MRU = check_setting_str(CFG, 'NextEpisode', 'ne_mru', '')
|
NE_MRU = check_setting_str(CFG, 'NextEpisode', 'ne_mru', '')
|
||||||
TMDB_MRU = check_setting_str(CFG, 'TMDB', 'tmdb_mru', '')
|
TMDB_MRU = check_setting_str(CFG, 'TMDB', 'tmdb_mru', '')
|
||||||
TVC_MRU = check_setting_str(CFG, 'TVCalendar', 'tvc_mru', '')
|
TVC_MRU = check_setting_str(CFG, 'TVCalendar', 'tvc_mru', '')
|
||||||
|
TVDB_MRU = check_setting_str(CFG, 'TVDb', 'tvdb_mru', '')
|
||||||
TVM_MRU = check_setting_str(CFG, 'TVmaze', 'tvm_mru', '')
|
TVM_MRU = check_setting_str(CFG, 'TVmaze', 'tvm_mru', '')
|
||||||
|
|
||||||
USE_PYTIVO = bool(check_setting_int(CFG, 'pyTivo', 'use_pytivo', 0))
|
USE_PYTIVO = bool(check_setting_int(CFG, 'pyTivo', 'use_pytivo', 0))
|
||||||
|
@ -1727,7 +1729,7 @@ def init_stage_2():
|
||||||
background_mapping_task = threading.Thread(name='MAPPINGUPDATES', target=indexermapper.load_mapped_ids,
|
background_mapping_task = threading.Thread(name='MAPPINGUPDATES', target=indexermapper.load_mapped_ids,
|
||||||
kwargs={'load_all': True})
|
kwargs={'load_all': True})
|
||||||
|
|
||||||
MEMCACHE['history_tab_limit'] = 13
|
MEMCACHE['history_tab_limit'] = 15
|
||||||
MEMCACHE['history_tab'] = History.menu_tab(MEMCACHE['history_tab_limit'])
|
MEMCACHE['history_tab'] = History.menu_tab(MEMCACHE['history_tab_limit'])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -2298,6 +2300,9 @@ def _save_config(force=False, **kwargs):
|
||||||
('TVCalendar', [
|
('TVCalendar', [
|
||||||
('mru', TVC_MRU)
|
('mru', TVC_MRU)
|
||||||
]),
|
]),
|
||||||
|
('TVDb', [
|
||||||
|
('mru', TVDB_MRU)
|
||||||
|
]),
|
||||||
('TVmaze', [
|
('TVmaze', [
|
||||||
('mru', TVM_MRU)
|
('mru', TVM_MRU)
|
||||||
]),
|
]),
|
||||||
|
|
|
@ -78,18 +78,23 @@ class TVInfoAPI(object):
|
||||||
if sickgear.CACHE_DIR:
|
if sickgear.CACHE_DIR:
|
||||||
return self.api_params['cache']
|
return self.api_params['cache']
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _filter(condition):
|
||||||
|
return dict([(int(x['id']), x['name']) for x in list(tvinfo_config.values()) if condition(x)])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sources(self):
|
def sources(self):
|
||||||
# type: () -> Dict[int, AnyStr]
|
# type: () -> Dict[int, AnyStr]
|
||||||
return dict([(int(x['id']), x['name']) for x in list(tvinfo_config.values()) if not x['mapped_only'] and
|
return self._filter(lambda x:
|
||||||
True is not x.get('fallback') and True is not x.get('people_only')])
|
not x['mapped_only'] and
|
||||||
|
True is not x.get('fallback') and True is not x.get('people_only'))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def search_sources(self):
|
def search_sources(self):
|
||||||
# type: () -> Dict[int, AnyStr]
|
# type: () -> Dict[int, AnyStr]
|
||||||
return dict([(int(x['id']), x['name']) for x in list(tvinfo_config.values()) if not x['mapped_only'] and
|
return self._filter(lambda x:
|
||||||
x.get('active') and not x.get('defunct') and True is not x.get('fallback')
|
not x['mapped_only'] and x.get('active') and not x.get('defunct') and
|
||||||
and True is not x.get('people_only')])
|
True is not x.get('fallback') and True is not x.get('people_only'))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def all_sources(self):
|
def all_sources(self):
|
||||||
|
@ -97,8 +102,8 @@ class TVInfoAPI(object):
|
||||||
"""
|
"""
|
||||||
:return: return all indexers including mapped only indexers excluding fallback indexers
|
:return: return all indexers including mapped only indexers excluding fallback indexers
|
||||||
"""
|
"""
|
||||||
return dict([(int(x['id']), x['name']) for x in list(tvinfo_config.values()) if True is not x.get('fallback')
|
return self._filter(lambda x:
|
||||||
and True is not x.get('people_only')])
|
True is not x.get('fallback') and True is not x.get('people_only'))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def fallback_sources(self):
|
def fallback_sources(self):
|
||||||
|
@ -106,9 +111,9 @@ class TVInfoAPI(object):
|
||||||
"""
|
"""
|
||||||
:return: return all fallback indexers
|
:return: return all fallback indexers
|
||||||
"""
|
"""
|
||||||
return dict([(int(x['id']), x['name']) for x in list(tvinfo_config.values()) if True is x.get('fallback')])
|
return self._filter(lambda x: True is x.get('fallback'))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def xem_supported_sources(self):
|
def xem_supported_sources(self):
|
||||||
# type: () -> Dict[int, AnyStr]
|
# type: () -> Dict[int, AnyStr]
|
||||||
return dict([(int(x['id']), x['name']) for x in list(tvinfo_config.values()) if x.get('xem_origin')])
|
return self._filter(lambda x: x.get('xem_origin'))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from lib.api_tvdb.tvdb_api import Tvdb
|
from lib.api_tvdb.tvdb_api import Tvdb
|
||||||
from lib.api_tvdb.tvdb_api_v4 import Tvdb_API_V4
|
from lib.api_tvdb.tvdb_api_v4 import TvdbAPIv4
|
||||||
import lib.api_tvdb.tvdb_api_v4
|
import lib.api_tvdb.tvdb_api_v4
|
||||||
from lib.api_trakt.indexerapiinterface import TraktIndexer
|
from lib.api_trakt.indexerapiinterface import TraktIndexer
|
||||||
from lib.api_tvmaze.tvmaze_api import TvMaze
|
from lib.api_tvmaze.tvmaze_api import TvMaze
|
||||||
|
@ -25,7 +25,7 @@ tvinfo_config = {
|
||||||
api_url='https://api.thetvdb.com/',
|
api_url='https://api.thetvdb.com/',
|
||||||
id=TVINFO_TVDB,
|
id=TVINFO_TVDB,
|
||||||
name='TheTVDB', slug='tvdb', kodi_slug='tvdb',
|
name='TheTVDB', slug='tvdb', kodi_slug='tvdb',
|
||||||
module=Tvdb_API_V4,
|
module=TvdbAPIv4,
|
||||||
api_params=dict(apikey='6cfd6399fd2bee018a8793da976f6522',
|
api_params=dict(apikey='6cfd6399fd2bee018a8793da976f6522',
|
||||||
apikey_v4=b'm5uaxWhrm56TlWTGm5Jkk5uYZW-ea5uOnmqcmWmXZmVtxp2a', language='en'),
|
apikey_v4=b'm5uaxWhrm56TlWTGm5Jkk5uYZW-ea5uOnmqcmWmXZmVtxp2a', language='en'),
|
||||||
active=True,
|
active=True,
|
||||||
|
|
|
@ -112,6 +112,7 @@ if False:
|
||||||
# from api_imdb.imdb_api import IMDbIndexer
|
# from api_imdb.imdb_api import IMDbIndexer
|
||||||
from api_tmdb.tmdb_api import TmdbIndexer
|
from api_tmdb.tmdb_api import TmdbIndexer
|
||||||
from api_trakt.indexerapiinterface import TraktIndexer
|
from api_trakt.indexerapiinterface import TraktIndexer
|
||||||
|
from api_tvdb.tvdb_api_v4 import TvdbAPIv4 as TvdbIndexer
|
||||||
from api_tvmaze.tvmaze_api import TvMaze as TvmazeIndexer
|
from api_tvmaze.tvmaze_api import TvMaze as TvmazeIndexer
|
||||||
|
|
||||||
|
|
||||||
|
@ -6036,6 +6037,120 @@ class AddShows(Home):
|
||||||
|
|
||||||
return self.new_show('|'.join(['', '', '', show_name]), use_show_name=True)
|
return self.new_show('|'.join(['', '', '', show_name]), use_show_name=True)
|
||||||
|
|
||||||
|
def tvdb_default(self):
|
||||||
|
method = getattr(self, sickgear.TVDB_MRU, None)
|
||||||
|
if not callable(method):
|
||||||
|
return self.tvdb_upcoming()
|
||||||
|
return method()
|
||||||
|
|
||||||
|
def tvdb_upcoming(self, **kwargs):
|
||||||
|
return self.browse_tvdb(
|
||||||
|
'Upcoming at TVDb', mode='upcoming', **kwargs)
|
||||||
|
|
||||||
|
def tvdb_toprated(self, **kwargs):
|
||||||
|
return self.browse_tvdb(
|
||||||
|
'Top rated at TVDb', mode='toprated', **kwargs)
|
||||||
|
|
||||||
|
def browse_tvdb(self, browse_title, **kwargs):
|
||||||
|
|
||||||
|
browse_type = 'TVDb'
|
||||||
|
mode = kwargs.get('mode', '')
|
||||||
|
|
||||||
|
footnote = None
|
||||||
|
filtered = []
|
||||||
|
|
||||||
|
tvid = TVINFO_TVDB
|
||||||
|
tvinfo_config = sickgear.TVInfoAPI(tvid).api_params.copy()
|
||||||
|
t = sickgear.TVInfoAPI(tvid).setup(**tvinfo_config) # type: Union[TvdbIndexer, TVInfoBase]
|
||||||
|
|
||||||
|
top_year = helpers.try_int(kwargs.get('year'), None)
|
||||||
|
if 'upcoming' == mode:
|
||||||
|
items = t.discover()
|
||||||
|
else:
|
||||||
|
items = t.get_top_rated(year=top_year,
|
||||||
|
in_last_year=1 == datetime.date.today().month and 7 > datetime.date.today().day)
|
||||||
|
|
||||||
|
oldest, newest, oldest_dt, newest_dt, dedupe = None, None, 9999999, 0, []
|
||||||
|
use_networks = False
|
||||||
|
parseinfo = dateutil.parser.parserinfo(dayfirst=False, yearfirst=True)
|
||||||
|
base_url = sickgear.TVInfoAPI(TVINFO_TVDB).config['show_url']
|
||||||
|
for cur_show_info in items:
|
||||||
|
if cur_show_info.id in dedupe or not cur_show_info.seriesname:
|
||||||
|
continue
|
||||||
|
dedupe += [cur_show_info.id]
|
||||||
|
|
||||||
|
try:
|
||||||
|
airtime = cur_show_info.airs_time
|
||||||
|
if not airtime or (0, 0) == (airtime.hour, airtime.minute):
|
||||||
|
airtime = dateutil.parser.parse('23:59').time()
|
||||||
|
dt = datetime.datetime.combine(
|
||||||
|
dateutil.parser.parse(cur_show_info.firstaired, parseinfo).date(), airtime)
|
||||||
|
ord_premiered, str_premiered, started_past, oldest_dt, newest_dt, oldest, newest, _, _, _, _ \
|
||||||
|
= self.sanitise_dates(dt, oldest_dt, newest_dt, oldest, newest)
|
||||||
|
|
||||||
|
image = self._make_cache_image_url(tvid, cur_show_info)
|
||||||
|
images = {} if not image else dict(poster=dict(thumb=image))
|
||||||
|
|
||||||
|
ids = dict(tvdb=cur_show_info.id)
|
||||||
|
if cur_show_info.ids.imdb:
|
||||||
|
ids['imdb'] = cur_show_info.ids.imdb
|
||||||
|
|
||||||
|
network_name = cur_show_info.network
|
||||||
|
cc = 'US'
|
||||||
|
if network_name:
|
||||||
|
use_networks = True
|
||||||
|
cc = cur_show_info.network_country_code or cc
|
||||||
|
|
||||||
|
language = ((cur_show_info.language and 'jap' in cur_show_info.language.lower())
|
||||||
|
and 'jp' or 'en')
|
||||||
|
|
||||||
|
filtered.append(dict(
|
||||||
|
ord_premiered=ord_premiered,
|
||||||
|
str_premiered=str_premiered,
|
||||||
|
started_past=started_past,
|
||||||
|
episode_overview=helpers.xhtml_escape(cur_show_info.overview[:250:]).strip('*').strip(),
|
||||||
|
episode_season=cur_show_info.season,
|
||||||
|
genres=', '.join(cur_show_info.genre_list)
|
||||||
|
or (cur_show_info.genre and (cur_show_info.genre.strip('|').replace('|', ', ')) or ''),
|
||||||
|
ids=ids,
|
||||||
|
images=images,
|
||||||
|
overview=(helpers.xhtml_escape(cur_show_info.overview[:250:]).strip('*').strip()
|
||||||
|
or 'No overview yet'),
|
||||||
|
title=cur_show_info.seriesname,
|
||||||
|
language=language,
|
||||||
|
language_img=sickgear.MEMCACHE_FLAG_IMAGES.get(language, False),
|
||||||
|
country=cc,
|
||||||
|
country_img=sickgear.MEMCACHE_FLAG_IMAGES.get(cc.lower(), False),
|
||||||
|
network=network_name,
|
||||||
|
rating=False,
|
||||||
|
url_src_db=base_url % cur_show_info.id,
|
||||||
|
votes=cur_show_info.rating or 0,
|
||||||
|
))
|
||||||
|
except (BaseException, Exception):
|
||||||
|
pass
|
||||||
|
kwargs.update(dict(oldest=oldest, newest=newest, use_ratings=False, term_vote='Score'))
|
||||||
|
|
||||||
|
this_year = datetime.date.today().year
|
||||||
|
years = [
|
||||||
|
(this_year - cur_y,
|
||||||
|
'tvdb_toprated?year=%s' % (this_year - cur_y),
|
||||||
|
'Top %s releases' % (this_year - cur_y))
|
||||||
|
for cur_y in range(0, 10)]
|
||||||
|
kwargs.update(dict(footnote=footnote, use_networks=use_networks, year=top_year or '', rate_years=years))
|
||||||
|
|
||||||
|
if mode:
|
||||||
|
func = 'tvdb_%s' % mode
|
||||||
|
if callable(getattr(self, func, None)):
|
||||||
|
sickgear.TVDB_MRU = func
|
||||||
|
sickgear.save_config()
|
||||||
|
return self.browse_shows(browse_type, browse_title, filtered, **kwargs)
|
||||||
|
|
||||||
|
# noinspection PyUnusedLocal
|
||||||
|
def info_tvdb(self, ids, show_name):
|
||||||
|
|
||||||
|
if not list(filter(lambda tvid_prodid: helpers.find_show_by_id(tvid_prodid), ids.split(' '))):
|
||||||
|
return self.new_show('|'.join(['', '', '', ' '.join([ids, show_name])]), use_show_name=True)
|
||||||
|
|
||||||
def tvm_default(self):
|
def tvm_default(self):
|
||||||
method = getattr(self, sickgear.TVM_MRU, None)
|
method = getattr(self, sickgear.TVM_MRU, None)
|
||||||
if not callable(method) or not self.allow_browse_mru(sickgear.TMDB_MRU):
|
if not callable(method) or not self.allow_browse_mru(sickgear.TMDB_MRU):
|
||||||
|
@ -6283,7 +6398,7 @@ class AddShows(Home):
|
||||||
def browse_mru(browse_type, **kwargs):
|
def browse_mru(browse_type, **kwargs):
|
||||||
save_config = False
|
save_config = False
|
||||||
if browse_type in ('AniDB', 'IMDb', 'Metacritic', 'Trakt', 'TVCalendar',
|
if browse_type in ('AniDB', 'IMDb', 'Metacritic', 'Trakt', 'TVCalendar',
|
||||||
'TMDB', 'TVmaze', 'Nextepisode'):
|
'TMDB', 'TVDb', 'TVmaze', 'Nextepisode'):
|
||||||
save_config = True
|
save_config = True
|
||||||
if browse_type in ('TVmaze',) and kwargs.get('showfilter') and kwargs.get('showsort'):
|
if browse_type in ('TVmaze',) and kwargs.get('showfilter') and kwargs.get('showsort'):
|
||||||
sickgear.BROWSELIST_MRU.setdefault(browse_type, dict()) \
|
sickgear.BROWSELIST_MRU.setdefault(browse_type, dict()) \
|
||||||
|
|
|
@ -20,7 +20,7 @@ sys.path.insert(1, os.path.abspath('..'))
|
||||||
|
|
||||||
import sickgear
|
import sickgear
|
||||||
from sickgear.indexers.indexer_config import TVINFO_TVDB, TVINFO_TMDB, TVINFO_TVMAZE, TVINFO_TRAKT, TVINFO_IMDB, \
|
from sickgear.indexers.indexer_config import TVINFO_TVDB, TVINFO_TMDB, TVINFO_TVMAZE, TVINFO_TRAKT, TVINFO_IMDB, \
|
||||||
TVINFO_TRAKT_SLUG
|
TVINFO_TVDB_SLUG, TVINFO_TRAKT_SLUG
|
||||||
from lib.tvinfo_base import TVInfoPerson as TVInfoPerson_lib, TVInfoImage as TVInfoImage_lib, \
|
from lib.tvinfo_base import TVInfoPerson as TVInfoPerson_lib, TVInfoImage as TVInfoImage_lib, \
|
||||||
TVInfoSocialIDs as TVInfoSocialIDs_lib, TVInfoCharacter as TVInfoCharacter_lib, TVInfoShow as TVInfoShow_lib, \
|
TVInfoSocialIDs as TVInfoSocialIDs_lib, TVInfoCharacter as TVInfoCharacter_lib, TVInfoShow as TVInfoShow_lib, \
|
||||||
TVInfoIDs as TVInfoIDs_lib, CastList as CastList_lib, CrewList as CrewList_lib, \
|
TVInfoIDs as TVInfoIDs_lib, CastList as CastList_lib, CrewList as CrewList_lib, \
|
||||||
|
@ -29,7 +29,6 @@ from lib.tvinfo_base import TVInfoPerson as TVInfoPerson_lib, TVInfoImage as TVI
|
||||||
from tvinfo_base import TVInfoPerson, TVInfoImage, TVInfoSocialIDs, TVInfoCharacter, TVInfoShow, TVInfoIDs, CastList, \
|
from tvinfo_base import TVInfoPerson, TVInfoImage, TVInfoSocialIDs, TVInfoCharacter, TVInfoShow, TVInfoIDs, CastList, \
|
||||||
CrewList, RoleTypes, TVInfoEpisode, TVInfoSeason, TVInfoNetwork
|
CrewList, RoleTypes, TVInfoEpisode, TVInfoSeason, TVInfoNetwork
|
||||||
import requests
|
import requests
|
||||||
from lib.api_tvdb.tvdb_api import Tvdb
|
|
||||||
|
|
||||||
# noinspection PyUnreachableCode
|
# noinspection PyUnreachableCode
|
||||||
if False:
|
if False:
|
||||||
|
@ -100,15 +99,9 @@ def _mock_post(*args, **kwargs):
|
||||||
resp = requests.Response()
|
resp = requests.Response()
|
||||||
resp.status_code = 200
|
resp.status_code = 200
|
||||||
resp._content = ''
|
resp._content = ''
|
||||||
resp.encoding = 'UTF-8'
|
|
||||||
resp.headers['Content-Type'] = 'text/html; charset=utf-8'
|
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|
||||||
def _mock_get_new_token(*args, **kwargs):
|
|
||||||
return {'token': 'testtoken', 'datetime': datetime.datetime.now()}
|
|
||||||
|
|
||||||
|
|
||||||
browse_start_date_filename = os.path.join(mock_data_dir, 'browse_start_date.data')
|
browse_start_date_filename = os.path.join(mock_data_dir, 'browse_start_date.data')
|
||||||
if disable_content_creation:
|
if disable_content_creation:
|
||||||
with open(browse_start_date_filename, 'rt', encoding='UTF-8') as f:
|
with open(browse_start_date_filename, 'rt', encoding='UTF-8') as f:
|
||||||
|
@ -213,7 +206,7 @@ def _property_type_checker(obj, checked_objs=None):
|
||||||
('social_ids', (TVInfoSocialIDs, TVInfoSocialIDs_lib), None),
|
('social_ids', (TVInfoSocialIDs, TVInfoSocialIDs_lib), None),
|
||||||
('characters', list, (TVInfoCharacter, TVInfoCharacter_lib)),
|
('characters', list, (TVInfoCharacter, TVInfoCharacter_lib)),
|
||||||
('name', str, None),
|
('name', str, None),
|
||||||
('id', (int, NoneType), None),
|
('id', int, None),
|
||||||
('image', (str, NoneType), None),
|
('image', (str, NoneType), None),
|
||||||
('thumb_url', (str, NoneType), None),
|
('thumb_url', (str, NoneType), None),
|
||||||
('gender', (int, NoneType), None),
|
('gender', (int, NoneType), None),
|
||||||
|
@ -434,7 +427,7 @@ def _property_type_checker(obj, checked_objs=None):
|
||||||
('lastupdatedby', (int, str, NoneType), None),
|
('lastupdatedby', (int, str, NoneType), None),
|
||||||
('airsafterseason', (int, NoneType), None),
|
('airsafterseason', (int, NoneType), None),
|
||||||
('airsbeforeseason', (int, NoneType), None),
|
('airsbeforeseason', (int, NoneType), None),
|
||||||
('airsbeforeepisode', (int, NoneType), None),
|
('airsbeforeepisode', (bool, NoneType), None),
|
||||||
('imdb_id', (str, NoneType), None),
|
('imdb_id', (str, NoneType), None),
|
||||||
('contentrating', (str, NoneType), None),
|
('contentrating', (str, NoneType), None),
|
||||||
('thumbadded', (str, NoneType), None),
|
('thumbadded', (str, NoneType), None),
|
||||||
|
@ -483,7 +476,7 @@ def _compare_helper(obj_a, obj_b):
|
||||||
|
|
||||||
|
|
||||||
person_tests = [
|
person_tests = [
|
||||||
# {'p_id': 346941, 'tvid': TVINFO_TVDB}, # Katherine McNamara
|
{'p_id': 346941, 'tvid': TVINFO_TVDB}, # Katherine McNamara
|
||||||
{'p_id': 968006, 'tvid': TVINFO_TMDB}, # Katherine McNamara
|
{'p_id': 968006, 'tvid': TVINFO_TMDB}, # Katherine McNamara
|
||||||
{'p_id': 15776, 'tvid': TVINFO_TVMAZE}, # Katherine McNamara
|
{'p_id': 15776, 'tvid': TVINFO_TVMAZE}, # Katherine McNamara
|
||||||
{'p_id': 260345, 'tvid': TVINFO_TRAKT}, # Katherine McNamara
|
{'p_id': 260345, 'tvid': TVINFO_TRAKT}, # Katherine McNamara
|
||||||
|
@ -501,9 +494,10 @@ search_tests = [
|
||||||
{'kwargs': {'name': 'Shadowhunters'}, 'search_tvid': TVINFO_TVDB}, # Shadowhunters
|
{'kwargs': {'name': 'Shadowhunters'}, 'search_tvid': TVINFO_TVDB}, # Shadowhunters
|
||||||
{'kwargs': {'name': 'Wednesday'}, 'search_tvid': TVINFO_TVDB}, # Shadowhunters
|
{'kwargs': {'name': 'Wednesday'}, 'search_tvid': TVINFO_TVDB}, # Shadowhunters
|
||||||
{'kwargs': {'ids': {TVINFO_TVDB: 295837}}, 'search_tvid': TVINFO_TVDB}, # Shadowhunters
|
{'kwargs': {'ids': {TVINFO_TVDB: 295837}}, 'search_tvid': TVINFO_TVDB}, # Shadowhunters
|
||||||
# {'kwargs': {'ids': {TVINFO_IMDB: 4145054}}, 'search_tvid': TVINFO_TVDB}, # Shadowhunters
|
{'kwargs': {'ids': {TVINFO_IMDB: 4145054}}, 'search_tvid': TVINFO_TVDB}, # Shadowhunters
|
||||||
# {'kwargs': {'ids': {TVINFO_TMDB: 119051}}, 'search_tvid': TVINFO_TVDB}, # Wednesday
|
{'kwargs': {'ids': {TVINFO_TMDB: 119051}}, 'search_tvid': TVINFO_TVDB}, # Wednesday
|
||||||
# {'kwargs': {'ids': {TVINFO_TVMAZE: 53647}}, 'search_tvid': TVINFO_TVDB}, # Wednesday
|
{'kwargs': {'ids': {TVINFO_TVMAZE: 53647}}, 'search_tvid': TVINFO_TVDB}, # Wednesday
|
||||||
|
{'kwargs': {'ids': {TVINFO_TVDB_SLUG: 'walker-independence'}}, 'search_tvid': TVINFO_TVDB}, # Walker: Independence
|
||||||
# trakt tests
|
# trakt tests
|
||||||
{'kwargs': {'name': 'Shadowhunters'}, 'search_tvid': TVINFO_TRAKT}, # Shadowhunters
|
{'kwargs': {'name': 'Shadowhunters'}, 'search_tvid': TVINFO_TRAKT}, # Shadowhunters
|
||||||
{'kwargs': {'name': 'Wednesday'}, 'search_tvid': TVINFO_TRAKT}, # Shadowhunters
|
{'kwargs': {'name': 'Wednesday'}, 'search_tvid': TVINFO_TRAKT}, # Shadowhunters
|
||||||
|
@ -530,10 +524,10 @@ search_tests = [
|
||||||
person_search_tests = [
|
person_search_tests = [
|
||||||
# tvdb tests
|
# tvdb tests
|
||||||
{'kwargs': {'name': 'Katherine McNamara'}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
{'kwargs': {'name': 'Katherine McNamara'}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
||||||
# {'kwargs': {'ids': {TVINFO_TVDB: 346941}}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
{'kwargs': {'ids': {TVINFO_TVDB: 346941}}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
||||||
# {'kwargs': {'ids': {TVINFO_IMDB: 3031063}}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
{'kwargs': {'ids': {TVINFO_IMDB: 3031063}}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
||||||
# {'kwargs': {'ids': {TVINFO_TMDB: 968006}}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
{'kwargs': {'ids': {TVINFO_TMDB: 968006}}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
||||||
# {'kwargs': {'ids': {TVINFO_TVMAZE: 15776}}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
{'kwargs': {'ids': {TVINFO_TVMAZE: 15776}}, 'search_tvid': TVINFO_TVDB}, # Katherine McNamara
|
||||||
# trakt tests
|
# trakt tests
|
||||||
{'kwargs': {'name': 'Katherine McNamara'}, 'search_tvid': TVINFO_TRAKT}, # Katherine McNamara
|
{'kwargs': {'name': 'Katherine McNamara'}, 'search_tvid': TVINFO_TRAKT}, # Katherine McNamara
|
||||||
# {'kwargs': {'ids': {TVINFO_TVDB: 346941}}, 'search_tvid': TVINFO_TRAKT}, # Katherine McNamara
|
# {'kwargs': {'ids': {TVINFO_TVDB: 346941}}, 'search_tvid': TVINFO_TRAKT}, # Katherine McNamara
|
||||||
|
@ -586,7 +580,6 @@ class TVInfoTests(test.SickbeardTestDBCase):
|
||||||
datetime.datetime = _FakeDateTime
|
datetime.datetime = _FakeDateTime
|
||||||
requests.sessions.Session.get = _mock_get
|
requests.sessions.Session.get = _mock_get
|
||||||
if disable_content_creation:
|
if disable_content_creation:
|
||||||
Tvdb.get_new_token = _mock_get_new_token
|
|
||||||
requests.sessions.Session.post = _mock_post
|
requests.sessions.Session.post = _mock_post
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
Loading…
Reference in a new issue