mirror of
https://github.com/SickGear/SickGear.git
synced 2024-12-11 13:43:37 +00:00
0bcc2c03e6
Change rename "Manual Post-Processing" menu item to "Process Media". Change rename "Search Providers" -> "Media Providers". Change rename "Manage Searches" -> "Media Search". Change rename "Episode Status Management" -> "Episode Status". Change rename "Mass Update" -> "Bulk Change". Change indicate default home on "Shows Menu". Change relocate "Episodes" menu to "Shows"/"Episode Schedule". Change relocate "History" menu to "Shows"/"History". Change remove restart/shutdown buttons from "Show List". Change remove superfluous buttons from all submenus.
271 lines
12 KiB
Cheetah
271 lines
12 KiB
Cheetah
#import sickbeard
|
|
#import datetime
|
|
#import re
|
|
#from sickbeard.common import *
|
|
#from sickbeard import sbdatetime
|
|
#from sickbeard import history
|
|
#from sickbeard import providers
|
|
#from sickbeard.providers import generic
|
|
<% 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 = 'History'
|
|
#set global $header = 'History'
|
|
#set global $sbPath = '..'
|
|
#set global $topmenu = 'home'
|
|
#set $layout = $sg_str('HISTORY_LAYOUT', 'detailed')
|
|
##
|
|
#import os.path
|
|
#include $os.path.join($sg_str('PROG_DIR'), 'gui/slick/interfaces/default/inc_top.tmpl')
|
|
|
|
<script type="text/javascript">
|
|
<!--
|
|
\$.tablesorter.addParser({
|
|
id: 'cDate',
|
|
is: function(s) {
|
|
return false;
|
|
},
|
|
format: function(s) {
|
|
return s;
|
|
},
|
|
type: 'numeric'
|
|
});
|
|
|
|
\$(document).ready(function()
|
|
{
|
|
\$('#historyTable:has(tbody tr)').tablesorter({
|
|
widgets: ['zebra', 'filter'],
|
|
sortList: [[0, 1]],
|
|
textExtraction: {
|
|
0: function(node) { return \$(node).find('span').text().toLowerCase(); },
|
|
#if ('detailed' == $layout)
|
|
4: function(node) { return \$(node).find('span').text().toLowerCase(); }
|
|
#else
|
|
1: function(node) { return \$(node).find('span[data-name]').attr('data-name').toLowerCase(); },
|
|
2: function(node) { return \$(node).attr('provider').toLowerCase(); },
|
|
5: function(node) { return \$(node).attr('quality').toLowerCase(); }
|
|
#end if
|
|
},
|
|
headers: {
|
|
0: { sorter: 'cDate' },
|
|
#if ('detailed' == $layout)
|
|
4: { sorter: 'quality' }
|
|
#else
|
|
4: { sorter: false },
|
|
5: { sorter: 'quality' }
|
|
#end if
|
|
}
|
|
|
|
});
|
|
\$('#limit').change(function(){
|
|
url = '$sbRoot/history/?limit=' + \$(this).val()
|
|
window.location.href = url
|
|
});
|
|
|
|
#set $fuzzydate = 'airdate'
|
|
#if $sg_var('FUZZY_DATING')
|
|
fuzzyMoment({
|
|
containerClass: '.${fuzzydate}',
|
|
dateHasTime: !0,
|
|
dateFormat: '$sg_str('DATE_PRESET', '%x')',
|
|
timeFormat: '$sg_str('TIME_PRESET_W_SECONDS', '%I:%M:%S %p')',
|
|
trimZero: #echo ('!1', '!0')[$sg_var('TRIM_ZERO')]#,
|
|
dtGlue: ', '
|
|
});
|
|
#end if
|
|
});
|
|
//-->
|
|
</script>
|
|
|
|
#if $varExists('header')
|
|
<h1 class="header">$header</h1>
|
|
#else
|
|
<h1 class="title">$title</h1>
|
|
#end if
|
|
|
|
#set $html_selected = ' selected="selected"'
|
|
##
|
|
<div class="h2footer pull-right">Limit:
|
|
<select name="limit" id="limit" class="form-control form-control-inline input-sm">
|
|
<option value="100"#echo ('', $html_selected)['100' == $limit]#>100</option>
|
|
<option value="250"#echo ('', $html_selected)['250' == $limit]#>250</option>
|
|
<option value="500"#echo ('', $html_selected)['500' == $limit]#>500</option>
|
|
<option value="0"#echo ('', $html_selected)['0' == $limit]#>All</option>
|
|
</select>
|
|
|
|
<span style="margin-left:5px">Layout:
|
|
<select name="HistoryLayout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value">
|
|
<option value="$sbRoot/setHistoryLayout/?layout=compact"#echo ('', $html_selected)['compact' == $sg_str('HISTORY_LAYOUT')]#>Compact</option>
|
|
<option value="$sbRoot/setHistoryLayout/?layout=detailed"#echo ('', $html_selected)['detailed' == $sg_str('HISTORY_LAYOUT', 'detailed')]#>Detailed</option>
|
|
</select>
|
|
</span>
|
|
</div>
|
|
<br>
|
|
|
|
<table id="historyTable" class="sickbeardTable tablesorter $layout" cellspacing="1" border="0" cellpadding="0">
|
|
#if 'detailed' == $layout
|
|
<thead>
|
|
<tr>
|
|
<th class="nowrap">Time</th>
|
|
<th width="35%">Episode</th>
|
|
<th>Action</th>
|
|
<th>Provider</th>
|
|
<th>Quality</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tfoot>
|
|
<tr>
|
|
<th class="nowrap" colspan="5"> </th>
|
|
</tr>
|
|
</tfoot>
|
|
|
|
<tbody>
|
|
#for $hItem in $historyResults
|
|
#set $curStatus, $curQuality = $Quality.splitCompositeStatus(int($hItem['action']))
|
|
#set $data_name = (re.sub('^((?:A(?!\s+to)n?)|The)\s(\w)', r'\2', $hItem['show_name']), $hItem['show_name'])[$sg_var('SORT_ARTICLE')]
|
|
#set $display_name = '<span data-name="%s">%s - S%02iE%02i</span>' % (
|
|
$data_name,
|
|
(re.sub('^((?:A(?!\s+to)n?)|The)\s(\w)', r'<span class="article">\1</span> \2', $hItem['show_name']), $hItem['show_name'])[$sg_var('SORT_ARTICLE')],
|
|
int(hItem['season']), int(hItem['episode']))
|
|
<tr>
|
|
#set $curdatetime = $datetime.datetime.strptime(str($hItem['date']), $history.dateFormat)
|
|
<td><div class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdatetime($curdatetime, show_seconds=True)</div><span class="sort-data">$time.mktime($curdatetime.timetuple())</span></td>
|
|
<td class="tvShow"><a href="$sbRoot/home/displayShow?show=$hItem['showid']#season-$hItem['season']">$display_name#if 'proper' in $hItem['resource'].lower or 'repack' in $hItem['resource'].lower then ' <span class="quality Proper">Proper</span>' else ''#</a></td>
|
|
<td#echo ('', ' class="subtitles_column"')[SUBTITLED == $curStatus]#>
|
|
#if SUBTITLED == $curStatus
|
|
<img width="16" height="11" src="$sbRoot/images/flags/<%= hItem["resource"][len(hItem["resource"])-6:len(hItem["resource"])-4] + '.png' %>">
|
|
#end if
|
|
<span class="help" title="$os.path.basename($hItem["resource"])">$statusStrings[$curStatus]</span>
|
|
</td>
|
|
<td class="provider">
|
|
#if DOWNLOADED == $curStatus
|
|
#if '-1' != $hItem['provider']
|
|
<span><i>$hItem['provider']</i></span>
|
|
#end if
|
|
#else
|
|
#if 0 < $hItem['provider']
|
|
#if $curStatus in [SNATCHED, FAILED]
|
|
#set $provider = $providers.getProviderClass($generic.GenericProvider.make_id($hItem['provider']))
|
|
#if None is not $provider
|
|
<img src="$sbRoot/images/providers/<%= provider.image_name() %>" width="16" height="16" /><span>$provider.name</span>
|
|
#else
|
|
<img src="$sbRoot/images/providers/missing.png" width="16" height="16" title="missing provider" /><span>Missing Provider</span>
|
|
#end if
|
|
#else
|
|
<img src="$sbRoot/images/subtitles/<%= hItem['provider']+'.png' %>" width="16" height="16" /><span><%= hItem['provider'].capitalize() %></span>
|
|
#end if
|
|
#end if
|
|
#end if
|
|
</td>
|
|
<td><span class="hide">$curQuality</span><span class="quality $Quality.get_quality_css($curQuality)">$Quality.qualityStrings[$curQuality]</span></td>
|
|
</tr>
|
|
#end for
|
|
|
|
#else
|
|
<thead>
|
|
<tr>
|
|
<th class="nowrap">Time</th>
|
|
<th width="#echo '3%s%%' % ('5', '0')[$sg_var('USE_SUBTITLES')]#">Episode</th>
|
|
<th>Snatched</th>
|
|
<th>Downloaded</th>
|
|
#if $sg_var('USE_SUBTITLES')
|
|
<th>Subtitled</th>
|
|
#end if
|
|
<th width="14%">Quality</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tfoot>
|
|
<tr>
|
|
<th class="nowrap" colspan="6"> </th>
|
|
</tr>
|
|
</tfoot>
|
|
|
|
<tbody>
|
|
#for $hItem in $compactResults
|
|
#set $curdatetime = $datetime.datetime.strptime(str($hItem['actions'][0]['time']), $history.dateFormat)
|
|
#set $data_name = (re.sub('^((?:A(?!\s+to)n?)|The)\s(\w)', r'\2', $hItem['show_name']), $hItem['show_name'])[$sg_var('SORT_ARTICLE')]
|
|
#set $display_name = '<span data-name="%s">%s - S%02iE%02i</span>' % (
|
|
$data_name,
|
|
(re.sub('^((?:A(?!\s+to)n?)|The)\s(\w)', r'<span class="article">\1</span> \2', $hItem['show_name']), $hItem['show_name'])[$sg_var('SORT_ARTICLE')],
|
|
int(hItem['season']), int(hItem['episode']))
|
|
#set $prov_list = []
|
|
#set $down_list = []
|
|
#set $order = 1
|
|
#set $ordinal_indicators = {'1':'st', '2':'nd', '3':'rd'}
|
|
#for $action in reversed($hItem['actions'])
|
|
#set $curStatus, $curQuality = $Quality.splitCompositeStatus(int($action['action']))
|
|
#set $basename = $os.path.basename($action['resource'])
|
|
#if $curStatus in [SNATCHED, FAILED]
|
|
#set $provider = $providers.getProviderClass($generic.GenericProvider.make_id($action['provider']))
|
|
#if None is not $provider
|
|
#set $prov_list += ['<span%s><img class="help" src="%s/images/providers/%s" width="16" height="16" alt="%s" title="%s.. %s: %s" /></span>'\
|
|
% (('', ' class="fail"')[FAILED == $curStatus], $sbRoot, $provider.image_name(), $provider.name,
|
|
('%s%s' % ($order, 'th' if $order in [11, 12, 13] or str($order)[-1] not in $ordinal_indicators else $ordinal_indicators[str($order)[-1]]), 'Snatch failed')[FAILED == $curStatus],
|
|
$provider.name, $basename)]
|
|
#set $order += (0, 1)[SNATCHED == $curStatus]
|
|
#else
|
|
#set $prov_list += ['<img src="%s/images/providers/missing.png" width="16" height="16" alt="missing provider" title="missing provider" />'\
|
|
% $sbRoot]
|
|
#end if
|
|
#end if
|
|
#if $curStatus in [DOWNLOADED, ARCHIVED]
|
|
#set $match = $re.search('\-(\w+)\.\w{3}\Z', $basename)
|
|
#set $non_scene_note = ''
|
|
#if not $match
|
|
## This fallback is for when idiots add a space and word to a release group. The space is converted
|
|
## to '\' which makes the regex parsing the scene group name fail, therefore we arrive here.
|
|
## A better solution would be to find where such data is parsed and saved to the db and perhaps
|
|
## fix at that point. But, in the meantime...
|
|
#set $non_scene_resource = re.sub(r'(\-\w+)([\\]\w+)?(\.\w{3})\Z', r'\1\3', $action['resource'])
|
|
#if $non_scene_resource
|
|
#set $non_scene_note = ' (Non scene name: %s)' % $action['resource'].partition('-')[-1]
|
|
#set $basename = $os.path.basename($non_scene_resource)
|
|
#set $match = $re.search('\-(\w+)\.\w{3}\Z', $basename)
|
|
#end if
|
|
#end if
|
|
#if $match
|
|
#if $match.group(1).upper() in ('X264', '720P')
|
|
#set $match = $re.search('(\w+)\-.*\-' + $match.group(1) + '\.\w{3}\Z', $os.path.basename($hItem['resource']), re.I)
|
|
#end if
|
|
#if $match
|
|
#set $down_list += ['<span class="help" title="%s%s"><i>%s</i></span>'\
|
|
% ($basename, $non_scene_note, $match.group(1).upper())]
|
|
#end if
|
|
#end if
|
|
#end if
|
|
#end for
|
|
<tr>
|
|
<td><div class="${fuzzydate}">$sbdatetime.sbdatetime.sbfdatetime($curdatetime, show_seconds=True)</div><span class="sort-data">$time.mktime($curdatetime.timetuple())</span></td>
|
|
<td class="tvShow">
|
|
<span><a href="$sbRoot/home/displayShow?show=$hItem['show_id']#season-$hItem['season']">$display_name#if 'proper' in $hItem['resource'].lower or 'repack' in $hItem['resource'].lower then ' <span class="quality Proper">Proper</span>' else ''#</a></span>
|
|
</td>
|
|
<td class="provider" provider="<%= str(sorted(hItem['actions'])[0]['provider']) %>">
|
|
#echo ''.join($prov_list)#
|
|
</td>
|
|
<td>
|
|
#echo ' '.join($down_list)#
|
|
</td>
|
|
#if $sg_var('USE_SUBTITLES')
|
|
<td>
|
|
#for $action in reversed($hItem['actions'])
|
|
#set $curStatus, $curQuality = $Quality.splitCompositeStatus(int($action['action']))
|
|
#if SUBTITLED == $curStatus
|
|
<img src="$sbRoot/images/subtitles/<%= action['provider'] + '.png' %>" width="16" height="16" alt="$action['provider']" title="<%= action['provider'].capitalize() %>:$os.path.basename($action['resource'])" />
|
|
<span> / </span>
|
|
<img width="16" height="11" src="$sbRoot/images/flags/<%= action['resource'][len(action['resource'])-6:len(action['resource'])-4] + '.png' %>" style="vertical-align:middle !important">
|
|
|
|
#end if
|
|
#end for
|
|
</td>
|
|
#end if
|
|
<td quality="$curQuality"><span class="quality $Quality.get_quality_css($curQuality)">$Quality.qualityStrings[$curQuality]</span></td>
|
|
</tr>
|
|
#end for
|
|
|
|
#end if
|
|
</tbody>
|
|
</table>
|
|
|
|
#include $os.path.join($sg_str('PROG_DIR'), 'gui/slick/interfaces/default/inc_bottom.tmpl')
|