mirror of
https://github.com/SickGear/SickGear.git
synced 2024-12-03 18:03:37 +00:00
6fcf80c02d
Add "Maximum fanart image files per show to cache" to config General/Interface. Add populate images when the daily show updater is run with a default maximum 3 images per show. Change force full update in a show will replace existing images with new. Add fanart livepanel to lower right of Episodes View and Display Show page. Add highlight panel red until button is clicked a few times. Add flick through multiple background images on Episodes View and Display Show page. Add persistent move poster image to right hand side or hide on Display Show page (multi-click the eye). Add persistent translucency of background images on Episodes View and Display Show page. Add persistent fanart rating to avoid art completely, random display, random from a group, or display fave always. Add persistent views of the show detail on Display Show page. Add persistent views on Episodes View. Add persistent button to collapse and expand card images on Episode View/Layout daybyday. Add non persistent "Open gear" and "Full fanart" image views to Episodes View and Display Show page. Add "smart" selection of fanart image to display on Episode view. Change insert [!] and change text shade of ended shows in drop down show list on Display Show page. Change button graphic for next and previous show of show list on Display Show page. Add logic to hide some livepanel buttons until artwork becomes available or in other circumstances. Add "(Ended)" where appropriate to show title on Display Show page. Add links to fanart.tv where appropriate on Display Show page. Change use tense for label "Airs" or "Aired" depending on if show ended. Change display "No files" instead of "0 files" and "Upgrade once" instead of "End upgrade on first match". Add persistent button to newest season to "Show all" episodes. Add persistent button to all shown seasons to "Hide most" episodes. Add button to older seasons to toggle "Show Season n" or "Show Specials" with "Hide..." episodes. Add season level status counts next to each season header on display show page Add sorting to season table headers on display show page Add filename and size to quality badge on display show page, removed its redundant "downloaded" text Remove redundant "Add show" buttons Change combine the NFO and TBN columns into a single Meta column Change reduce screen estate used by episode numbers columns Change improve clarity of text on Add Show page. Add "Reset fanart ratings" to show Edit/Other tab. Add fanart usage to show Edit/Other tab. Add fanart keys guide to show Edit/Other tab. Change add placeholder tip to "Alternative release name(s)" on show Edit. Change add placeholder tip to search box on shows Search. Change hide Anime tips on show Edit when selecting its mutually exclusive options. Change label "End upgrade on first match" to "Upgrade once" on show Edit. Change improve performance rendering displayShow. Add total episodes to start of show description (excludes specials if those are hidden). Add "Add show" actions i.e. "Search", "Trakt cards", "IMDb cards", and "Anime" to Shows menu. Add "Import (existing)" action to Tools menu. Change SD quality from red to dark green, 2160p UHD 4K is red. Change relocate the functions of Logs & Errors to the right side Tools menu -> View Log File. Add warning indicator to the Tools menu in different colour depending on error count (green through red). Change View Log error item output from reversed to natural order. Change View Log add a typeface and some colour to improve readability. Change View Log/Errors only display "Clear Errors" button when there are errors to clear. Change improve performance of View Log File.
902 lines
37 KiB
Cheetah
902 lines
37 KiB
Cheetah
#import sickbeard
|
|
#import datetime
|
|
#import re
|
|
#from sickbeard.common import *
|
|
#from sickbeard import sbdatetime
|
|
#from sickbeard.helpers import anon_url
|
|
#from sickbeard.indexers.indexer_config import INDEXER_TVDB, INDEXER_IMDB
|
|
<% def sg_var(varname, default=False): return getattr(sickbeard, varname, default) %>#slurp#
|
|
<% def sg_str(varname, default=''): return getattr(sickbeard, varname, default) %>#slurp#
|
|
##
|
|
#set global $title = 'Episode View'
|
|
#set global $header = 'Episode View'
|
|
#set global $sbPath = '..'
|
|
#set global $topmenu = 'episodeView'
|
|
#set $css = $getVar('css', '')
|
|
#set $has_art = $getVar('has_art', None)
|
|
#set $restart = 'Restart SickGear for new features on this page'
|
|
#set $show_message = (None, $restart)[not $varExists('fanart')]
|
|
#set global $page_body_attr = 'episode-view" class="' + $css
|
|
##
|
|
#import os.path
|
|
#include $os.path.join($sg_str('PROG_DIR'), 'gui/slick/interfaces/default/inc_top.tmpl')
|
|
|
|
<script>
|
|
<!--
|
|
var config = {hasArt: #echo ('!0', '!1')[not $has_art]#}
|
|
//-->
|
|
</script>
|
|
|
|
#set $sort = $sg_var('EPISODE_VIEW_SORT')
|
|
#set $table_sort_header_codes = {'time': 0, 'show': 1, 'network': 4}
|
|
#if $sort not in $table_sort_header_codes
|
|
#set $sort = 'time'
|
|
#end if
|
|
|
|
#if $layout in ['daybyday', 'list']
|
|
<script type="text/javascript" src="$sbRoot/js/plotTooltip.js?v=$sbPID"></script>
|
|
#end if
|
|
|
|
#if 'daybyday' != $layout
|
|
<script type="text/javascript" src="$sbRoot/js/ajaxEpSearch.js?v=$sbPID"></script>
|
|
<input type="hidden" id="sbRoot" value="$sbRoot" />
|
|
#else
|
|
<script>
|
|
<!--
|
|
#raw
|
|
$(document).ready(function(){
|
|
$('#Carousel div[title], #Carousel span[title]').tooltip({placement: 'top', html: !0});
|
|
|
|
$.sgDayContainer = [];
|
|
$.each($('[id^=day]'), function(){$.sgDayContainer.push($('#' + $(this).attr('id')))});
|
|
|
|
jQuery.each($.sgDayContainer, function(j) {
|
|
this.isotope({
|
|
itemSelector: '.daybyday-show',
|
|
sortBy: '$sort',
|
|
layoutMode: 'vertical',
|
|
transitionDuration: 0,
|
|
getSortData: {
|
|
network: function(itemElem) {
|
|
return $(itemElem).attr('data-network') || '';
|
|
},
|
|
showname: function(itemElem) {
|
|
return $(itemElem).attr('data-name') || '';
|
|
},
|
|
season: function(itemElem) {
|
|
var season = $(itemElem).attr('data-season') || '0';
|
|
return season.length && parseInt(season, 10);
|
|
},
|
|
episode: function(itemElem) {
|
|
var episode = $(itemElem).attr('data-episode') || '0';
|
|
return episode.length && parseInt(episode, 10);
|
|
},
|
|
time: function(itemElem) {
|
|
var time = $(itemElem).attr('data-time') || '0';
|
|
return time.length && parseInt(time, 10);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
imagesLoaded('.daybyday-show', function() {
|
|
jQuery.each($.sgDayContainer, function(j) {
|
|
this.isotope('layout');
|
|
});
|
|
});
|
|
|
|
$.sgUiSortBy = (function(sortBy) {
|
|
var sortCriteria;
|
|
switch (sortBy) {
|
|
case 'network':
|
|
sortCriteria = ['network', 'time', 'showname', 'season', 'episode'];
|
|
break;
|
|
case 'show':
|
|
sortCriteria = ['showname', 'time', 'season', 'episode'];
|
|
break;
|
|
case 'time':
|
|
default:
|
|
sortCriteria = ['time', 'showname', 'season', 'episode'];
|
|
break;
|
|
}
|
|
jQuery.each($.sgDayContainer, function(j) {
|
|
this.isotope({
|
|
sortBy: sortCriteria,
|
|
sortAscending: 'asc' == $('#sort-dir').attr('data-sort-dir')
|
|
});
|
|
});
|
|
});
|
|
|
|
$('#sort').on('change', function() {
|
|
$.sgUiSortBy(this.value);
|
|
$.get(this.options[this.selectedIndex].getAttribute('data-sort'));
|
|
});
|
|
|
|
$('#sort-dir').on('click', function() {
|
|
var sortdir = $(this).attr('data-sort-dir'),
|
|
newdir = ('asc' == sortdir ? 'desc' : 'asc');
|
|
$(this).attr('data-sort-dir', newdir);
|
|
$(this).attr('title', 'Click to sort ' + sortdir + 'ending');
|
|
$(this).removeClass(sortdir).addClass(newdir);
|
|
$.sgUiSortBy($('#sort').val());
|
|
});
|
|
|
|
$('.carousel').on('slide.bs.carousel', function () {
|
|
imagesLoaded('.daybyday-show', function() {
|
|
jQuery.each($.sgDayContainer, function(j) {
|
|
$(this).isotope('layout');
|
|
});
|
|
});
|
|
});
|
|
|
|
$('#card-layout').on('click', function(e) {
|
|
var states$ = $('#episode-view.daybyday'), isPortrait = states$.hasClass('portrait'),
|
|
state = isPortrait ? ['landscape', 'portrait'] : ['portrait', 'landscape'],
|
|
img = isPortrait ? ['poster', 'banner'] : ['banner', 'poster'],
|
|
old = img[0] + '_thumb', repl = img[1] + '_thumb',
|
|
cachedImg = $.SickGear.Root + '/images/' + repl + '.jpg',
|
|
tid, interval = 250, timeout = (5 * 1000)/interval;
|
|
|
|
states$.addClass(state[0]).removeClass(state[1]);
|
|
|
|
tid = setInterval(function() {
|
|
if (0 < $('.poster').find('img[src*="' + old + '"]').length) {
|
|
timeout--;
|
|
} else {
|
|
timeout = 0;
|
|
}
|
|
if (0 == timeout) {
|
|
clearInterval(tid);
|
|
$.each($('.poster').find('img[src*="' + cachedImg + '"]'), function() {
|
|
$(this).attr('src', $(this).attr('data-src-new')).removeAttr('data-src-new');
|
|
});
|
|
$.sgUiSortBy($('#sort').val());
|
|
$.get($.SickGear.Root + '/setEpisodeViewCards');
|
|
}
|
|
}, interval);
|
|
|
|
$.each($('.poster').find('img[src*="' + old + '"]'), function() {
|
|
$(this).attr('data-src-new', $(this).attr('src').replace(old, repl));
|
|
$(this).attr('src', cachedImg);
|
|
});
|
|
|
|
return !1;
|
|
});
|
|
|
|
});
|
|
#end raw
|
|
//-->
|
|
</script>
|
|
#end if
|
|
|
|
<style type="text/css">
|
|
#SubMenu{display:none}
|
|
#if 'daybyday' == $layout
|
|
.ep-caret{cursor:pointer; vertical-align:middle; margin-right:2px}
|
|
.asc{border-top:0; border-bottom:8px solid}
|
|
.desc{border-top:8px solid; border-bottom:0}
|
|
#end if
|
|
</style>
|
|
#if $show_message
|
|
|
|
<div class="alert alert-info" style="margin:-40px 0 50px">
|
|
$show_message
|
|
</div>
|
|
#end if
|
|
|
|
#if $varExists('header')
|
|
<h1 class="header" style="margin-bottom:0">$header</h1>
|
|
#else
|
|
<h1 class="title" style="margin-bottom:0">$title</h1>
|
|
#end if
|
|
|
|
#set $selected = ' selected="selected"'
|
|
<div id="HomeLayout" class="pull-right">
|
|
<div id="top-row">
|
|
<span>Layout
|
|
<select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
|
|
<option value="$sbRoot/setEpisodeViewLayout/?layout=banner" #if 'banner' == $sg_str('EPISODE_VIEW_LAYOUT')#$selected#end if#>Banner</option>
|
|
<option value="$sbRoot/setEpisodeViewLayout/?layout=daybyday" #if 'daybyday' == $sg_str('EPISODE_VIEW_LAYOUT', 'daybyday')#$selected#end if#>Day by Day</option>
|
|
<option value="$sbRoot/setEpisodeViewLayout/?layout=list" #if 'list' == $sg_str('EPISODE_VIEW_LAYOUT')#$selected#end if#>List</option>
|
|
<option value="$sbRoot/setEpisodeViewLayout/?layout=poster" #if 'poster' == $sg_str('EPISODE_VIEW_LAYOUT')#$selected#end if#>Poster</option>
|
|
</select>
|
|
</span>
|
|
|
|
<span>Sort
|
|
#if 'daybyday' == $layout
|
|
<span id="sort-dir" data-sort-dir="asc" class="caret ep-caret asc" title="Click to sort descending"> </span>
|
|
#end if
|
|
By
|
|
#if 'daybyday' == $layout
|
|
<select name="sort" id="sort" class="form-control form-control-inline input-sm">
|
|
<option value="network" data-sort="$sbRoot/setEpisodeViewSort/?sort=network&redir=0" #if 'network' == $sort#$selected#end if#>Network</option>
|
|
<option value="show" data-sort="$sbRoot/setEpisodeViewSort/?sort=show&redir=0" #if 'show' == $sort#$selected#end if#>Show</option>
|
|
<option value="time" data-sort="$sbRoot/setEpisodeViewSort/?sort=time&redir=0" #if 'time' == $sort#$selected#end if#>Time</option>
|
|
#else
|
|
<select name="sort" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;">
|
|
<option value="$sbRoot/setEpisodeViewSort/?sort=time" #if 'time' == $sort#$selected#end if#>Date/Time</option>
|
|
<option value="$sbRoot/setEpisodeViewSort/?sort=network" #if 'network' == $sort#$selected#end if#>Network</option>
|
|
<option value="$sbRoot/setEpisodeViewSort/?sort=show" #if 'show' == $sort#$selected#end if#>Show</option>
|
|
#end if
|
|
</select>
|
|
</span>
|
|
|
|
<span class="no-marginr">View Paused
|
|
<select name="viewpaused" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;" style="margin-bottom:10px">
|
|
<option value="$sbRoot/toggleEpisodeViewDisplayPaused"#if not $sg_var('EPISODE_VIEW_DISPLAY_PAUSED')#$selected#end if#>Hidden</option>
|
|
<option value="$sbRoot/toggleEpisodeViewDisplayPaused"#if $sg_var('EPISODE_VIEW_DISPLAY_PAUSED')#$selected#end if#>Shown</option>
|
|
</select>
|
|
</span>
|
|
</div>
|
|
|
|
<div class="key pull-right">
|
|
#if 'daybyday' != $layout
|
|
<b>Key:</b>
|
|
<span class="listing-key listing-overdue">Missed</span>
|
|
<span class="listing-key listing-current">Current</span>
|
|
<span class="listing-key listing-default">Future</span>
|
|
<span class="listing-key listing-toofar">Distant</span>
|
|
#end if
|
|
#if 'daybyday' == $layout
|
|
<a id="card-layout" class="btn btn-inline" name="">
|
|
<span id="landscape">
|
|
<i class="sgicon-img-landscape"></i> Collapse Cards
|
|
</span>
|
|
<span id="portrait">
|
|
<i class="sgicon-img-portrait"></i> Expand Cards
|
|
</span>
|
|
</a>
|
|
#end if
|
|
<a class="btn btn-inline forceBacklog" href="webcal://$sbHost:$sbHttpPort/calendar">
|
|
<i class="sgicon-rss"></i> Subscribe</a>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
#if 'list' == $layout
|
|
<!-- start list view //-->
|
|
|
|
<script>
|
|
<!--
|
|
#raw
|
|
$.tablesorter.addParser({
|
|
id: 'loadingNames',
|
|
is: function(s) {
|
|
return false
|
|
},
|
|
format: function(s) {
|
|
if(0 == s.indexOf('Loading...'))
|
|
return s.replace('Loading...', '000')
|
|
return (s || '')
|
|
},
|
|
type: 'text'
|
|
});
|
|
$.tablesorter.addParser({
|
|
id: 'quality',
|
|
is: function(s) {
|
|
return false
|
|
},
|
|
format: function(s) {
|
|
return s.replace('hd1080p', 5).replace('hd720p', 4).replace('hd', 3).replace('sd', 2).replace('any', 1).replace('best', 0).replace('custom', 7)
|
|
},
|
|
type: 'numeric'
|
|
});
|
|
$.tablesorter.addParser({
|
|
id: 'cDate',
|
|
is: function(s) {
|
|
return false
|
|
},
|
|
format: function(s) {
|
|
return s
|
|
},
|
|
type: 'numeric'
|
|
});
|
|
|
|
$(document).ready(function(){
|
|
|
|
sortList = [[$table_sort_header_codes[$sort], 0]];
|
|
|
|
$('#showListTable:has(tbody tr)').tablesorter({
|
|
widgets: ['stickyHeaders'],
|
|
sortList: sortList,
|
|
textExtraction: {
|
|
0: function(node) {return $(node).find('span').text().toLowerCase() || ''},
|
|
1: function(node) {return $(node).find('a').attr('data-name') || ''},
|
|
4: function(node) {return $(node).find('span').attr('data-network') || ''},
|
|
5: function(node) {return $(node).find('span').text().toLowerCase() || ''}
|
|
},
|
|
headers: {
|
|
0: {sorter: 'cDate'},
|
|
1: {sorter: 'loadingNames'},
|
|
2: {sorter: false},
|
|
3: {sorter: false},
|
|
4: {sorter: 'loadingNames'},
|
|
5: {sorter: 'quality'},
|
|
6: {sorter: false},
|
|
7: {sorter: false},
|
|
8: {sorter: false}
|
|
}
|
|
});
|
|
|
|
$('#sbRoot').ajaxEpSearch();
|
|
#end raw
|
|
|
|
#set $fuzzydate = 'airdate'
|
|
#if $sg_var('FUZZY_DATING')
|
|
fuzzyMoment({
|
|
containerClass: '.${fuzzydate}',
|
|
dateHasTime: !0,
|
|
dateFormat: '$sg_str('DATE_PRESET', '%x')',
|
|
timeFormat: '$sg_str('TIME_PRESET', '%I:%M %p')',
|
|
trimZero: #echo ('!1', '!0')[$sg_var('TRIM_ZERO')]#
|
|
});
|
|
#end if
|
|
|
|
});
|
|
//-->
|
|
</script>
|
|
|
|
#set $show_div = 'listing-default'
|
|
|
|
<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>Indexers</th>
|
|
<th>Search</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody style="text-shadow:none">
|
|
|
|
#for $cur_result in $sql_results
|
|
#set $cur_indexer = int($cur_result['indexer'])
|
|
#set $runtime = $cur_result['runtime']
|
|
#set $display_name = (re.sub('^((?:A(?!\s+to)n?)|The)\s(\w)', r'<span class="article">\1</span> \2', $cur_result['show_name']), $cur_result['show_name'])[$sg_var('SORT_ARTICLE')]
|
|
|
|
#if int($cur_result['paused']) and not $sg_var('EPISODE_VIEW_DISPLAY_PAUSED')
|
|
#continue
|
|
#end if
|
|
|
|
#set $cur_ep_airdate = $cur_result['localtime'].date()
|
|
|
|
#if $runtime
|
|
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
|
|
#if $cur_ep_enddate < $today
|
|
#set $show_div = 'listing-overdue'
|
|
#elif $cur_ep_airdate >= $next_week.date()
|
|
#set $show_div = 'listing-toofar'
|
|
#elif $cur_ep_airdate >= $today.date() and $cur_ep_airdate < $next_week.date()
|
|
#if $cur_ep_airdate == $today.date()
|
|
#set $show_div = 'listing-current'
|
|
#else
|
|
#set $show_div = 'listing-default'
|
|
#end if
|
|
#end if
|
|
#end if
|
|
|
|
#set $show_id = '%s_%sx%s' % (str($cur_result['showid']), str($cur_result['season']), str($cur_result['episode']))
|
|
<!-- start $cur_result['show_name'] //-->
|
|
<tr id="show-${show_id}" class="$show_div" data-rawname="$cur_result['show_name']">
|
|
## forced to use a div to wrap airdate, the column sort went crazy with a span
|
|
<td align="center" class="nowrap">
|
|
<div class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdatetime($cur_result['localtime']).decode($sickbeard.SYS_ENCODING)</div><span class="sort-data">$cur_result['localtime'].strftime('%Y%m%d%H%M')</span>
|
|
</td>
|
|
|
|
<td class="tvShow"><a href="$sbRoot/home/displayShow?show=${cur_result['showid']}" data-name="$cur_result['data_show_name']">$display_name</a>
|
|
#if int($cur_result['paused'])
|
|
<span class="pause">[paused]</span>
|
|
#end if
|
|
</td>
|
|
|
|
<td class="nowrap" align="center">
|
|
<%= 'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode'])) %>
|
|
</td>
|
|
|
|
<td>
|
|
#if $cur_result['description']
|
|
<img alt="" src="$sbRoot/images/info32.png" height="16" width="16" class="plotInfo" id="plot-${show_id}" />
|
|
#else
|
|
<img alt="" src="$sbRoot/images/info32.png" width="16" height="16" class="plotInfoNone opacity40" />
|
|
#end if
|
|
$cur_result['name']
|
|
</td>
|
|
|
|
<td align="center">
|
|
<span data-network="$cur_result['data_network']">$cur_result['network']</span>
|
|
</td>
|
|
|
|
<td align="center">
|
|
#if int($cur_result['quality']) in $qualityPresets
|
|
<span class="quality $qualityPresetStrings[int($cur_result['quality'])]">$qualityPresetStrings[int($cur_result['quality'])]</span>
|
|
#else
|
|
<span class="quality Custom">Custom</span>
|
|
#end if
|
|
</td>
|
|
|
|
<td align="center" style="vertical-align:middle">
|
|
#if $sg_var('USE_IMDB_INFO') and $cur_result['imdb_id']
|
|
<a href="<%= anon_url('http://www.imdb.com/title/', cur_result['imdb_id']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[$sickbeard.indexerApi(INDEXER_IMDB).config.get('name')]" height="16" width="16" src="$sbRoot/images/$sickbeard.indexerApi(INDEXER_IMDB).config.get('icon')" /></a>
|
|
#end if
|
|
<a href="<%= anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="$sickbeard.indexerApi($cur_indexer).config['show_url']${cur_result['showid']}"><img alt="$sickbeard.indexerApi($cur_indexer).name" height="16" width="16" src="$sbRoot/images/$sickbeard.indexerApi($cur_indexer).config['icon']" /></a>
|
|
</td>
|
|
|
|
<td align="center">
|
|
<a href="$sbRoot/home/searchEpisode?show=${cur_result['showid']}&season=$cur_result['season']&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/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a>
|
|
</td>
|
|
</tr>
|
|
<!-- end $cur_result['show_name'] //-->
|
|
|
|
#end for
|
|
|
|
</tbody>
|
|
|
|
<tfoot>
|
|
<tr>
|
|
<th rowspan="1" colspan="10" align="center"> </th>
|
|
</tr>
|
|
</tfoot>
|
|
|
|
</table>
|
|
<!-- end list view //-->
|
|
|
|
|
|
|
|
#else if $layout in ['banner', 'poster']
|
|
<!-- start non list view //-->
|
|
|
|
<script>
|
|
<!--
|
|
#raw
|
|
$(document).ready(function(){
|
|
$('#sbRoot').ajaxEpSearch({'size': 16, 'loadingImage': 'loading16' + themeSpinner + '.gif'});
|
|
$('.ep_summary').hide();
|
|
$('.ep_summaryTrigger').click(function() {
|
|
$(this).next('.ep_summary').slideToggle('normal', function() {
|
|
$(this).prev('.ep_summaryTrigger').attr('src', function(i, src) {
|
|
return $(this).next('.ep_summary').is(':visible') ? src.replace('plus','minus') : src.replace('minus','plus')
|
|
});
|
|
});
|
|
});
|
|
#end raw
|
|
|
|
#set $fuzzydate = 'airdate'
|
|
#if $sg_var('FUZZY_DATING')
|
|
fuzzyMoment({
|
|
dtInline: !0,
|
|
dtGlue: ' at ',
|
|
containerClass: '.${fuzzydate}',
|
|
dateHasTime: !0,
|
|
dateFormat: '$sg_str('DATE_PRESET', '%x')',
|
|
timeFormat: '$sg_str('TIME_PRESET', '%I:%M %p')',
|
|
trimZero: #echo ('!1', '!0')[$sg_var('TRIM_ZERO')]#
|
|
});
|
|
#end if
|
|
});
|
|
//-->
|
|
</script>
|
|
|
|
#set $cur_segment = None
|
|
#set $too_late_header = False
|
|
#set $missed_header = False
|
|
#set $today_header = False
|
|
#set $show_div = 'ep_listing listing-default'
|
|
|
|
<div style="clear:both">
|
|
#for $x, $cur_result in $enumerate($sql_results)
|
|
#set $add_space = ('', ' add-space')[bool($x)]
|
|
#set $cur_indexer = int($cur_result['indexer'])
|
|
#set $display_name = (re.sub('^((?:A(?!\s+to)n?)|The)\s(\w)', r'<span class="article">\1</span> \2', $cur_result['show_name']), $cur_result['show_name'])[$sg_var('SORT_ARTICLE')]
|
|
##
|
|
#if int($cur_result['paused']) and not $sg_var('EPISODE_VIEW_DISPLAY_PAUSED')
|
|
#continue
|
|
#end if
|
|
##
|
|
#set $runtime = $cur_result['runtime']
|
|
##
|
|
#if 'network' == $sort
|
|
##
|
|
#set $show_network = $cur_result['network'] if $cur_result['network'] else 'no network'
|
|
#if $cur_segment != $show_network
|
|
#set $cur_segment = $cur_result['network']
|
|
<h2 class="network$add_space">$show_network</h2>
|
|
#end if
|
|
#set $cur_ep_airdate = $cur_result['localtime'].date()
|
|
##
|
|
#if $runtime
|
|
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
|
|
#if $cur_ep_enddate < $today
|
|
#set $show_div = 'ep_listing listing-overdue'
|
|
#elif $cur_ep_airdate >= $next_week.date()
|
|
#set $show_div = 'ep_listing listing-toofar'
|
|
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date()
|
|
#if $cur_ep_airdate == $today.date()
|
|
#set $show_div = 'ep_listing listing-current'
|
|
#else
|
|
#set $show_div = 'ep_listing listing-default'
|
|
#end if
|
|
#end if
|
|
#end if
|
|
#elif 'time' == $sort
|
|
##
|
|
#set $cur_ep_airdate = $cur_result['localtime'].date()
|
|
##
|
|
#if $cur_segment != $cur_ep_airdate
|
|
#if $runtime
|
|
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
|
|
#if $cur_ep_enddate < $today and $cur_ep_airdate != $today.date() and not $missed_header
|
|
<h2 class="day">Missed</h2>
|
|
#set $missed_header = True
|
|
#elif $cur_ep_airdate >= $next_week.date() and not $too_late_header
|
|
<h2 class="day">Later</h2>
|
|
#set $too_late_header = True
|
|
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date()
|
|
#if $cur_ep_airdate == $today.date()
|
|
<h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize() <span style="font-size:14px; vertical-align:top">[Today]</span></h2>
|
|
#set $today_header = True
|
|
#else
|
|
<h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize()</h2>
|
|
#end if
|
|
#end if
|
|
#end if
|
|
#set $cur_segment = $cur_ep_airdate
|
|
#end if
|
|
##
|
|
#if $cur_ep_airdate == $today.date() and not $today_header
|
|
<h2 class="day">$sbdatetime.sbdatetime.sbfdate($cur_ep_airdate, '%A').decode($sickbeard.SYS_ENCODING).capitalize() <span style="font-size:14px; vertical-align:top">[Today]</span></h2>
|
|
#set $today_header = True
|
|
#end if
|
|
##
|
|
#if $runtime
|
|
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
|
|
#if $cur_ep_enddate < $today
|
|
#set $show_div = 'ep_listing listing-overdue'
|
|
#elif $cur_ep_airdate >= $next_week.date()
|
|
#set $show_div = 'ep_listing listing-toofar'
|
|
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date()
|
|
#if $cur_ep_airdate == $today.date()
|
|
#set $show_div = 'ep_listing listing-current'
|
|
#else
|
|
#set $show_div = 'ep_listing listing-default'
|
|
#end if
|
|
#end if
|
|
#end if
|
|
|
|
#elif 'show' == $sort
|
|
#set $cur_ep_airdate = $cur_result['localtime'].date()
|
|
#slurp
|
|
#if $runtime
|
|
#set $cur_ep_enddate = $cur_result['localtime'] + datetime.timedelta(minutes = $runtime)
|
|
#if $cur_ep_enddate < $today
|
|
#set $show_div = 'ep_listing listing-overdue listingradius'
|
|
#elif $cur_ep_airdate >= $next_week.date()
|
|
#set $show_div = 'ep_listing listing-toofar listingradius'
|
|
#elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date()
|
|
#if $cur_ep_airdate == $today.date()
|
|
#set $show_div = 'ep_listing listing-current listingradius'
|
|
#else
|
|
#set $show_div = 'ep_listing listing-default listingradius'
|
|
#end if
|
|
#end if
|
|
#end if
|
|
#end if
|
|
#slurp
|
|
<!-- start $cur_result['show_name'] //-->
|
|
<div class="$show_div" id="listing-${cur_result['showid']}">
|
|
<div class="tvshowDiv">
|
|
<table width="100%" border="0" cellpadding="0" cellspacing="0">
|
|
<tr>
|
|
<th #if 'banner' == $layout then 'class="nobg"' else 'rowspan="2"'# valign="top">
|
|
<a href="$sbRoot/home/displayShow?show=${cur_result['showid']}"><img alt="" class="#if 'banner' == $layout then 'bannerThumb' else 'posterThumb'#" src="$sbRoot/showPoster/?show=${cur_result['showid']}&which=#if 'poster' == $layout then 'poster_thumb' else $layout#" /></a>
|
|
</th>
|
|
|
|
#if 'banner' == $layout
|
|
</tr>
|
|
<tr>
|
|
#end if
|
|
<td class="next_episode">
|
|
<div class="clearfix">
|
|
<span class="tvshowTitle">
|
|
<a href="$sbRoot/home/displayShow?show=${cur_result['showid']}" data-name="$cur_result['data_show_name']">$display_name
|
|
#if int($cur_result['paused'])
|
|
<span class="pause">[paused]</span>
|
|
#end if
|
|
</a></span>
|
|
|
|
<span class="tvshowTitleIcons">
|
|
#if $sg_var('USE_IMDB_INFO') and $cur_result['imdb_id']
|
|
<a href="<%= anon_url('http://www.imdb.com/title/', cur_result['imdb_id']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="http://www.imdb.com/title/${cur_result['imdb_id']}"><img alt="[$sickbeard.indexerApi(INDEXER_IMDB).name]" height="16" width="16" src="$sbRoot/images/$sickbeard.indexerApi(INDEXER_IMDB).config.get('icon')" /></a>
|
|
#end if
|
|
<a href="<%= anon_url(sickbeard.indexerApi(cur_indexer).config['show_url'], cur_result['showid']) %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false" title="$sickbeard.indexerApi($cur_indexer).config['show_url']${cur_result['showid']}"><img alt="$sickbeard.indexerApi($cur_indexer).name" height="16" width="16" src="$sbRoot/images/$sickbeard.indexerApi($cur_indexer).config['icon']" /></a>
|
|
<span><a href="$sbRoot/home/searchEpisode?show=${cur_result['showid']}&season=$cur_result['season']&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/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a></span>
|
|
</span>
|
|
</div>
|
|
|
|
<span class="title">Next Episode:</span> <span><%= 'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode'])) %> - $cur_result['name']</span>
|
|
|
|
<div class="clearfix">
|
|
<span class="title">Airdate: </span><span class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdatetime($cur_result['localtime']).decode($sickbeard.SYS_ENCODING)</span><%= ('', '<span> on %s</span>' % str(cur_result['network']))[None is not cur_result['network']] %>
|
|
</div>
|
|
|
|
<div class="clearfix">
|
|
<span class="title">Quality:</span>
|
|
#if int($cur_result['quality']) in $qualityPresets
|
|
<span class="quality $qualityPresetStrings[int($cur_result['quality'])]">$qualityPresetStrings[int($cur_result['quality'])]</span>
|
|
#else
|
|
<span class="quality Custom">Custom</span>
|
|
#end if
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="vertical-align:top">
|
|
<div>
|
|
#if $cur_result['description']
|
|
<span class="title" style="vertical-align:middle">Plot:</span>
|
|
<img class="ep_summaryTrigger" src="$sbRoot/images/plus.png" height="16" width="16" alt="" title="Toggle Summary" /><div class="ep_summary">$cur_result['description']</div>
|
|
#else
|
|
<span class="title ep_summaryTriggerNone" style="vertical-align:middle">Plot:</span>
|
|
<img class="ep_summaryTriggerNone" src="$sbRoot/images/plus.png" height="16" width="16" alt="" />
|
|
#end if
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<!-- end $cur_result['show_name'] //-->
|
|
#end for
|
|
</div>
|
|
<!-- end non list view //-->
|
|
#end if
|
|
##
|
|
#if 'daybyday' == $layout
|
|
##
|
|
#set $shows_overdue = []
|
|
#set $shows_soon = []
|
|
#set $shows_future = []
|
|
#set $onair = []
|
|
#set $backart = []
|
|
|
|
#set $state_overdue = 'listing-overdue'
|
|
#set $state_current = 'listing-current'
|
|
#set $state_soon = 'listing-soon'
|
|
#set $state_future = 'listing-default'
|
|
|
|
#for $cur_result in $sql_results
|
|
#if int($cur_result['paused']) and not $sg_var('EPISODE_VIEW_DISPLAY_PAUSED')
|
|
#continue
|
|
#end if
|
|
#if $cur_result['runtime']
|
|
#set $air_date = $cur_result['localtime'].date()
|
|
#set $end_datetime = $cur_result['localtime'] + datetime.timedelta(minutes = $cur_result['runtime'])
|
|
#if $air_date >= $next_week.date()
|
|
#set $cur_result['state'] = ''
|
|
$shows_future.append($cur_result)
|
|
#elif $cur_result['localtime'] > $today
|
|
#set $cur_result['state'] = ''
|
|
$shows_soon.append($cur_result)
|
|
#set $dif = $cur_result['localtime'] - $today
|
|
#set $until_hrs = (divmod($dif.days * 86400 + $dif.seconds, 60)[0]) / 60
|
|
#if 24 >= $until_hrs and $cur_result['showid'] not in $backart
|
|
$backart.append($cur_result['showid'])
|
|
#end if
|
|
#elif $end_datetime > $today
|
|
#set $cur_result['state'] = $state_current
|
|
#set $cur_result['state-title'] = 'Currently On Air'
|
|
$shows_soon.append($cur_result)
|
|
#if $cur_result['showid'] not in $onair
|
|
$onair.append($cur_result['showid'])
|
|
#end if
|
|
#elif $air_date == $today.date()
|
|
#set $cur_result['state'] = $state_overdue
|
|
#set $cur_result['state-title'] = 'Overdue'
|
|
$shows_soon.append($cur_result)
|
|
#else
|
|
#set $cur_result['state'] = $state_overdue
|
|
#set $cur_result['state-title'] = 'Overdue'
|
|
$shows_overdue.append($cur_result)
|
|
#end if
|
|
#else
|
|
#set $cur_result['state'] = $state_soon
|
|
#set $cur_result['state-title'] = ''
|
|
$shows_soon.append($cur_result)
|
|
#end if
|
|
#end for
|
|
|
|
##set $state_init = [int(bool($shows_overdue)), ($state_soon, $state_overdue)[0 < len($shows_overdue)]] ## default overdue
|
|
#set $state_init = [int(bool($shows_overdue)), $state_soon] ## default soon
|
|
|
|
#set $dates_future = sorted({$i['localtime'].date():$i for $i in $shows_future})
|
|
#set $rounded_week = len($dates_future)/7*7 + int(bool(len($dates_future)%7))*7
|
|
#set $dates_future += [$dates_future[-1] + datetime.timedelta(days = 1 + $i) for $i in range($rounded_week - len($dates_future))]
|
|
#set $num_weeks = $rounded_week/7
|
|
#slurp
|
|
<span style="position:absolute;left:-999px;height:0px">
|
|
<img src="$sbRoot/images/poster_thumb.jpg" alt=""><img src="$sbRoot/images/banner_thumb.jpg" alt="">
|
|
</span>
|
|
#if $varExists('fanart')
|
|
<div id="background-container">
|
|
#set $backlist = $backart
|
|
#if $onair
|
|
#import random
|
|
$random.shuffle($onair)
|
|
#set $backlist = $onair
|
|
#end if
|
|
|
|
#if len($backlist)
|
|
<ul>
|
|
#set $start_image = True
|
|
#for $show_id in $backlist
|
|
#for ($image, $rating) in $fanart.get($show_id, [])
|
|
<li class="#echo ' '.join((x for x in ({10:'group', 20:'fave', 30:'avoid'}.get($rating, ''), ('', 'background first-load')[$start_image]) if x)) #" style="background-image:url($sbRoot/showPoster/?show=$show_id&which=fanart_$image)"></li>
|
|
#set $start_image = False
|
|
#end for
|
|
#end for
|
|
</ul>
|
|
#end if
|
|
</div>
|
|
#end if
|
|
|
|
<div class="daybydayCarouselContainer">
|
|
<div id="Carousel" class="carousel slide">
|
|
|
|
#set $wide = int(0 < len($shows_overdue)) + $num_weeks
|
|
<div class="controlsBlock" style="#if $wide#width:#echo 42 + (($wide + 1) * 22) + 15 #px#else#background:transparent#end if#">
|
|
#if $wide
|
|
<a class="left carousel-control" href="#Carousel" data-slide="prev"><i class="glyphicon glyphicon-chevron-left"></i></a>
|
|
<a class="right carousel-control" href="#Carousel" data-slide="next"><i class="glyphicon glyphicon-chevron-right"></i></a>
|
|
<ul class="carousel-indicators">
|
|
|
|
#set $slide_id = 0
|
|
#if len($shows_overdue)
|
|
<li data-target="#Carousel" data-slide-to="$slide_id" class="$state_overdue#if $state_init[1] == $state_overdue then ' active' else ''#"></li>
|
|
#set $slide_id = 1
|
|
#end if
|
|
<li data-target="#Carousel" data-slide-to="$slide_id" class="$state_soon#if $state_init[1] == $state_soon then ' active' else ''#"></li>
|
|
#set $slide_id += 1
|
|
|
|
#for $i in range($slide_id, $slide_id + $num_weeks)
|
|
<li data-target="#Carousel" data-slide-to="${i}" class="$state_future#if $state_init[1] == $state_future and $state_init[0] == $i then ' active' else ''#"></li>
|
|
#end for
|
|
</ul>
|
|
#end if
|
|
</div>
|
|
|
|
<div class="carousel-inner">
|
|
|
|
#for $shows, $state in [[$shows_overdue, $state_overdue], [$shows_soon, $state_soon], [$shows_future, $state_future]]
|
|
#if 0 == len($shows) and ($state_overdue == $state or $state_future == $state)
|
|
#continue
|
|
#end if
|
|
#set $week_num = 0
|
|
#set $num_weeks = 1
|
|
#while ($num_weeks)
|
|
#if $state_future == $state
|
|
#set $dates = $dates_future[$week_num*7:$week_num*7+7]
|
|
#if 0 == $week_num
|
|
#set $num_weeks = $rounded_week/7
|
|
#end if
|
|
#set $week_num += 1
|
|
#else
|
|
#set $dates = [($today + datetime.timedelta(days = ($i, -7+$i)[$state_overdue == $state])).date() for $i in range(7)]
|
|
#end if
|
|
#set $num_weeks -= 1
|
|
|
|
<div class="item#if $state_init[1] == $state then ' active' else ''#"> <!-- start $state -->
|
|
<div class="daybydayWrapper">
|
|
#set $tbl_day = 0
|
|
#for $day in $dates
|
|
##
|
|
#set $tbl_day += 1
|
|
##
|
|
#set $col_class = ''
|
|
#if 1 == $tbl_day and $state_soon == $state
|
|
#set $col_class = 'today '
|
|
#end if
|
|
#set $col_class = '%s%s' % ($col_class, ('even', 'odd')[1 == tbl_day % 2])
|
|
|
|
<div class="day-of-week $col_class">
|
|
<div class="day-number">
|
|
<div class="number">$sbdatetime.sbdatetime.sbfdate($day, ' %d').decode($sickbeard.SYS_ENCODING).replace(' 0', ' ')</div>
|
|
<div class="day">
|
|
<span class="visible-lg">$sbdatetime.sbdatetime.sbfdate($day, '%A').decode($sickbeard.SYS_ENCODING).capitalize()</span>
|
|
<span class="hidden-lg">$sbdatetime.sbdatetime.sbfdate($day, '%a').decode($sickbeard.SYS_ENCODING).capitalize()</span>
|
|
</div>
|
|
<div class="month">
|
|
<span class="visible-lg">$sbdatetime.sbdatetime.sbfdate($day, '%B').decode($sickbeard.SYS_ENCODING).capitalize()</span>
|
|
<span class="hidden-lg">$sbdatetime.sbdatetime.sbfdate($day, '%b').decode($sickbeard.SYS_ENCODING).capitalize()</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="$sbdatetime.sbdatetime.sbfdate($day, 'day%j')">
|
|
|
|
#set $day_has_show = False
|
|
#for $cur_result in $shows
|
|
#if $day == $cur_result['localtime'].date()
|
|
#set $day_has_show = True
|
|
#set $airtime = $sbdatetime.sbdatetime.sbftime($cur_result['localtime'], markup=True).decode($sickbeard.SYS_ENCODING)
|
|
#set $img_id = ''
|
|
#set $plot_class = ''
|
|
#set $title_text = ''
|
|
#set $show_id = '%s_%sx%s' % (str($cur_result['showid']), str($cur_result['season']), str($cur_result['episode']))
|
|
#set $img_id = ' id="plot-%s"' % $show_id
|
|
#set $plot_class = ' plot-daybyday'
|
|
|
|
<div id="show-${show_id}" class="daybyday-show" data-name="$cur_result['data_show_name']" data-season="$cur_result['season']" data-episode="$cur_result['episode']" data-network="$cur_result['data_network']" data-time="$cur_result['localtime'].strftime('%Y%m%d%H%M')" data-rawname="$cur_result['show_name']">
|
|
<div class="poster">
|
|
<a${title_text} href="$sbRoot/home/displayShow?show=${cur_result['showid']}">
|
|
<img${img_id} class="img-responsive${plot_class}" alt="" src="$sbRoot/showPoster/?show=${cur_result['showid']}&which=#echo ('banner', 'poster')[$bool($sg_var('EPISODE_VIEW_POSTERS', True))]#_thumb" /></a>
|
|
</div>
|
|
<div class="state#if len($cur_result['state']) then ' %s" title="%s"' % ($cur_result['state'], $cur_result['state-title']) else '"' #></div>
|
|
<div class="text">
|
|
<div class="airtime">
|
|
#set $match = None if not $cur_result['network'] else re.search(r'(.*)\s(\(\w+\))$', $cur_result['network'], re.I | re.M)
|
|
<span class="time">${airtime}</span> <span class="network pull-right grey-text"#echo '>%s' % $cur_result['network'] if None is $match else ' title="%s">%s' % ($match.group(2), $match.group(1))#</span>
|
|
</div>
|
|
<div class="episode" title="$cur_result['name']">
|
|
<span class="season"><%= '%i' % int(cur_result['season']) %></span>x<span class="number"><%= '%02i' % int(cur_result['episode']) %></span>
|
|
<span class="name">$cur_result['name']</span>
|
|
</div>
|
|
</div>
|
|
#if int($cur_result['paused'])
|
|
<span class="over-layer0">[paused]</span>
|
|
<span class="over-layer1">[paused]</span>
|
|
#elif $state_current == $cur_result['state']
|
|
#set $endtime = $sbdatetime.sbdatetime.sbftime($cur_result['localtime'] + datetime.timedelta(minutes = $cur_result['runtime']), markup=True).decode($sickbeard.SYS_ENCODING)
|
|
<span class="over-layer0 on-air0">On Air until<br />$endtime</span>
|
|
<span class="over-layer1 on-air1">On Air until<br />$endtime</span>
|
|
#end if
|
|
</div><!-- end show-$cur_result['showid'] //-->
|
|
|
|
#end if
|
|
#end for
|
|
#if not $day_has_show
|
|
<div class="daybyday-show">
|
|
#set $theday = ('this ', 'to')[1 == $tbl_day and $state_soon == $state]
|
|
<span class="episode-blank">No shows ${theday}day</span>
|
|
</div>
|
|
#end if
|
|
</div>
|
|
</div>
|
|
#end for
|
|
</div> <!-- end daybydayWrapper //-->
|
|
</div> <!-- end $state //-->
|
|
#end while
|
|
#end for
|
|
|
|
</div> <!-- end carouselinner //-->
|
|
</div> <!-- end Carousel //-->
|
|
</div> <!-- end daybydayCarouselContainer //-->
|
|
|
|
<!-- end calender view //-->
|
|
#end if
|
|
|
|
<div class="clearfix"></div>
|
|
|
|
#raw
|
|
<script>
|
|
<!--
|
|
window.setInterval('location.reload(true)', 30*60000); // Refresh every xx minutes
|
|
|
|
$('#Carousel').carousel({interval: 0});
|
|
|
|
$(document).bind('keyup', function(e) {
|
|
return ((!(e.hasOwnProperty('ctrlKey') && e.ctrlKey) && !(e.hasOwnProperty('altKey') && e.altKey)) && (
|
|
(39 == e.which && $('.carousel').carousel('next')) ||
|
|
(37 == e.which && $('.carousel').carousel('prev'))) || !0);
|
|
});
|
|
//-->
|
|
</script>
|
|
#end raw
|
|
|
|
#if $varExists('fanart') and $layout in 'daybyday'
|
|
#include $os.path.join($sg_str('PROG_DIR'), 'gui/slick/interfaces/default/inc_livepanel.tmpl')
|
|
#end if
|
|
#include $os.path.join($sg_str('PROG_DIR'), 'gui/slick/interfaces/default/inc_bottom.tmpl')
|