mirror of
https://github.com/SickGear/SickGear.git
synced 2024-11-24 22:05:05 +00:00
0c0e25e73c
Fix person ids fetching Fix wrong added death dates (by allowing overwriting deathday with None if birthday is on source) Fix parsing changes to IMDb bio Update test data - Change improve efficiency when saving config.ini Change prevent saving unchanged config.ini Change add flushing to config.ini file saving (configobj hack) Change add ConfigEvents queue for saving the config ini more efficiently Change catch other errors for saving config - Change improve efficiency when saving viewshow glide Change don't call '/home/set-display-show-glide' in the first place if there is no reason (params) to do so Change add sanity check for set_display_show_glide, only save changed values
572 lines
17 KiB
JavaScript
572 lines
17 KiB
JavaScript
/** @namespace $.SickGear.Root */
|
|
/** @namespace $.SickGear.glideFancyBoxOpen */
|
|
/** @namespace config.TVShowList */
|
|
/** @namespace config.useIMDbInfo */
|
|
/** @namespace $.SickGear.config.useFuzzy */
|
|
/** @namespace $.SickGear.config.dateFormat */
|
|
/** @namespace $.SickGear.config.timeFormat */
|
|
/** @namespace $.SickGear.config.fuzzyTrimZero */
|
|
/** @namespace $.SickGear.config.glideStartAt */
|
|
/** @namespace $.SickGear.config.glideSlideTime */
|
|
$(document).ready(function() {
|
|
|
|
// handle the show selection dropbox
|
|
var select$ = $('#pickShow'), populateItem;
|
|
select$.change(function() {
|
|
var val = $(this).val();
|
|
if (0 !== val)
|
|
window.location.href = $.SickGear.Root + '/home/view-show?tvid_prodid=' + val;
|
|
});
|
|
populateItem = function(data) {
|
|
if (!data.element || !$(data.element).hasClass('ended')) {
|
|
return data.text;
|
|
}
|
|
return $('<span class="ended"><span class="label" title="">ended</span> <i>' + data.text + '</i></span>');
|
|
}
|
|
// https://github.com/bevacqua/fuzzysearch
|
|
function fuzzysearch(needle, haystack) {
|
|
var hlen = haystack.length;
|
|
var nlen = needle.length;
|
|
if (nlen > hlen) {
|
|
return false;
|
|
}
|
|
if (nlen === hlen) {
|
|
return needle === haystack;
|
|
}
|
|
outer: for (var i = 0, j = 0; i < nlen; i++) {
|
|
var nch = needle.charCodeAt(i);
|
|
while (j < hlen) {
|
|
if (haystack.charCodeAt(j++) === nch) {
|
|
continue outer;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
const white_space_regex = /\W/gui;
|
|
function sel_matcher(params, data) {
|
|
|
|
// If there are no search terms, return all of the data
|
|
if ($.trim(params.term) === '') {
|
|
return data;
|
|
}
|
|
|
|
// Do not display the item if there is no 'text' property
|
|
if (typeof data.text === 'undefined') {
|
|
return null;
|
|
}
|
|
|
|
// `params.term` should be the term that is used for searching
|
|
var param_term = params.term.toLowerCase().trim().replace(white_space_regex, '');
|
|
|
|
if ('undefined' !== typeof data.children) {
|
|
// `data.children` contains options to match against
|
|
var filteredChildren = [];
|
|
$.each(data.children, function (idx, child) {
|
|
// `child.text` is the text that is displayed for the data object
|
|
var param_data = child.text.toLowerCase().trim().replace(white_space_regex, '');
|
|
|
|
if (fuzzysearch(param_term, param_data)) {
|
|
filteredChildren.push(child);
|
|
}
|
|
});
|
|
|
|
// If any of the group's children match,
|
|
// then set the matched children on the group and return the group object
|
|
if (filteredChildren.length) {
|
|
var modifiedData = $.extend({}, data, true);
|
|
modifiedData.children = filteredChildren;
|
|
|
|
// You can return modified objects from here
|
|
// This includes matching the `children` how you want in nested data sets
|
|
return modifiedData;
|
|
}
|
|
}
|
|
|
|
// `data.text` is the text that is displayed for the data object
|
|
var param_data = data.text.toLowerCase().trim().replace(white_space_regex, '');
|
|
if (fuzzysearch(param_term, param_data)) {
|
|
var modifiedData = $.extend({}, data, true);
|
|
|
|
// You can return modified objects from here
|
|
// This includes matching the `children` how you want in nested data sets
|
|
return modifiedData;
|
|
}
|
|
|
|
// Return `null` if the term should not be displayed
|
|
return null;
|
|
}
|
|
|
|
select$.select2({templateResult: populateItem, templateSelection:populateItem, matcher: sel_matcher});
|
|
|
|
$('#prevShow, #nextShow').on('click', function() {
|
|
var select$ = $('#pickShow'),
|
|
index = $.inArray(select$.find('option:selected').val(), config.TVShowList);
|
|
//noinspection JSUnresolvedVariable
|
|
select$.find('option[value="' + config.TVShowList[('nextShow' === $(this).attr('id')
|
|
? (index < config.TVShowList.length - 1 ? index + 1 : 0)
|
|
: (0 < index ? index - 1 : config.TVShowList.length - 1))] + '"]').prop('selected', !0);
|
|
select$.change();
|
|
return !1;
|
|
});
|
|
|
|
$('#seasonJump').change(function() {
|
|
var id = $(this).val();
|
|
if (id && 'jump' != id) {
|
|
$('html,body').animate({scrollTop: $(id).offset().top}, 'slow');
|
|
location.hash = id;
|
|
}
|
|
$(this).val('jump');
|
|
});
|
|
|
|
var slideGap = 5,
|
|
slideCount = $('.cast').length;
|
|
|
|
if (0 < slideCount) {
|
|
|
|
function slideTime(){
|
|
return 0 < $.SickGear.config.glideSlideTime && !$.SickGear.glideFancyBoxOpen
|
|
? $.SickGear.config.glideSlideTime : !1;
|
|
}
|
|
|
|
$.calcSlideCount = function(initSet){
|
|
var maxCount = Math.floor($('.glide__track').width() / (170 + slideGap)),
|
|
perView = maxCount < slideCount ? maxCount : slideCount;
|
|
if (initSet)
|
|
return {perView: perView, isNotEnd: maxCount < slideCount};
|
|
|
|
if (maxCount < slideCount) {
|
|
$.glide.update({perView: perView, autoplay: slideTime()});
|
|
if (slideTime()){
|
|
$.glide.play();
|
|
}
|
|
} else {
|
|
$.glide.pause();
|
|
$.glide.update({perView: perView, autoplay: !1});
|
|
$.glide.go('=0');
|
|
}
|
|
}
|
|
|
|
var initGlideVars = $.calcSlideCount(!0),
|
|
startAt = $('.cast[data-rid="' + $.SickGear.config.glideStartAt + '"]').index();
|
|
$.glide = new Glide('.cast-holder', {
|
|
type: 'carousel',
|
|
gap: slideGap,
|
|
startAt: -1 === startAt ? 0 : startAt,
|
|
peek: 0,
|
|
perSwipe: '|',
|
|
perView: initGlideVars.perView,
|
|
autoplay: initGlideVars.isNotEnd && slideTime()
|
|
});
|
|
|
|
$.glide.on('resize', function(){
|
|
$.calcSlideCount(!1);
|
|
$('#display-show .cast-bg').each(function (i, oImage){
|
|
scaleImage(oImage);
|
|
});
|
|
});
|
|
|
|
$.glide.on('run.after', function(){
|
|
saveGlide();
|
|
});
|
|
|
|
function initFancybox(){
|
|
try {
|
|
setupFancyBox();
|
|
} catch {
|
|
var fancy = $.SickGear.Root + '/js/fancybox/jquery.fancybox.min';
|
|
$.getScript(fancy + '.js', function() {
|
|
$('head').append('<link rel="stylesheet" href="' + fancy + '.css">');
|
|
setupFancyBox();
|
|
});
|
|
}
|
|
}
|
|
|
|
function setupFancyBox(){
|
|
if (!!$('a[rel="glide"]').length){
|
|
$().fancybox(jQuery.extend({
|
|
selector: 'li:not(.glide__slide--clone) a[rel="glide"]',
|
|
slideShow: {
|
|
speed: Math.abs($.SickGear.config.glideSlideTime)
|
|
},
|
|
afterShow: function(instance, slide){
|
|
$.SickGear.glideFancyBoxOpen = !0;
|
|
$.glide.go('=' + slide.index);
|
|
},
|
|
beforeShow: function(instance, slide){
|
|
if (!$.SickGear.glideFancyBoxOpen && 0 < $.SickGear.config.glideSlideTime){
|
|
$.glide.pause();
|
|
$.glide.update({autoplay: !1});
|
|
}
|
|
},
|
|
afterClose: function(instance, slide){
|
|
if (!!$.SickGear.glideFancyBoxOpen){
|
|
$.SickGear.glideFancyBoxOpen = !1;
|
|
if (0 < $.SickGear.config.glideSlideTime){
|
|
$.calcSlideCount(!1);
|
|
}
|
|
}
|
|
},
|
|
}, $.sgFancyBoxOptions));
|
|
}
|
|
}
|
|
|
|
$.glide.on('build.after', function(){
|
|
initFancybox();
|
|
$('.cast.glide__slide').removeClass('last');
|
|
$('.cast.glide__slide:not(.glide__slide--clone):last').addClass('last');
|
|
$('.cast.body .cast-bg, #pin-glide, .glide-arrows, .cast.body .links').fadeIn('slow', 'linear');
|
|
$('#about-hide').addClass('hide');
|
|
$('#about-show').removeClass('hide');
|
|
$('.glide__slide--clone').click(function(){
|
|
$('li[data-rid="' + $(this).data('rid') + '"]:not(.glide__slide--clone) a[rel="glide"]')[0].click();
|
|
return !1;
|
|
});
|
|
$('#display-show .cast-bg').each(function (i, oImage){
|
|
scaleImage(oImage);
|
|
});
|
|
});
|
|
|
|
window.onload = function(){
|
|
$.glide.mount();
|
|
};
|
|
|
|
function saveGlide(saveTime){
|
|
if (!$.SickGear.glideFancyBoxOpen){
|
|
var params = {};
|
|
if (!slideTime()){
|
|
params = {
|
|
tvid_prodid: $('#tvid-prodid').val(),
|
|
start_at: $('.cast.glide__slide--active').data('rid')
|
|
};
|
|
}
|
|
if (saveTime){
|
|
params.slidetime = $.SickGear.config.glideSlideTime;
|
|
}
|
|
if (!$.isEmptyObject(params)){
|
|
$.get($.SickGear.Root + '/home/set-display-show-glide', params);
|
|
}
|
|
}
|
|
}
|
|
|
|
var ivTimes = [10000, 6000, 3000];
|
|
function pinState(el$){
|
|
var ivTime = slideTime();
|
|
|
|
el$.removeClass('one two three four');
|
|
if (!ivTime) {
|
|
el$.addClass('one');
|
|
} else if (ivTimes[0] === ivTime) {
|
|
el$.addClass('two');
|
|
} else if (ivTimes[1] === ivTime) {
|
|
el$.addClass('three');
|
|
} else {
|
|
el$.addClass('four');
|
|
}
|
|
}
|
|
|
|
var pinGlide$ = $('#pin-glide');
|
|
pinState(pinGlide$);
|
|
pinGlide$.on('click', function (){
|
|
var ivTime = slideTime();
|
|
|
|
if (!ivTime) { // unpause as was paused when clicked
|
|
$.SickGear.config.glideSlideTime *= -1;
|
|
} else if (ivTimes[0] === ivTime) {
|
|
$.SickGear.config.glideSlideTime = ivTimes[1];
|
|
} else if (ivTimes[1] === ivTime) {
|
|
$.SickGear.config.glideSlideTime = ivTimes[2];
|
|
} else {
|
|
$.SickGear.config.glideSlideTime = -1 * ivTimes[0];
|
|
}
|
|
pinState($(this));
|
|
$.calcSlideCount(!1);
|
|
saveGlide(!0);
|
|
});
|
|
}
|
|
|
|
$('.details-plot').collapser({
|
|
mode: 'lines',
|
|
truncate: 10,
|
|
showText: '<i class="sgicon-arrowdown"></i>more',
|
|
hideText: '<i class="sgicon-arrowup"></i>less',
|
|
showClass: 'show-class'
|
|
});
|
|
|
|
if (config.useIMDbInfo){
|
|
$.fn.generateStars = function() {
|
|
return this.each(function(i,e){$(e).html($('<span/>').width($(e).text()*12));});
|
|
};
|
|
$('.imdbstars').generateStars();
|
|
}
|
|
|
|
$('#changeStatus').on('click', function() {
|
|
var epArr = [];
|
|
|
|
$('.epCheck').each(function() {
|
|
this.checked && epArr.push($(this).attr('id'))
|
|
});
|
|
if (epArr.length)
|
|
window.location.href = $.SickGear.Root + '/home/set-show-status?tvid_prodid=' + $('#tvid-prodid').val() +
|
|
'&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val();
|
|
});
|
|
|
|
// show/hide different types of rows when the checkboxes are changed
|
|
var el = $('#checkboxControls').find('input');
|
|
el.change(function() {
|
|
$(this).showHideRows($(this).attr('id'));
|
|
});
|
|
|
|
// initially show/hide all the rows according to the checkboxes
|
|
el.each(function() {
|
|
var status = this.checked;
|
|
$('tr.' + $(this).attr('id')).each(function() {
|
|
status && $(this).show() || $(this).hide();
|
|
});
|
|
});
|
|
|
|
$.fn.showHideRows = function(whichClass) {
|
|
|
|
var status = $('#checkboxControls > input, #' + whichClass).prop('checked');
|
|
$('tr.' + whichClass).each(function() {
|
|
status && $(this).show() || $(this).hide();
|
|
});
|
|
|
|
// hide season headers with no episodes under them
|
|
$('tr.seasonheader').each(function() {
|
|
var numRows = 0;
|
|
var seasonNo = $(this).attr('id');
|
|
$('tr.' + seasonNo + ' :visible').each(function() {
|
|
numRows++
|
|
});
|
|
var el = $('#' + seasonNo + '-cols');
|
|
if (0 == numRows) {
|
|
$(this).hide();
|
|
el.hide();
|
|
} else {
|
|
$(this).show();
|
|
el.show();
|
|
}
|
|
|
|
});
|
|
};
|
|
|
|
function checkState(state){
|
|
$('.epCheck:visible, .seasonCheck:visible').prop('checked', state)
|
|
}
|
|
// selects all visible episode checkboxes.
|
|
$('.seriesCheck').on('click', function() { checkState(!0); });
|
|
|
|
// clears all visible episode checkboxes and the season selectors
|
|
$('.clearAll').on('click', function() { checkState(!1); });
|
|
|
|
function setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) {
|
|
var show = $('#tvid-prodid').val();
|
|
|
|
if ('' === sceneSeason) sceneSeason = null;
|
|
if ('' === sceneEpisode) sceneEpisode = null;
|
|
|
|
$.getJSON($.SickGear.Root + '/home/set-scene-numbering',
|
|
{
|
|
'tvid_prodid': show,
|
|
'for_season': forSeason,
|
|
'for_episode': forEpisode,
|
|
'scene_season': sceneSeason,
|
|
'scene_episode': sceneEpisode
|
|
},
|
|
function(data) {
|
|
// Set the values we get back
|
|
var value = ((null === data.sceneSeason || null === data.sceneEpisode)
|
|
? '' : data.sceneSeason + 'x' + data.sceneEpisode);
|
|
$(document.getElementById('sceneSeasonXEpisode_' + show + '_' + forSeason + '_' + forEpisode))
|
|
.val(value).attr('value', value);
|
|
if (!data.success)
|
|
alert(data.errorMessage ? data.errorMessage : 'Update failed.');
|
|
}
|
|
);
|
|
}
|
|
|
|
function setAbsoluteSceneNumbering(forSeason, forEpisode, sceneAbsolute) {
|
|
var show = $('#tvid-prodid').val();
|
|
|
|
if ('' === sceneAbsolute)
|
|
sceneAbsolute = null;
|
|
|
|
$.getJSON($.SickGear.Root + '/home/set-scene-numbering',
|
|
{
|
|
'tvid_prodid': show,
|
|
'for_season': forSeason,
|
|
'for_episode': forEpisode,
|
|
'scene_absolute': sceneAbsolute
|
|
},
|
|
function(data) {
|
|
// Set the values we get back
|
|
var value = (null === data.sceneAbsolute ? '' : data.sceneAbsolute);
|
|
$(document.getElementById('sceneAbsolute_' + show + '_' + forSeason + '_' + forEpisode))
|
|
.val(value).attr('value', value);
|
|
if (!data.success)
|
|
alert(data.errorMessage ? data.errorMessage : 'Update failed.');
|
|
}
|
|
);
|
|
}
|
|
|
|
function qTips(select$){
|
|
select$.each(function() {
|
|
$(this).qtip({
|
|
show: {solo:true},
|
|
position: {viewport:$(window), my:'left center', adjust:{y:-10, x:2}},
|
|
style: {classes:'qtip-dark qtip-rounded qtip-shadow qtip-maxwidth'}
|
|
});
|
|
});
|
|
}
|
|
qTips($('.addQTip'));
|
|
|
|
function tableInit(table$) {
|
|
$('#sbRoot').ajaxEpSearch();
|
|
$('#sbRoot').ajaxEpSubtitlesSearch();
|
|
|
|
if ($.SickGear.config.useFuzzy) {
|
|
fuzzyMoment({
|
|
containerClass: '.airdate',
|
|
dateHasTime: !1,
|
|
dateFormat: $.SickGear.config.dateFormat,
|
|
timeFormat: $.SickGear.config.timeFormat,
|
|
trimZero: $.SickGear.config.fuzzyTrimZero
|
|
});
|
|
}
|
|
|
|
table$.each(function (i, obj) {
|
|
$(obj).has('tbody.collapse tr').tablesorter({
|
|
widgets: ['zebra'],
|
|
selectorHeaders: '> thead tr.tablesorter-headerRow th',
|
|
textExtraction: {
|
|
'.tablesorter-ep-num': function(node) {
|
|
var n = /(\d+)\)?$/img.exec(''+$(node).find('span').text()); return (null == n ? '' : n[1]); },
|
|
'.tablesorter-ep-scene': function(node) {
|
|
var n = $(node).find('input'); return n.val() || n.attr('placeholder'); },
|
|
'.tablesorter-airdate': function(node) { return $(node).find('span').attr('data-airdate') || ''; }
|
|
},
|
|
headers: {
|
|
'.tablesorter-no-sort': {sorter: !1, parser: !1},
|
|
'.tablesorter-ep-num': {sorter: 'digit'},
|
|
'.tablesorter-airdate': {sorter: 'digit'}
|
|
}
|
|
});
|
|
|
|
$(obj).find('.seasonCheck').on('click', function() {
|
|
var seasCheck = this, seasNo = $(seasCheck).attr('id');
|
|
|
|
$(obj).find('.epCheck:visible').each(function() {
|
|
var epParts = $(this).attr('id').split('x');
|
|
if (epParts[0] == seasNo)
|
|
this.checked = seasCheck.checked
|
|
|
|
});
|
|
});
|
|
|
|
var lastCheck = null;
|
|
$(obj).find('.epCheck').on('click', function(event) {
|
|
|
|
if (!lastCheck || !event.shiftKey) {
|
|
lastCheck = this;
|
|
return;
|
|
}
|
|
|
|
var check = this, found = 0;
|
|
$(obj).find('.epCheck').each(function() {
|
|
switch(found) {
|
|
case 2:
|
|
return !1;
|
|
case 1:
|
|
this.checked = lastCheck.checked;
|
|
}
|
|
(this == check || this == lastCheck) && found++;
|
|
});
|
|
lastCheck = this;
|
|
});
|
|
|
|
qTips($(obj).find('.addQTip'));
|
|
plotter($(obj).find('.plotInfo'));
|
|
|
|
$(obj).find('.sceneSeasonXEpisode').change(function() {
|
|
// Strip non-numeric characters
|
|
$(this).val($(this).val().replace(/[^0-9xX]*/g, ''));
|
|
|
|
var forSeason = $(this).attr('data-for-season'),
|
|
forEpisode = $(this).attr('data-for-episode'),
|
|
m = $(this).val().match(/^(\d+)x(\d+)$/i),
|
|
sceneSeason = m && m[1] || null, sceneEpisode = m && m[2] || null;
|
|
|
|
setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode);
|
|
});
|
|
|
|
$(obj).find('.sceneAbsolute').change(function() {
|
|
// Strip non-numeric characters
|
|
$(this).val($(this).val().replace(/[^0-9]*/g, ''));
|
|
|
|
var forSeason = $(this).attr('data-for-season'),
|
|
forEpisode = $(this).attr('data-for-episode'),
|
|
m = $(this).val().match(/^(\d{1,4})$/i),
|
|
sceneAbsolute = m && m[1] || null;
|
|
|
|
setAbsoluteSceneNumbering(forSeason, forEpisode, sceneAbsolute);
|
|
});
|
|
});
|
|
}
|
|
tableInit($('.sickbeardTable'));
|
|
|
|
$.SickGear.season = [];
|
|
$.SickGear.run = !1;
|
|
$('button[id*="showseason-"]').on('click', function() {
|
|
var that = this, this$ = $('#' + this.id), table$ = this$.parents('.sickbeardTable');
|
|
|
|
if (0 < table$.find('tbody').find('tr').length) {
|
|
table$.toggleClass('open');
|
|
} else {
|
|
table$.find('span.images').toggleClass('hide');
|
|
this$.toggleClass('hide');
|
|
function fetchSeason() {
|
|
if (0 == $.SickGear.season.length)
|
|
return;
|
|
|
|
var season = $.SickGear.season[0];
|
|
$.SickGear.season.shift();
|
|
$.getJSON($.SickGear.Root + '/home/season-render', {'tvid_prodid': $('#tvid-prodid').val(), 'season': season},
|
|
function(data) {
|
|
if (!data.success) {
|
|
alert('Season listing failed.');
|
|
} else {
|
|
table$.find('tbody').html(data.success);
|
|
tableInit(table$);
|
|
}
|
|
table$.toggleClass('open');
|
|
this$.toggleClass('hide');
|
|
table$.find('span.images').toggleClass('hide');
|
|
fetchSeason()
|
|
}
|
|
);
|
|
}
|
|
$.SickGear.season.push(this.id);
|
|
var result = [];
|
|
$.each($.SickGear.season, function(i, e) {
|
|
if (-1 == $.inArray(e, result)) result.push(e);
|
|
});
|
|
$.SickGear.season = result;
|
|
if (!$.SickGear.run && 1 == $.SickGear.season.length) $.SickGear.run = !0 && fetchSeason();
|
|
}
|
|
return !1;
|
|
});
|
|
|
|
$('button.allseasons').on('click', function() {
|
|
$('table.sickbeardTable:not(.display-season)').each(function() {
|
|
$(this).find('button[id*="showseason-"]').click();
|
|
});
|
|
|
|
var liveStates = $('#display-show');
|
|
return liveStates.toggleClass('min'), $.get($.SickGear.Root + '/live-panel/?allseasons='
|
|
+ String.prototype.toLowerCase.apply(+liveStates.hasClass('min'))), !1;
|
|
});
|
|
|
|
});
|