mirror of
https://github.com/SickGear/SickGear.git
synced 2024-12-26 20:53:38 +00:00
9009cc7a7b
Add a Select2 drop-down to `add-shows` and `edit-show`. The Select2 enables displaying inline language flag images, this feature deprecated by the native `select` drop-down element on some browsers. Change run existing TVInfo source language lists through validation (removes ~4 bad items), de-dupe list, get the native names, English names, and three letter abbr. Change remove marisa-trie requirement from language_data/names.py because nothing in SG calls a function that requires it. Change update some flags.
395 lines
13 KiB
JavaScript
395 lines
13 KiB
JavaScript
/** @namespace $.SickGear.Root */
|
|
/** @namespace config.showLang */
|
|
/** @namespace config.showIsAnime */
|
|
/** @namespace config.expandIds */
|
|
/*globals $, config, sbRoot, generateAniGroupList*/
|
|
|
|
$(document).ready(function () {
|
|
|
|
$('#location').fileBrowser({title: 'Select Show Location'});
|
|
String.prototype.padLeft = function padLeft(length, leadingChar) {
|
|
if (undefined === leadingChar) leadingChar = '0';
|
|
return this.length < length ? (leadingChar + this).padLeft(length, leadingChar) : this;
|
|
};
|
|
|
|
function htmlFlag(lang) {
|
|
return ' class="flag" style="background-image:url(' + $.SickGear.Root + '/images/flags/' + lang + '.png)"'
|
|
}
|
|
|
|
function uriFlag(lang) {
|
|
return $.SickGear.Root + '/images/flags/' + lang + '.png'
|
|
}
|
|
|
|
$.getJSON($.SickGear.Root + '/add-shows/get-infosrc-languages', {}, function (data) {
|
|
var htmlText = '', currentLangAdded = '',
|
|
selected = ' selected="selected"', htmlSelected = '',
|
|
elInfosrcLang = $('#infosrc-lang-select'),
|
|
useSelect2 = 0 < data.results_ext.length, populateItem;
|
|
|
|
if (!data.results.length && !data.results_ext.length) {
|
|
htmlText = '<option value="' + config.showLang + '"' + selected + htmlFlag(config.showLang) + '>'
|
|
+ config.showLang + '</option>';
|
|
} else {
|
|
currentLangAdded = !1;
|
|
if (useSelect2){
|
|
// 3 letter abbr object
|
|
$.each(data.results_ext, function (index, obj) {
|
|
|
|
htmlSelected = '';
|
|
if (obj.std_abbr === config.showLang) {
|
|
currentLangAdded = !0;
|
|
htmlSelected = selected;
|
|
}
|
|
|
|
htmlText += '<option style="padding-left:25px" value="' + obj.std_abbr + '"'
|
|
+ ' data-abbr="' + obj.abbr + '"'
|
|
+ ' data-img="' + uriFlag(obj.std_abbr) + '"'
|
|
+ ' data-title="' + obj.en + ' (' + obj.orig_abbr + '/' + obj.std_abbr + '/' + obj.abbr + ')' + '"'
|
|
+ (!!htmlSelected
|
|
? htmlSelected + '>> '
|
|
: '>')
|
|
+ obj.native
|
|
+ '</option>';
|
|
});
|
|
} else {
|
|
// legacy 2 letter abbr list
|
|
$.each(data.results, function (index, strLang) {
|
|
|
|
htmlSelected = '';
|
|
if (strLang === config.showLang) {
|
|
currentLangAdded = !0;
|
|
htmlSelected = selected;
|
|
}
|
|
|
|
htmlText += '<option value="' + strLang + '"' + htmlSelected + htmlFlag(strLang) + '>'
|
|
+ strLang + '</option>';
|
|
});
|
|
}
|
|
if (!currentLangAdded)
|
|
htmlText += '<option value="' + config.showLang + '" ' + selected + '>' + config.showLang + '</option>';
|
|
}
|
|
|
|
elInfosrcLang.html(htmlText);
|
|
|
|
if (useSelect2) {
|
|
populateItem = function (data) {
|
|
if (!!data.element)
|
|
return $('<span class="flag"'
|
|
+ ' style="background-image:url(' + $(data.element).data('img') + ')"'
|
|
+ ' title="' + $(data.element).data('title') + '">'
|
|
+ data.text
|
|
+ '</span>');
|
|
return data.text;
|
|
}
|
|
elInfosrcLang.select2({templateResult: populateItem, templateSelection: populateItem, width: 162});
|
|
}
|
|
});
|
|
|
|
function getExceptions() {
|
|
var allExceptions = [];
|
|
|
|
$('#exceptions_list').find('option').each(function () {
|
|
allExceptions.push($(this).val());
|
|
});
|
|
|
|
return allExceptions
|
|
}
|
|
|
|
function okExit(action){
|
|
return ('the-main' === ($('input[name="set-main"]:checked').attr('id') || 'the-main')
|
|
|| confirm('A "set main" change is pending\n\n' + action + ' without saving changes?'))
|
|
}
|
|
|
|
$('a:contains("Cancel Edit")').on('click', function () {
|
|
if (!okExit('Cancel')) return !1;
|
|
});
|
|
|
|
$('#submit').on('click', function () {
|
|
if (!okExit('Update')) return !1;
|
|
$('#exceptions_list').val(getExceptions());
|
|
if (config.showIsAnime)
|
|
generateAniGroupList();
|
|
});
|
|
|
|
$('#addSceneName').on('click', function () {
|
|
var elSceneName = $('#SceneName'), elSceneNameSeason = $('#SceneNameSeason'),
|
|
sceneEx = elSceneName.val(), sceneExSeason = elSceneNameSeason.val();
|
|
|
|
elSceneName.val('');
|
|
elSceneNameSeason.val('');
|
|
|
|
if (-1 < $.inArray(sceneExSeason + '|' + sceneEx, getExceptions()) || ('' === sceneEx))
|
|
return;
|
|
|
|
$('#SceneException').fadeIn('fast', 'linear');
|
|
|
|
var option = $('<option>');
|
|
if (null === sceneExSeason)
|
|
sceneExSeason = '-1';
|
|
option.val(sceneExSeason + '|' + sceneEx);
|
|
option.html(('S' + ('-1' === sceneExSeason ? '*' : sceneExSeason.padLeft(2)) + ': ') + sceneEx);
|
|
|
|
return option.appendTo($('#exceptions_list'));
|
|
});
|
|
|
|
$('#removeSceneName').on('click', function () {
|
|
$('#exceptions_list').find('option:selected').remove();
|
|
|
|
$(this).toggle_SceneException();
|
|
});
|
|
|
|
/** @namespace data.text */
|
|
$('#export-alts').on('click', function (e) {
|
|
e.preventDefault();
|
|
|
|
var that$ = $(this);
|
|
that$.attr('disabled', 'disabled');
|
|
$.getJSON(sbRoot + '/config/general/export-alt', {'tvid_prodid': $('#tvid_prodid').val()},
|
|
function (data) {
|
|
if (data.text) {
|
|
$.confirm({
|
|
'title' : 'Export names/numbers',
|
|
'message' : 'Copy/paste the following for export...' +
|
|
'<div><pre style="width:95%;margin:0 auto;max-height:250px">' + data.text + '</pre></div>',
|
|
'buttons' : {
|
|
'close' : {
|
|
'class' : 'green',
|
|
'action': function(){} // Nothing to do in this case. You can as well omit the action property.
|
|
}
|
|
}
|
|
});
|
|
}
|
|
that$.removeAttr('disabled');
|
|
});
|
|
});
|
|
|
|
$.fn.toggle_SceneException = function () {
|
|
var elSceneException = $('#SceneException');
|
|
|
|
if (0 === getExceptions().length)
|
|
elSceneException.fadeOut('fast', 'linear');
|
|
else
|
|
elSceneException.fadeIn('fast', 'linear');
|
|
};
|
|
|
|
$(this).toggle_SceneException();
|
|
|
|
var elABD = $('#air_by_date'), elScene = $('#scene'), elSports = $('#sports'), elAnime = $('#anime'),
|
|
elIdMap = $('#idmapping');
|
|
|
|
function uncheck(el) {el.prop('checked', !1)}
|
|
function checked(el) {return el.prop('checked')}
|
|
|
|
function isAnime() {
|
|
uncheck(elABD); uncheck(elSports);
|
|
if (config.showIsAnime) { $('#anigrouplists').fadeIn('fast', 'linear'); } return !0; }
|
|
function isScene() { uncheck(elABD); uncheck(elSports); }
|
|
function isABD() { uncheck(elAnime); uncheck(elScene); $('#anigrouplists, #anime-options').fadeOut('fast', 'linear'); }
|
|
function isSports() { uncheck(elAnime); uncheck(elScene); $('#anigrouplists, #anime-options').fadeOut('fast', 'linear'); }
|
|
|
|
if (checked(elAnime)) { isAnime(); }
|
|
if (checked(elScene)) { isScene(); }
|
|
if (checked(elABD)) { isABD(); }
|
|
if (checked(elSports)) { isSports(); }
|
|
|
|
elAnime.on('click', function() {
|
|
if (checked(elAnime))
|
|
isAnime() && !config.showIsAnime && $('#anime-options').fadeIn('fast', 'linear');
|
|
else
|
|
$('#anigrouplists, #anime-options').fadeOut('fast', 'linear');
|
|
});
|
|
elIdMap.on('click', function() {
|
|
var elMapOptions = $('#idmapping-options'), anim = {fast: 'linear'};
|
|
if (checked(elIdMap))
|
|
elMapOptions.fadeIn(anim);
|
|
else
|
|
elMapOptions.fadeOut(anim);
|
|
});
|
|
elScene.on('click', function() { isScene(); });
|
|
elABD.on('click', function() { isABD(); });
|
|
elSports.on('click', function() { isSports() });
|
|
|
|
if (config.expandIds) { elIdMap.click(); }
|
|
|
|
function undef(value) {
|
|
return /undefined/i.test(typeof(value));
|
|
}
|
|
|
|
function updateSrcLinks() {
|
|
|
|
var preventSave = !1, search = 'data-search';
|
|
$('[id^=mid-], #source-id').each(function (i, selected) {
|
|
var elSelected = $(selected),
|
|
okDigits = !(/[^\d]/.test(elSelected.val()) || ('' === elSelected.val())),
|
|
service = (('source-id' === elSelected.attr('id')) ? '#src-' + elSelected.attr('name') : '#src-' + elSelected.attr('id')),
|
|
elLock = $('#lockid-' + service.replace(/.*?(\d+)$/, '$1')),
|
|
elService = $(service),
|
|
On = 'data-', Off = '', linkOnly = !1, newLink = '';
|
|
|
|
if (okDigits) {
|
|
if (0 < parseInt(elSelected.val(), 10)) {
|
|
On = ''; Off = 'data-';
|
|
} else {
|
|
linkOnly = !0
|
|
}
|
|
}
|
|
$.each(['href', 'title', 'onclick'], function(i, attr) {
|
|
if ('n' === elService.attr(search)) {
|
|
elService.attr(On + attr, elService.attr(Off + attr)).removeAttr(Off + attr);
|
|
}
|
|
if (linkOnly)
|
|
elService.attr(attr, elService.attr(search + '-' + attr));
|
|
elService.attr(search, linkOnly ? 'y' : 'n')
|
|
});
|
|
var title;
|
|
if (('' === Off) && !linkOnly) {
|
|
preventSave = !0;
|
|
title = elSelected.attr('title');
|
|
if (!/undefined/.test(title))
|
|
elSelected.attr({'data-title': title});
|
|
elSelected.addClass('warning').attr({title: 'Use digits (0-9)'});
|
|
elLock.prop('disabled', !0);
|
|
} else {
|
|
title = elSelected.attr('data-title');
|
|
if (!/undefined/.test(title))
|
|
elSelected.attr({'title': title}).removeAttr('data-title');
|
|
else
|
|
elSelected.removeClass('warning').removeAttr('title');
|
|
elLock.prop('disabled', !1);
|
|
if (!undef(elService.attr('href'))) {
|
|
if (!undef(elService.attr('data-href')) && linkOnly) {
|
|
newLink = elService.attr(search + '-href');
|
|
} else {
|
|
newLink = elService.attr((undef(elService.attr('data-href')) ? '' : 'data-')
|
|
+ 'href').replace(/(.*?)\d+/, '$1') + elSelected.val();
|
|
}
|
|
elService.attr('href', newLink);
|
|
}
|
|
}
|
|
});
|
|
$('#save-mapping').prop('disabled', preventSave);
|
|
}
|
|
|
|
$('[id^=mid-], #source-id').on('input', function() {
|
|
updateSrcLinks();
|
|
});
|
|
|
|
function saveMapping(paused, markWanted) {
|
|
var sbutton = $(this), mid = $('[id^=mid-]'), lock = $('[id^=lockid-]'),
|
|
allf = $('[id^=mid-], [id^=lockid-], #reset-mapping, [name^=set-main]'),
|
|
radio = $('[name^=set-main]:checked'), isMain = !radio.length || ('the-main' === radio.attr('id') && $.trim($('#source-id').val()) == $('#prodid').val()),
|
|
panelSaveGet = $('#panel-save-get'), saveWait = $('#save-wait');
|
|
|
|
allf.prop('disabled', !0);
|
|
sbutton.prop('disabled', !0);
|
|
var param = {'tvid_prodid': $('#tvid_prodid').val()};
|
|
mid.each(function (i, selected) {
|
|
param[$(selected).attr('id')] = $(selected).val();
|
|
});
|
|
lock.each(function (i, selected) {
|
|
param[$(selected).attr('id')] = $(selected).prop('checked');
|
|
});
|
|
param['tvid'] = $('#tvid').val();
|
|
if (!isMain) {
|
|
param['m_tvid'] = radio.attr('data-tvid');
|
|
param['m_prodid'] = $.trim(radio.closest('span').find('input:text').val());
|
|
param['paused'] = paused ? '1' : '0';
|
|
param['markwanted'] = markWanted ? '1' : '0';
|
|
panelSaveGet.removeClass('show').addClass('hide');
|
|
saveWait.removeClass('hide').addClass('show');
|
|
}
|
|
|
|
$.getJSON(sbRoot + '/home/save-mapping', param)
|
|
.done(function (data) {
|
|
allf.prop('disabled', !1);
|
|
sbutton.prop('disabled', !1);
|
|
panelSaveGet.removeClass('hide').addClass('show');
|
|
saveWait.removeClass('show').addClass('hide');
|
|
if (undef(data.error)) {
|
|
$.each(data.map, function (i, item) {
|
|
$('#mid-' + i).val(item.id);
|
|
$('#lockid-' + i).prop('checked', -100 === item.status)
|
|
});
|
|
/** @namespace data.switch */
|
|
/** @namespace data.switch.mtvid_prodid */
|
|
if (!isMain && data.hasOwnProperty('switch') && data.switch.hasOwnProperty('Success')) {
|
|
window.location.replace(sbRoot + '/home/view-show?tvid_prodid=' + $('#tvid_prodid').val());
|
|
// window.location.replace(sbRoot + '/home/view-show?tvid_prodid=' + data.mtvid_prodid);
|
|
} else if ((0 < $('*[data-maybe-main=1]').length)
|
|
&& (((0 === $('[name^=set-main]').length) && (0 < $('*[data-maybe-main=1]').val()))
|
|
|| ((0 < $('[name^=set-main]').length) && (0 === $('*[data-maybe-main=1]').val())))) {
|
|
location.reload();
|
|
}
|
|
}})
|
|
.fail(function () {
|
|
allf.prop('disabled', !1);
|
|
sbutton.prop('disabled', !1);
|
|
});
|
|
}
|
|
|
|
function resetMapping() {
|
|
var fbutton = $(this), mid = $('[id^=mid-]'), lock = $('[id^=lockid-]'),
|
|
allf = $('[id^=mid-], [id^=lockid-], #save-mapping, [name^=set-main]');
|
|
|
|
allf.prop('disabled', !0);
|
|
fbutton.prop('disabled', !0);
|
|
|
|
var param = {'tvid_prodid': $('#tvid_prodid').val()};
|
|
mid.each(function (i, selected) {
|
|
param[$(selected).attr('id')] = $(selected).val();
|
|
});
|
|
|
|
lock.each(function (i, selected) {
|
|
param[$(selected).attr('id')] = $(selected).prop('checked');
|
|
});
|
|
|
|
$.getJSON(sbRoot + '/home/force-mapping', param)
|
|
.done(function (data) {
|
|
allf.prop('disabled', !1);
|
|
fbutton.prop('disabled', !1);
|
|
if (undef(data.error)) {
|
|
$('#the-main').prop('checked', !0).trigger('click');
|
|
$.each(data, function (i, item) {
|
|
$('#mid-' + i).val(item.id);
|
|
$('#lockid-' + i).prop('checked', -100 === item.status);
|
|
});
|
|
updateSrcLinks();
|
|
}})
|
|
.fail(function () {
|
|
allf.prop('disabled', !1);
|
|
fbutton.prop('disabled', !1);
|
|
});
|
|
}
|
|
|
|
$('#save-mapping, #reset-mapping').click(function() {
|
|
var save = /save/i.test(this.id),
|
|
radio = $('[name=set-main]:checked'), isMain = !radio.length || ('the-main' === radio.attr('id') && $.trim($('#source-id').val()) == $('#prodid').val()),
|
|
newMain = (save && !isMain),
|
|
paused = 'on' === $('#paused:checked').val(),
|
|
extraWarn = !newMain ? '' : 'Warning: Changing the main source can produce undesirable'
|
|
+ ' results if episodes do not match at old and new TV info sources<br /><br />'
|
|
+ (paused ? '' : '<input type="checkbox" id="mark-wanted" style="margin-right:6px">'
|
|
+ '<span class="red-text">Mark all added episodes Wanted to search for releases</span>'
|
|
+ '</input><br /><br />'),
|
|
checkAction = !newMain ? 'save ID changes' : 'change the TV info source';
|
|
|
|
$.confirm({
|
|
'title': save ? 'Confirm changes' : 'Get default IDs',
|
|
'message': extraWarn + 'Are you sure you want to ' + (save ? checkAction : 'fetch default IDs') + ' ?',
|
|
'buttons': {
|
|
'Yes': {
|
|
'class': 'green',
|
|
'action': function () {
|
|
save ? saveMapping(paused, 'on' === $('#mark-wanted:checked').val()) : resetMapping()
|
|
}
|
|
},
|
|
'No': {
|
|
'class': 'red',
|
|
'action': function () {}
|
|
}
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
});
|