Code cleanup and bugfixes

This commit is contained in:
echel0n 2014-03-10 19:32:02 -07:00
parent c9ddd633ee
commit bbf9491943
17 changed files with 66 additions and 46 deletions

View File

@ -116,7 +116,7 @@
<input type="hidden" id="sbRoot" value="$sbRoot" />
<table id="showListTable" class="sickbeardTable tablesorter" cellspacing="1" border="0" cellpadding="0">
<thead><tr><th>Airdate</th><th>Show</th><th class="nowrap">Next Ep</th><th>Next Ep Name</th><th>Network</th><th>Quality</th><th>IMDb</th><th>tvDB</th><th>Search</th></tr></thead>
<thead><tr><th>Airdate</th><th>Show</th><th class="nowrap">Next Ep</th><th>Next Ep Name</th><th>Network</th><th>Quality</th><th>IMDb</th><th>Indexer</th><th>Search</th></tr></thead>
<tbody>
#for $cur_result in $sql_results:
@ -167,7 +167,11 @@
<a href="http://www.imdb.com/title/${cur_result["imdb_id"]}" onclick="window.open(this.href, '_blank'); return false;" title="http://www.imdb.com/title/${cur_result["imdb_id"]}"><img alt="[imdb]" height="16" width="16" src="$sbRoot/images/imdb.png" />
#end if
</td>
<td align="center"><a href="http://thetvdb.com/?tab=series&amp;id=${cur_result["showid"]}" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://thetvdb.com/?tab=series&amp;id=${cur_result["showid"]}"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" /></a></td>
#if 'Tvdb' in $cur_result["indexer"]:
<td align="center"><a href="http://thetvdb.com/?tab=series&amp;id=${cur_result["showid"]}" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://thetvdb.com/?tab=series&amp;id=${cur_result["showid"]}"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" /></a></td>
#else
<td align="center"><a href="http://tvrage.com/$[cur_result["show_name"]]" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://tvrage.com/${cur_result["show_name"]}"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" /></a></td>
#end if
<td align="center">
<a href="$sbRoot/home/searchEpisode?show=${cur_result["showid"]}&amp;season=$cur_result["season"]&amp;episode=$cur_result["episode"]" title="Manual Search" id="forceUpdate-${cur_result["showid"]}" class="forceUpdate epSearch"><img alt="[search]" height="16" width="16" src="$sbRoot/images/search32.png" id="forceUpdateImage-${cur_result["showid"]}" /></a>
</td>
@ -302,8 +306,12 @@
<span class="tvshowTitleIcons">
#if $cur_result["imdb_id"]:
<a href="http://www.imdb.com/title/${cur_result["imdb_id"]}" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://www.imdb.com/title/${cur_result["imdb_id"]}"><img alt="[imdb]" height="16" width="16" src="$sbRoot/images/imdb.png" />
#end if
<a href="http://thetvdb.com/?tab=series&amp;id=${cur_result["showid"]}" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://thetvdb.com/?tab=series&amp;id=${cur_result["showid"]}"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" /></a>
#end if
#if "Tvdb" in $cur_result["indexer"]:
<a href="http://thetvdb.com/?tab=series&amp;id=${cur_result["showid"]}" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://thetvdb.com/?tab=series&amp;id=${cur_result["showid"]}"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" /></a>
#else
<a href="http://tvrage.com/$[cur_result["show_name"]]" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://tvrage.com/${cur_result["show_name"]}"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" /></a>
#end if
<span><a href="$sbRoot/home/searchEpisode?show=${cur_result["showid"]}&amp;season=$cur_result["season"]&amp;episode=$cur_result["episode"]" title="Manual Search" id="forceUpdate-${cur_result["showid"]}" class="epSearch forceUpdate"><img alt="[search]" height="16" width="16" src="$sbRoot/images/search32.png" id="forceUpdateImage-${cur_result["showid"]}" /></a></span>
</span>
</div>

View File

@ -50,13 +50,21 @@
- $show.genre[1:-1].replace('|',' | ')
#end if
<span class="tvshowLink" style="vertical-align: text-top">
#if "Tvdb" in $show.indexer
<a href="http://www.thetvdb.com/?tab=series&amp;id=$show.indexerid" onclick="window.open(this.href, '_blank'); return false;" title="http://www.thetvdb.com/?tab=series&amp;id=$show.indexerid"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" style="margin-top: -1px;"/></a>
#else
<a href="http://www.tvrage.com/$show.name" onclick="window.open(this.href, '_blank'); return false;" title="http://www.tvrage.com/$show.name"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" style="margin-top: -1px;"/></a>
#end if
</span>
#else
<img src="$sbRoot/images/flags/${$show.imdb_info['country_codes']}.png" width="16" height="11" style="margin-top: 3px; margin-left: 3px" /> ($show.imdb_info['year']) - $show.imdb_info['runtimes'] min - $show.imdb_info['genres'].replace('|',' | ')
<span class="tvshowLink" style="vertical-align: text-top">
<a href="http://www.imdb.com/title/$show.imdbid" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://www.imdb.com/title/$show.imdbid"><img alt="[imdb]" height="16" width="16" src="$sbRoot/images/imdb.png" style="margin-top: -1px;"/>
#if "Tvdb" in $show.indexer
<a href="http://www.thetvdb.com/?tab=series&amp;id=$show.indexerid" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://www.thetvdb.com/?tab=series&amp;id=$show.indexerid"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" style="margin-top: -1px;"/></a>
#else
<a href="http://www.tvrage.com/$show.name" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href, '_blank'); return false;" title="http://www.tvrage.com/$show.name"><img alt="[tvdb]" height="16" width="16" src="$sbRoot/images/thetvdb16.png" style="margin-top: -1px;"/></a>
#end if
</span>
#end if
@ -249,7 +257,7 @@
<input type="text" placeholder="<%=str(dfltSeas) + 'x' + str(dfltEpis)%>" size="6" maxlength="8"
class="sceneSeasonXEpisode" data-for-season="$epResult["season"]" data-for-episode="$epResult["episode"]"
id="sceneSeasonXEpisode_$show.indexerid<%="_"+str(epResult["season"])+"_"+str(epResult["episode"])%>"
title="Change the value here if scene numbering differs from tvdb episode numbering"
title="Change the value here if scene numbering differs from the indexer episode numbering"
#if $dfltEpNumbering:
value=""
#else

View File

@ -22,7 +22,7 @@
<!--
\$(document).ready(function(){
\$.getJSON('$sbRoot/home/addShows/getTVDBLanguages', {}, function(data) {
\$.getJSON('$sbRoot/home/addShows/getIndexerLanguages', {}, function(data) {
var resultStr = '';
if (data.results.length == 0) {
@ -47,7 +47,7 @@
resultStr += '<option value="$show.lang" selected="selected">$show.lang</option>';
}
\$('#tvdbLangSelect').html(resultStr)
\$('#indexerLangSelect').html(resultStr)
});
@ -95,7 +95,7 @@
<br />
<br />
<b>Info Language:</b> <select name="tvdbLang" id="tvdbLangSelect"></select><br />
<b>Info Language:</b> <select name="indexerLang" id="indexerLangSelect"></select><br />
Note: This will only affect the language of the retrieved metadata file contents and episode filenames.<br />
This <b>DOES NOT</b> allow Sick Beard to download non-english TV episodes!<br />
<br />

View File

@ -23,7 +23,7 @@
<div class="button"><img src="$sbRoot/images/add-new32.png" height="32" width="32" alt="Add New Show"/></div>
<div class="buttontext">
<h2>Add New Show</h2>
<p>For shows that you haven't downloaded yet, this option finds a show on theTVDB.com, creates a directory for its episodes, and adds it to Sick Beard.</p>
<p>For shows that you haven't downloaded yet, this option finds a show on theTVDB.com and TVRage.com, creates a directory for its episodes, and adds it to Sick Beard.</p>
</div>
</a>

View File

@ -28,9 +28,9 @@
<td><input type="checkbox" id="$show_id" class="dirCheck" checked=checked></td>
<td><label for="$show_id">$curDir['display_dir']</label></td>
#if 'Tvdb' in $indexer
<td>#if $curDir['existing_info'][0] and $curDir['existing_info'][1] then '<a href="http://thetvdb.com/?tab=series&id='+$str($curDir['existing_info'][0])+'">'+$curDir['existing_info'][1]+'</a>' else "?"#</td>
<td>#if $curDir['existing_info'][0] and $curDir['existing_info'][1] then '<a href="http://thetvdb.com/?tab=series&id='+$str($curDir['existing_info'][0])+'">'+$curDir['existing_info'][1]+'</a>' else "?"#</td>
#elif 'TVRage' in $indexer
<td>#if $curDir['existing_info'][1] then '<a href="http://tvrage.com/'+$str($curDir['existing_info'][1])+'">'+$curDir['existing_info'][1]+'</a>' else "?"#</td>
<td>#if $curDir['existing_info'][1] then '<a href="http://tvrage.com/'+$str($curDir['existing_info'][1])+'">'+$curDir['existing_info'][1]+'</a>' else "?"#</td>
#else
<td>$curDir['existing_info'][1]</td>
#end if

View File

@ -27,17 +27,21 @@
<form id="addShowForm" method="post" action="$sbRoot/home/addShows/addNewShow" accept-charset="utf-8">
<fieldset class="sectionwrap">
<legend class="legendStep">Find a show on the TVDB</legend>
<legend class="legendStep">Find a show on the TVDB and TVRAGE</legend>
<div class="stepDiv">
#if $use_provided_info:
Show retrieved from existing metadata: <a href="http://thetvdb.com/?tab=series&id=$provided_indexer_id">$provided_indexer_name</a>
<input type="hidden" name="tvdbLang" value="en" />
#if 'Tvdb' in $provided_indexer
Show retrieved from existing metadata: <a href="http://thetvdb.com/?tab=series&id=$provided_indexer_id">$provided_indexer_name</a>
#else
Show retrieved from existing metadata: <a href="http://tvrage.com/$provided_indexer_name">$provided_indexer_name</a>
#end if
<input type="hidden" name="indexerLang" value="en" />
<input type="hidden" name="whichSeries" value="$provided_indexer_id" />
<input type="hidden" id="providedName" value="$provided_indexer_name" />
#else:
<input type="text" id="nameToSearch" value="$default_show_name" style="margin-top: 1px;" />
<select name="tvdbLang" id="tvdbLangSelect" style="height: 26px;margin-top: 1px;">
<select name="indexerLang" id="indexerLangSelect" style="height: 26px;margin-top: 1px;">
<option value="en" selected="selected">en</option>
</select><b>*</b>
<input class="btn" type="button" id="searchName" value="Search" style="margin-top: -3px;" /><br /><br />

View File

@ -5,8 +5,8 @@ $(document).ready(function () {
return;
}
if ($('#tvdbLangSelect option').length <= 1) {
$.getJSON(sbRoot + '/home/addShows/getTVDBLanguages', {}, function (data) {
if ($('#indexerLangSelect option').length <= 1) {
$.getJSON(sbRoot + '/home/addShows/getIndexerLanguages', {}, function (data) {
var selected, resultStr = '';
if (data.results.length === 0) {
@ -23,8 +23,8 @@ $(document).ready(function () {
});
}
$('#tvdbLangSelect').html(resultStr);
$('#tvdbLangSelect').change(function () { searchIndexers(); });
$('#indexerLangSelect').html(resultStr);
$('#indexerLangSelect').change(function () { searchIndexers(); });
});
}
}
@ -36,7 +36,7 @@ $(document).ready(function () {
$('#searchResults').html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32.gif" height="32" width="32" /> searching...');
$.getJSON(sbRoot + '/home/addShows/searchIndexersForShowName', {'name': $('#nameToSearch').val(), 'lang': $('#tvdbLangSelect').val()}, function (data) {
$.getJSON(sbRoot + '/home/addShows/searchIndexersForShowName', {'name': $('#nameToSearch').val(), 'lang': $('#indexerLangSelect').val()}, function (data) {
var firstResult = true;
var resultStr = '<fieldset>\n<legend>Search Results:</legend>\n';
var checked = '';

View File

@ -197,9 +197,9 @@ class ImageCache:
return True
def _cache_image_from_tvdb(self, show_obj, img_type):
def _cache_image_from_indexer(self, show_obj, img_type):
"""
Retrieves an image of the type specified from TVDB and saves it to the cache folder
Retrieves an image of the type specified from indexer and saves it to the cache folder
returns: bool representing success
@ -224,7 +224,7 @@ class ImageCache:
logger.log(u"Invalid cache image type: "+str(img_type), logger.ERROR)
return False
# retrieve the image from TVDB using the generic metadata class
# retrieve the image from indexer using the generic metadata class
#TODO: refactor
metadata_generator = GenericMetadata()
img_data = metadata_generator._retrieve_show_image(img_type_name, show_obj)
@ -235,7 +235,7 @@ class ImageCache:
def fill_cache(self, show_obj):
"""
Caches all images for the given show. Copies them from the show dir if possible, or
downloads them from TVDB if they aren't in the show dir.
downloads them from indexer if they aren't in the show dir.
show_obj: TVShow object to cache images for
"""
@ -274,11 +274,11 @@ class ImageCache:
except exceptions.ShowDirNotFoundException:
logger.log(u"Unable to search for images in show dir because it doesn't exist", logger.WARNING)
# download from TVDB for missing ones
# download from indexer for missing ones
for cur_image_type in [self.POSTER, self.BANNER, self.POSTER_THUMB, self.BANNER_THUMB]:
logger.log(u"Seeing if we still need an image of type "+str(cur_image_type)+": "+str(need_images[cur_image_type]), logger.DEBUG)
if cur_image_type in need_images and need_images[cur_image_type]:
self._cache_image_from_tvdb(show_obj, cur_image_type)
self._cache_image_from_indexer(show_obj, cur_image_type)
logger.log(u"Done cache check")

View File

@ -326,7 +326,7 @@ class GenericMetadata():
def _get_episode_thumb_url(self, ep_obj):
"""
Returns the URL to use for downloading an episode's thumbnail. Uses
theTVDB.com data.
theTVDB.com and TVRage.com data.
ep_obj: a TVEpisode object for which to grab the thumb URL
"""
@ -702,7 +702,7 @@ class GenericMetadata():
def _retrieve_show_image(self, image_type, show_obj, which=None):
"""
Gets an image URL from theTVDB.com, downloads it and returns the data.
Gets an image URL from theTVDB.com and TVRage.com, downloads it and returns the data.
image_type: type of image to retrieve (currently supported: fanart, poster, banner)
show_obj: a TVShow object to use when searching for the image
@ -791,7 +791,7 @@ class GenericMetadata():
result[season] = {}
# find the correct season in the tvdb object and just copy the dict into our result dict
# find the correct season in the TVDB and TVRAGE object and just copy the dict into our result dict
for seasonArtID in seasonsArtObj.keys():
if int(seasonsArtObj[seasonArtID]['season']) == season and seasonsArtObj[seasonArtID]['language'] == 'en':
result[season][seasonArtID] = seasonsArtObj[seasonArtID]['_bannerpath']
@ -838,7 +838,7 @@ class GenericMetadata():
result[season] = {}
# find the correct season in the tvdb object and just copy the dict into our result dict
# find the correct season in the TVDB and TVRAGE object and just copy the dict into our result dict
for seasonArtID in seasonsArtObj.keys():
if int(seasonsArtObj[seasonArtID]['season']) == season and seasonsArtObj[seasonArtID]['language'] == 'en':
result[season][seasonArtID] = seasonsArtObj[seasonArtID]['_bannerpath']

View File

@ -24,7 +24,7 @@ def addNameToCache(name, indexer_id):
Adds the show & tvdb id to the scene_names table in cache.db.
name: The show name to cache
indexer_id: The tvdb id that this show should be cached with (can be None/0 for unknown)
indexer_id: the TVDB and TVRAGE id that this show should be cached with (can be None/0 for unknown)
"""
# standardize the name we're using to account for small differences in providers
@ -42,7 +42,7 @@ def retrieveNameFromCache(name):
name: The show name to look up.
Returns: the tvdb id that resulted from the cache lookup or None if the show wasn't found in the cache
Returns: the TVDB and TVRAGE id that resulted from the cache lookup or None if the show wasn't found in the cache
"""
# standardize the name we're using to account for small differences in providers

View File

@ -257,7 +257,7 @@ class NameParser(object):
return final_result
@classmethod
def series_name_to_indexer_id(cls, series_name, check_scene_exceptions=True, check_database=True, check_tvdb=False):
def series_name_to_indexer_id(cls, series_name, check_scene_exceptions=True, check_database=True, check_indexer=False):
"""
Given a series name, return it's tvdbd_id.
Returns None if not found.
@ -283,7 +283,7 @@ class NameParser(object):
if db_result: return db_result[1]
# see if we can find the name with a TVDB lookup
if check_tvdb:
if check_indexer:
for cur_name in name_list:
try:
t = indexer_api.indexerApi(custom_ui=sickbeard.classes.ShowListUI, **sickbeard.INDEXER_API_PARMS)

View File

@ -53,7 +53,7 @@ def get_scene_exception_by_name(show_name):
cur_indexer_id = int(cur_exception["indexer_id"])
if show_name.lower() in (cur_exception_name.lower(), helpers.sanitizeSceneName(cur_exception_name).lower().replace('.', ' ')):
logger.log(u"Scene exception lookup got tvdb id "+str(cur_indexer_id)+u", using that", logger.DEBUG)
logger.log(u"Scene exception lookup got indexer id "+str(cur_indexer_id)+u", using that", logger.DEBUG)
return cur_indexer_id
return None

View File

@ -51,7 +51,7 @@ def get_scene_numbering(indexer_id, season, episode, fallback_to_xem=True):
"""
Returns a tuple, (season, episode), with the scene numbering (if there is one),
otherwise returns the xem numbering (if fallback_to_xem is set), otherwise
returns the tvdb numbering.
returns the TVDB and TVRAGE numbering.
(so the return values will always be set)
@param indexer_id: int
@ -91,7 +91,7 @@ def find_scene_numbering(indexer_id, season, episode):
def get_indexer_numbering(indexer_id, sceneSeason, sceneEpisode, fallback_to_xem=True):
"""
Returns a tuple, (season, episode) with the tvdb numbering for (sceneSeason, sceneEpisode)
Returns a tuple, (season, episode) with the TVDB and TVRAGE numbering for (sceneSeason, sceneEpisode)
(this works like the reverse of get_scene_numbering)
"""
if indexer_id is None or sceneSeason is None or sceneEpisode is None:

View File

@ -84,7 +84,7 @@ class ShowUpdater():
myDB = db.DBConnection()
# last_update_date <= 90 days, sorted ASC because dates are ordinal
sql_result = myDB.select("SELECT indexer_id FROM tv_shows WHERE status = 'Ended' AND last_update_tvdb <= ? ORDER BY last_update_tvdb ASC LIMIT 10;", [stale_update_date])
sql_result = myDB.select("SELECT indexer_id FROM tv_shows WHERE status = 'Ended' AND last_update_indexer <= ? ORDER BY last_update_tvdb ASC LIMIT 10;", [stale_update_date])
for cur_result in sql_result:
stale_should_update.append(cur_result['indexer_id'])

View File

@ -1987,7 +1987,7 @@ class TVEpisode(object):
(self.season, self.episode) = sickbeard.scene_numbering.get_scene_numbering(indexer_id, self.season, self.episode)
def convertToTVDB(self):
def convertToIndexer(self):
if self.show.air_by_date: return
if self.season is None: return # can't work without a season

View File

@ -244,7 +244,7 @@ class TVCache():
else:
# check the name cache and see if we already know what show this is
logger.log(u"Checking the cache to see if we already know the tvdb id of "+parse_result.series_name, logger.DEBUG)
logger.log(u"Checking the cache to see if we already know the indexer id of "+parse_result.series_name, logger.DEBUG)
indexer_id = name_cache.retrieveNameFromCache(parse_result.series_name)
# remember if the cache lookup worked or not so we know whether we should bother updating it later

View File

@ -126,7 +126,7 @@ def redirect(abspath, *args, **KWs):
raise cherrypy.HTTPRedirect(sickbeard.WEB_ROOT + abspath, *args, **KWs)
class TVDBWebUI:
class IndexerWebUI:
def __init__(self, config, log=None):
self.config = config
self.log = log
@ -1845,7 +1845,7 @@ class HomePostProcess:
return _munge(t)
@cherrypy.expose
def processEpisode(self, dir=None, nzbName=None, jobName=None, quiet=None, process_method=None, force=None, is_priority=None, failed="0", type="auto", indexer="Tvdb"):
def processEpisode(self, dir=None, nzbName=None, jobName=None, quiet=None, process_method=None, force=None, is_priority=None, failed="0", type="auto", indexer="auto"):
if failed == "0":
failed = False
@ -1883,7 +1883,7 @@ class NewHomeAddShows:
return _munge(t)
@cherrypy.expose
def getTVDBLanguages(self):
def getIndexerLanguages(self):
result = indexer_api.indexerApi().config['valid_languages']
# Make sure list is sorted alphabetically but 'en' is in front
@ -2120,7 +2120,7 @@ class NewHomeAddShows:
return _munge(t)
@cherrypy.expose
def addNewShow(self, whichSeries=None, tvdbLang="en", rootDir=None, defaultStatus=None,
def addNewShow(self, whichSeries=None, indexerLang="en", rootDir=None, defaultStatus=None,
anyQualities=None, bestQualities=None, flatten_folders=None, subtitles=None,
fullShowPath=None, other_shows=None, skipShow=None):
"""
@ -2201,7 +2201,7 @@ class NewHomeAddShows:
newQuality = Quality.combineQualities(map(int, anyQualities), map(int, bestQualities))
# add the show
sickbeard.showQueueScheduler.action. addShow(indexer, indexer_id, show_dir, int(defaultStatus), newQuality, flatten_folders, subtitles, tvdbLang) # @UndefinedVariable
sickbeard.showQueueScheduler.action. addShow(indexer, indexer_id, show_dir, int(defaultStatus), newQuality, flatten_folders, subtitles, indexerLang) # @UndefinedVariable
ui.notifications.message('Show added', 'Adding the specified show into ' + show_dir)
return finishAddShow()
@ -2801,7 +2801,7 @@ class Home:
return result['description'] if result else 'Episode not found.'
@cherrypy.expose
def editShow(self, show=None, location=None, anyQualities=[], bestQualities=[], exceptions_list=[], flatten_folders=None, paused=None, directCall=False, air_by_date=None, dvdorder=None, tvdbLang=None, subtitles=None):
def editShow(self, show=None, location=None, anyQualities=[], bestQualities=[], exceptions_list=[], flatten_folders=None, paused=None, directCall=False, air_by_date=None, dvdorder=None, indexerLang=None, subtitles=None):
if show == None:
errString = "Invalid show ID: " + str(show)