mirror of
https://github.com/SickGear/SickGear.git
synced 2024-12-01 00:43:37 +00:00
8d9406d5fc
Add episode watched state system that integrates with Kodi, Plex, and/or Emby, instructions at Shows/History/Layout/"Watched". Add installable SickGear Kodi repository containing addon "SickGear Watched State Updater". Change add Emby setting for watched state scheduler at Config/Notifications/Emby/"Update watched interval". Change add Plex setting for watched state scheduler at Config/Notifications/Plex/"Update watched interval". Add API cmd=sg.updatewatchedstate, instructions for use are linked to in layout "Watched" at /history. Change history page table filter input values are saved across page refreshes. Change history page table filter inputs, accept values like "dvd or web" to only display both. Change history page table filter inputs, press 'ESC' key inside a filter input to reset it. Add provider activity stats to Shows/History/Layout/ drop down. Change move provider failures table from Manage/Media Search to Shows/History/Layout/Provider fails. Change sort provider failures by most recent failure, and with paused providers at the top. Change remove table form non-testing version 20007, that was reassigned.
236 lines
8.9 KiB
JavaScript
236 lines
8.9 KiB
JavaScript
/** @namespace $.SickGear.Root */
|
|
/** @namespace $.SickGear.history.isCompact */
|
|
/** @namespace $.SickGear.history.isTrashit */
|
|
/** @namespace $.SickGear.history.useSubtitles */
|
|
/** @namespace $.SickGear.history.layoutName */
|
|
/*
|
|
2017 Jason Mulligan <jason.mulligan@avoidwork.com>
|
|
@version 3.5.11
|
|
*/
|
|
!function(i){function e(i){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],d=0,r=void 0,a=void 0,s=void 0,f=void 0,u=void 0,l=void 0,v=void 0,B=void 0,c=void 0,p=void 0,y=void 0,m=void 0,x=void 0,g=void 0;if(isNaN(i))throw new Error("Invalid arguments");return s=!0===e.bits,y=!0===e.unix,a=e.base||2,p=void 0!==e.round?e.round:y?1:2,m=void 0!==e.spacer?e.spacer:y?"":" ",g=e.symbols||e.suffixes||{},x=2===a?e.standard||"jedec":"jedec",c=e.output||"string",u=!0===e.fullform,l=e.fullforms instanceof Array?e.fullforms:[],r=void 0!==e.exponent?e.exponent:-1,B=Number(i),v=B<0,f=a>2?1e3:1024,v&&(B=-B),(-1===r||isNaN(r))&&(r=Math.floor(Math.log(B)/Math.log(f)))<0&&(r=0),r>8&&(r=8),0===B?(n[0]=0,n[1]=y?"":t[x][s?"bits":"bytes"][r]):(d=B/(2===a?Math.pow(2,10*r):Math.pow(1e3,r)),s&&(d*=8)>=f&&r<8&&(d/=f,r++),n[0]=Number(d.toFixed(r>0?p:0)),n[1]=10===a&&1===r?s?"kb":"kB":t[x][s?"bits":"bytes"][r],y&&(n[1]="jedec"===x?n[1].charAt(0):r>0?n[1].replace(/B$/,""):n[1],o.test(n[1])&&(n[0]=Math.floor(n[0]),n[1]=""))),v&&(n[0]=-n[0]),n[1]=g[n[1]]||n[1],"array"===c?n:"exponent"===c?r:"object"===c?{value:n[0],suffix:n[1],symbol:n[1]}:(u&&(n[1]=l[r]?l[r]:b[x][r]+(s?"bit":"byte")+(1===n[0]?"":"s")),n.join(m))}var o=/^(b|B)$/,t={iec:{bits:["b","Kib","Mib","Gib","Tib","Pib","Eib","Zib","Yib"],bytes:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},jedec:{bits:["b","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"],bytes:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]}},b={iec:["","kibi","mebi","gibi","tebi","pebi","exbi","zebi","yobi"],jedec:["","kilo","mega","giga","tera","peta","exa","zetta","yotta"]};e.partial=function(i){return function(o){return e(o,i)}},"undefined"!=typeof exports?module.exports=e:"function"==typeof define&&define.amd?define(function(){return e}):i.filesize=e}("undefined"!=typeof window?window:global);
|
|
|
|
function rowCount(){
|
|
var output$ = $('#row-count');
|
|
if(!output$.length)
|
|
return;
|
|
|
|
var tbody$ = $('#tbody'),
|
|
nRows = tbody$.find('tr').length,
|
|
compacted = tbody$.find('tr.hide').length,
|
|
compactedFiltered = tbody$.find('tr.filtered.hide').length,
|
|
filtered = tbody$.find('tr.filtered').length;
|
|
output$.text((filtered
|
|
? nRows - (filtered + compacted - compactedFiltered) + ' / ' + nRows + ' filtered'
|
|
: nRows) + (1 === nRows ? ' row' : ' rows'));
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
|
|
var extraction = {0: function(node) {
|
|
var dataSort = $(node).find('div[data-sort]').attr('data-sort')
|
|
|| $(node).find('span[data-sort]').attr('data-sort');
|
|
return !dataSort ? dataSort : dataSort.toLowerCase();}},
|
|
tbody$ = $('#tbody'),
|
|
headers = {},
|
|
layoutName = '' + $.SickGear.history.layoutName;
|
|
|
|
if ('detailed' === layoutName) {
|
|
|
|
jQuery.extend(extraction, {
|
|
4: function (node) {
|
|
return $(node).find('span').text().toLowerCase();
|
|
}
|
|
});
|
|
|
|
jQuery.extend(headers, {4: {sorter: 'quality'}});
|
|
|
|
} else if ('compact' === layoutName) {
|
|
|
|
jQuery.extend(extraction, {
|
|
1: function (node) {
|
|
return $(node).find('span[data-sort]').attr('data-sort').toLowerCase();
|
|
},
|
|
2: function (node) {
|
|
return $(node).attr('provider').toLowerCase();
|
|
},
|
|
5: function (node) {
|
|
return $(node).attr('quality').toLowerCase();
|
|
}
|
|
});
|
|
|
|
var disable = {sorter: !1}, qualSort = {sorter: 'quality'};
|
|
jQuery.extend(headers, $.SickGear.history.useSubtitles ? {4: disable, 5: qualSort} : {3: disable, 4: qualSort});
|
|
|
|
} else if (-1 !== layoutName.indexOf('watched')) {
|
|
|
|
jQuery.extend(extraction, {
|
|
3: function(node) {
|
|
return $(node).find('span[data-sort]').attr('data-sort');
|
|
},
|
|
5: function(node) {
|
|
return $(node).find('span[data-sort]').attr('data-sort');
|
|
},
|
|
6: function (node) {
|
|
return $(node).find('input:checked').length;
|
|
}
|
|
});
|
|
|
|
jQuery.extend(headers, {4: {sorter: 'quality'}});
|
|
|
|
rowCount();
|
|
} else if (-1 !== layoutName.indexOf('compact_stats')) {
|
|
jQuery.extend(extraction, {
|
|
3: function (node) {
|
|
return $(node).find('div[data-sort]').attr('data-sort');
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
var isWatched = -1 !== $('select[name="HistoryLayout"]').val().indexOf('watched'),
|
|
options = {
|
|
widgets: ['zebra', 'filter'],
|
|
widgetOptions : {
|
|
filter_hideEmpty: !0, filter_matchType : {'input': 'match', 'select': 'match'},
|
|
filter_resetOnEsc: !0, filter_saveFilters: !0, filter_searchDelay: 300
|
|
},
|
|
sortList: isWatched ? [[1, 1], [0, 1]] : [0, 1],
|
|
textExtraction: extraction,
|
|
headers: headers},
|
|
stateLayoutDate = function(table$, glyph$){table$.toggleClass('event-age');glyph$.toggleClass('age date');};
|
|
|
|
if(isWatched){
|
|
jQuery.extend(options, {
|
|
selectorSort: '.tablesorter-header-inside',
|
|
headerTemplate: '<div class="tablesorter-header-inside" style="margin:0 -8px 0 -4px">{content}{icon}</div>',
|
|
onRenderTemplate: function(index, template){
|
|
if(0 === index){
|
|
template = '<i id="watched-date" class="icon-glyph date add-qtip" title="Change date layout" style="float:left;margin:4px -14px 0 2px"></i>'
|
|
+ template;
|
|
}
|
|
return template;
|
|
},
|
|
onRenderHeader: function(){
|
|
var table$ = $('#history-table'), glyph$ = $('#watched-date');
|
|
if($.tablesorter.storage(table$, 'isLayoutAge')){
|
|
stateLayoutDate(table$, glyph$);
|
|
}
|
|
$(this).find('#watched-date').on('click', function(){
|
|
stateLayoutDate(table$, glyph$);
|
|
$.tablesorter.storage(table$, 'isLayoutAge', table$.hasClass('event-age'));
|
|
return !1;
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
$('#history-table').tablesorter(options).bind('filterEnd', function(){
|
|
rowCount();
|
|
});
|
|
|
|
$('#limit').change(function(){
|
|
window.location.href = $.SickGear.Root + '/history/?limit=' + $(this).val()
|
|
});
|
|
|
|
$('#show-watched-help').click(function () {
|
|
$('#watched-help').fadeToggle('fast', 'linear');
|
|
$.get($.SickGear.Root + '/history/toggle_help');
|
|
});
|
|
|
|
var addQTip = (function(){
|
|
$(this).css('cursor', 'help');
|
|
$(this).qtip({
|
|
show: {solo:true},
|
|
position: {viewport:$(window), my:'left center', adjust:{y: -10, x: 2}},
|
|
style: {tip: {corner:true, method:'polygon'}, classes:'qtip-dark qtip-rounded qtip-shadow'}
|
|
});
|
|
});
|
|
$('.add-qtip').each(addQTip);
|
|
|
|
$.SickGear.sumChecked = (function(){
|
|
var dedupe = [], sum = 0, output;
|
|
|
|
$('.del-check:checked').each(function(){
|
|
if ($(this).closest('tr').find('.tvShow .strike-deleted').length)
|
|
return;
|
|
var pathFile = $(this).closest('tr').attr('data-file');
|
|
if (-1 === jQuery.inArray(pathFile, dedupe)) {
|
|
dedupe.push(pathFile);
|
|
output = $(this).closest('td').prev('td.size').find('span[data-sort]').attr('data-sort');
|
|
sum = sum + parseInt(output, 10);
|
|
}
|
|
});
|
|
$('#del-watched').attr('disabled', !dedupe.length && !$('#tbody').find('tr').find('.tvShow .strike-deleted').length);
|
|
|
|
output = filesize(sum, {symbols: {B: 'Bytes'}});
|
|
$('#sum-size').text(/\s(MB)$/.test(output) ? filesize(sum, {round:1})
|
|
: /^1\sB/.test(output) ? output.replace('Bytes', 'Byte') : output);
|
|
});
|
|
$.SickGear.sumChecked();
|
|
|
|
var className='.del-check', lastCheck = null, check, found;
|
|
tbody$.on('click', className, function(ev){
|
|
if(!lastCheck || !ev.shiftKey){
|
|
lastCheck = this;
|
|
} else {
|
|
check = this; found = 0;
|
|
$('#tbody').find('> tr:visible').find(className).each(function(){
|
|
if (2 === found)
|
|
return !1;
|
|
if (1 === found)
|
|
this.checked = lastCheck.checked;
|
|
found += (1 && (this === check || this === lastCheck));
|
|
});
|
|
}
|
|
$(this).closest('table').trigger('update');
|
|
$.SickGear.sumChecked();
|
|
});
|
|
|
|
$('.shows-less').click(function(){
|
|
var table$ = $(this).nextAll('table:first');
|
|
table$ = table$.length ? table$ : $(this).parent().nextAll('table:first');
|
|
table$.hide();
|
|
$(this).hide();
|
|
$(this).prevAll('input:first').show();
|
|
});
|
|
$('.shows-more').click(function(){
|
|
var table$ = $(this).nextAll('table:first');
|
|
table$ = table$.length ? table$ : $(this).parent().nextAll('table:first');
|
|
table$.show();
|
|
$(this).hide();
|
|
$(this).nextAll('input:first').show();
|
|
});
|
|
|
|
$('.provider-retry').click(function () {
|
|
$(this).addClass('disabled');
|
|
var match = $(this).attr('id').match(/^(.+)-btn-retry$/);
|
|
$.ajax({
|
|
url: $.SickGear.Root + '/manage/manageSearches/retryProvider?provider=' + match[1],
|
|
type: 'GET',
|
|
complete: function () {
|
|
window.location.reload(true);
|
|
}
|
|
});
|
|
});
|
|
|
|
$('.provider-failures').tablesorter({widgets : ['zebra'],
|
|
headers : { 0:{sorter:!1}, 1:{sorter:!1}, 2:{sorter:!1}, 3:{sorter:!1}, 4:{sorter:!1}, 5:{sorter:!1} }
|
|
});
|
|
|
|
$('.provider-fail-parent-toggle').click(function(){
|
|
$(this).closest('tr').nextUntil('tr:not(.tablesorter-childRow)').find('td').toggle();
|
|
return !1;
|
|
});
|
|
|
|
// Make table cell focusable
|
|
// http://css-tricks.com/simple-css-row-column-highlighting/
|
|
var focus$ = $('.focus-highlight');
|
|
if (focus$.length){
|
|
focus$.find('td, th')
|
|
.attr('tabindex', '1')
|
|
// add touch device support
|
|
.on('touchstart', function(){
|
|
$(this).focus();
|
|
});
|
|
}
|
|
});
|