diff --git a/SickBeard.py b/SickBeard.py index 2d9df1f15222031aab502e73e478522c882e2ecf..fe5bb2c77f26535f1f3ba7508fa4f1d40b22be33 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -415,9 +415,13 @@ class SickRage(object): os.setsid() # @UndefinedVariable - only available in UNIX - # Make sure I can read my own files and shut out others - prev = os.umask(0) - os.umask(prev and int('077', 8)) + # https://github.com/SiCKRAGETV/sickrage-issues/issues/2969 + # http://www.microhowto.info/howto/cause_a_process_to_become_a_daemon_in_c.html#idp23920 + # https://www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch06s08.html + # Previous code simply set the umask to whatever it was because it was ANDing instead of ORring + # Daemons traditionally run with umask 0 anyways and this should not have repercussions + os.umask(0) + # Make the child a session-leader by detaching from the terminal try: diff --git a/gui/slick/css/dark.css b/gui/slick/css/dark.css index b9ffa8e060d021a202781c0b68b1aee4f3ccb491..efcee90aa3f48f9f9d4004a2cc5da42f50d857db 100644 --- a/gui/slick/css/dark.css +++ b/gui/slick/css/dark.css @@ -1076,7 +1076,7 @@ jquery.confirm.css } /* ======================================================================= -bootstarp modal +bootstrap modal ========================================================================== */ .modal-content { @@ -1098,3 +1098,17 @@ bootstarp modal border-top-left-radius: 5px; border-top-right-radius: 5px; } + +/* ======================================================================= +bootstrap panel +========================================================================== */ + +.panel-default { + background-color: #3D3D3D; + border-color: #111111; +} + +.panel-heading { + background-color: #3D3D3D !important; + color: #FFFFFF !important; +} diff --git a/gui/slick/images/network/+globosat.png b/gui/slick/images/network/+globosat.png new file mode 100644 index 0000000000000000000000000000000000000000..b52748ec3c871595bad272a24e74ef367b2e9d54 Binary files /dev/null and b/gui/slick/images/network/+globosat.png differ diff --git a/gui/slick/images/network/canal off.png b/gui/slick/images/network/canal off.png new file mode 100644 index 0000000000000000000000000000000000000000..dc5d23fabe1a7c349fa73548ec02d0cd7171ad58 Binary files /dev/null and b/gui/slick/images/network/canal off.png differ diff --git a/gui/slick/images/network/gnt.png b/gui/slick/images/network/gnt.png new file mode 100644 index 0000000000000000000000000000000000000000..7c035db09fe284aa02a8c8b8ed50b0ec9aa3919c Binary files /dev/null and b/gui/slick/images/network/gnt.png differ diff --git a/gui/slick/images/network/hbo latin america.png b/gui/slick/images/network/hbo latin america.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4cadda4c2022c725e882d1943432bc85e29424 Binary files /dev/null and b/gui/slick/images/network/hbo latin america.png differ diff --git a/gui/slick/images/network/mtv brazil.png b/gui/slick/images/network/mtv brazil.png new file mode 100644 index 0000000000000000000000000000000000000000..3f49892da1600044ece436ca5294def158e685fe Binary files /dev/null and b/gui/slick/images/network/mtv brazil.png differ diff --git a/gui/slick/images/network/multishow.png b/gui/slick/images/network/multishow.png new file mode 100644 index 0000000000000000000000000000000000000000..28b71d1bc2830490f0f8d737bc1559a3b7240448 Binary files /dev/null and b/gui/slick/images/network/multishow.png differ diff --git a/gui/slick/images/network/record.png b/gui/slick/images/network/record.png new file mode 100644 index 0000000000000000000000000000000000000000..a123fe88676781d12ba73577faffe58aeaa5d5fe Binary files /dev/null and b/gui/slick/images/network/record.png differ diff --git a/gui/slick/images/network/rede bandeirantes.png b/gui/slick/images/network/rede bandeirantes.png new file mode 100644 index 0000000000000000000000000000000000000000..b16a2cceb0cc2fc7c5c68bc998d031713f7530f1 Binary files /dev/null and b/gui/slick/images/network/rede bandeirantes.png differ diff --git a/gui/slick/images/network/rede globo.png b/gui/slick/images/network/rede globo.png new file mode 100644 index 0000000000000000000000000000000000000000..e16c65fcc06d3d47d2877dd51f1ee829072ed25e Binary files /dev/null and b/gui/slick/images/network/rede globo.png differ diff --git a/gui/slick/images/network/sbt.png b/gui/slick/images/network/sbt.png new file mode 100644 index 0000000000000000000000000000000000000000..36368e4e19ea7f28809be7cb286ff748e7ff85c1 Binary files /dev/null and b/gui/slick/images/network/sbt.png differ diff --git a/gui/slick/images/network/tv cultura.png b/gui/slick/images/network/tv cultura.png new file mode 100644 index 0000000000000000000000000000000000000000..3d462c984a1a954d3afed866e87e3e0f7d8c9eb2 Binary files /dev/null and b/gui/slick/images/network/tv cultura.png differ diff --git a/gui/slick/images/network/universal channel.png b/gui/slick/images/network/universal channel.png index c806132243d13c2a17ba486ff1045efd3cf86501..35a0a5c51e1d92c708ac4f43b766c88decc811d1 100644 Binary files a/gui/slick/images/network/universal channel.png and b/gui/slick/images/network/universal channel.png differ diff --git a/gui/slick/images/providers/6box.png b/gui/slick/images/providers/6box.png new file mode 100644 index 0000000000000000000000000000000000000000..cf611ac5b6d154eadaf24add51e2b3b698c551cf Binary files /dev/null and b/gui/slick/images/providers/6box.png differ diff --git a/gui/slick/images/providers/6box_me.png b/gui/slick/images/providers/6box_me.png new file mode 100644 index 0000000000000000000000000000000000000000..cf611ac5b6d154eadaf24add51e2b3b698c551cf Binary files /dev/null and b/gui/slick/images/providers/6box_me.png differ diff --git a/gui/slick/images/providers/ezrss.png b/gui/slick/images/providers/ezrss.png deleted file mode 100644 index 30805041bd802f9cf8590eef2dda65114d8ff249..0000000000000000000000000000000000000000 Binary files a/gui/slick/images/providers/ezrss.png and /dev/null differ diff --git a/gui/slick/images/providers/eztv_bt_chat.png b/gui/slick/images/providers/eztv_bt_chat.png deleted file mode 100644 index 5ccd1a4b3e0222b6a010311025bb703b309b19fb..0000000000000000000000000000000000000000 Binary files a/gui/slick/images/providers/eztv_bt_chat.png and /dev/null differ diff --git a/gui/slick/images/providers/oldpiratebay.png b/gui/slick/images/providers/oldpiratebay.png deleted file mode 100644 index 6e52fd53d9bae6e991c591d14a1a61af8f640c77..0000000000000000000000000000000000000000 Binary files a/gui/slick/images/providers/oldpiratebay.png and /dev/null differ diff --git a/gui/slick/images/providers/sick_beard_index.png b/gui/slick/images/providers/sick_beard_index.png deleted file mode 100644 index 2ba4d236a4bc8196a9574bb4282530793ddbab4a..0000000000000000000000000000000000000000 Binary files a/gui/slick/images/providers/sick_beard_index.png and /dev/null differ diff --git a/gui/slick/images/providers/sixbox.png b/gui/slick/images/providers/sixbox.png index 42819b21a34ae46042651d074bb1cab9c70b0b81..cf611ac5b6d154eadaf24add51e2b3b698c551cf 100644 Binary files a/gui/slick/images/providers/sixbox.png and b/gui/slick/images/providers/sixbox.png differ diff --git a/gui/slick/images/providers/sixbox_me.png b/gui/slick/images/providers/sixbox_me.png index 42819b21a34ae46042651d074bb1cab9c70b0b81..cf611ac5b6d154eadaf24add51e2b3b698c551cf 100644 Binary files a/gui/slick/images/providers/sixbox_me.png and b/gui/slick/images/providers/sixbox_me.png differ diff --git a/gui/slick/images/providers/torrentproject.png b/gui/slick/images/providers/torrentproject.png new file mode 100644 index 0000000000000000000000000000000000000000..6823df0185fca65bb377286e5647ecea42bf2087 Binary files /dev/null and b/gui/slick/images/providers/torrentproject.png differ diff --git a/gui/slick/js/addExistingShow.js b/gui/slick/js/addExistingShow.js index 6b13cba3e94b00007ae916088413d6b670f68fea..851628a09ed85cef5d0e5214cf87d1793ba8fa8a 100644 --- a/gui/slick/js/addExistingShow.js +++ b/gui/slick/js/addExistingShow.js @@ -1,16 +1,13 @@ $(document).ready(function() { $('#tableDiv').on('click', '#checkAll', function() { - var seasCheck = this; $('.dirCheck').each(function() { this.checked = seasCheck.checked; }); - }); $('#submitShowDirs').click(function() { - var dirArr = []; $('.dirCheck').each(function(i,w) { if (this.checked === true) { @@ -24,11 +21,10 @@ $(document).ready(function() { return false; } - url = sbRoot + '/home/addShows/addExistingShows?promptForSettings=' + ($('#promptForSettings').prop('checked') ? 'on' : 'off'); + url = srRoot + '/home/addShows/addExistingShows?promptForSettings=' + ($('#promptForSettings').prop('checked') ? 'on' : 'off'); url += '&shows_to_add=' + dirArr.join('&shows_to_add='); window.location.href = url; - }); @@ -43,8 +39,8 @@ $(document).ready(function() { } }); - $('#tableDiv').html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32.gif" height="32" width="32" /> loading folders...'); - $.get(sbRoot + '/home/addShows/massAddTable/', url, function(data) { + $('#tableDiv').html('<img id="searchingAnim" src="' + srRoot + '/images/loading32.gif" height="32" width="32" /> loading folders...'); + $.get(srRoot + '/home/addShows/massAddTable/', url, function(data) { $('#tableDiv').html(data); $("#addRootDirTable").tablesorter({ //sortList: [[1,0]], @@ -54,7 +50,6 @@ $(document).ready(function() { } }); }); - } var last_txt = ''; @@ -78,5 +73,4 @@ $(document).ready(function() { $("#tabs").tabs('option', 'active', 0); $('html,body').animate({scrollTop:0}, 1000); }); - }); diff --git a/gui/slick/js/addShowOptions.js b/gui/slick/js/addShowOptions.js index 03653a49f54340c6007167f5582510ed25fa8791..ac0605c69f60aad70bf37bed977231d9b23ca5eb 100644 --- a/gui/slick/js/addShowOptions.js +++ b/gui/slick/js/addShowOptions.js @@ -1,5 +1,4 @@ $(document).ready(function () { - $('#saveDefaultsButton').click(function () { var anyQualArray = []; var bestQualArray = []; @@ -10,7 +9,7 @@ $(document).ready(function () { bestQualArray.push($(d).val()); }); - $.get(sbRoot + '/config/general/saveAddShowDefaults', { + $.get(srRoot + '/config/general/saveAddShowDefaults', { defaultStatus: $('#statusSelect').val(), anyQualities: anyQualArray.join(','), bestQualities: bestQualArray.join(','), @@ -18,7 +17,8 @@ $(document).ready(function () { subtitles: $('#subtitles').prop('checked'), anime: $('#anime').prop('checked'), scene: $('#scene').prop('checked'), - defaultStatusAfter: $('#statusSelectAfter').val() + defaultStatusAfter: $('#statusSelectAfter').val(), + archive: $('#archive').prop('checked') }); $(this).attr('disabled', true); @@ -29,8 +29,7 @@ $(document).ready(function () { }); }); - $('#statusSelect, #qualityPreset, #flatten_folders, #anyQualities, #bestQualities, #subtitles, #scene, #anime, #statusSelectAfter').change(function () { + $('#statusSelect, #qualityPreset, #flatten_folders, #anyQualities, #bestQualities, #subtitles, #scene, #anime, #statusSelectAfter, #archive').change(function () { $('#saveDefaultsButton').attr('disabled', false); }); - }); diff --git a/gui/slick/js/addTrendingShow.js b/gui/slick/js/addTrendingShow.js index 137acce016a8ee9a2b5738c393db47a31698e32d..12f5440b51ce13b1860095821dcb45c42008fe1f 100644 --- a/gui/slick/js/addTrendingShow.js +++ b/gui/slick/js/addTrendingShow.js @@ -4,9 +4,9 @@ $(document).ready(function() { function loadContent() { if (trendingRequestXhr) trendingRequestXhr.abort(); - $('#trendingShows').html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> loading trending shows...'); + $('#trendingShows').html('<img id="searchingAnim" src="' + srRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> loading trending shows...'); trendingRequestXhr = $.ajax({ - url: sbRoot + '/home/addShows/getTrendingShows/', + url: srRoot + '/home/addShows/getTrendingShows/', timeout: 60 * 1000, error: function () { $('#trendingShows').empty().html('Trakt timed out, refresh page to try again'); diff --git a/gui/slick/js/ajaxEpSearch.js b/gui/slick/js/ajaxEpSearch.js index 8f0ce9d8e4876b891c89da2f1421d1b5e1fbf278..6c01dcfd10064dbdaec7060d74701e2bd386dfa6 100644 --- a/gui/slick/js/ajaxEpSearch.js +++ b/gui/slick/js/ajaxEpSearch.js @@ -1,4 +1,4 @@ -var search_status_url = sbRoot + '/home/getManualSearchStatus'; +var search_status_url = srRoot + '/home/getManualSearchStatus'; var failedDownload = false; var qualityDownload = false; var selectedEpisode = ''; @@ -46,38 +46,36 @@ function updateImages(data) { img=el.children('img'); parent=el.parent(); if (el) { + var rSearchTerm = ''; if (ep.searchstatus == 'searching') { //el=$('td#' + ep.season + 'x' + ep.episode + '.search img'); img.prop('title','Searching'); img.prop('alt','Searching'); - img.prop('src',sbRoot+'/images/' + loadingImage); + img.prop('src',srRoot+'/images/' + loadingImage); disableLink(el); // Update Status and Quality - var rSearchTerm = /(\w+)\s\((.+?)\)/; + rSearchTerm = /(\w+)\s\((.+?)\)/; HtmlContent = ep.searchstatus; - } - else if (ep.searchstatus == 'queued') { + } else if (ep.searchstatus == 'queued') { //el=$('td#' + ep.season + 'x' + ep.episode + '.search img'); img.prop('title','Queued'); img.prop('alt','queued'); - img.prop('src',sbRoot+'/images/' + queuedImage ); + img.prop('src',srRoot+'/images/' + queuedImage ); disableLink(el); HtmlContent = ep.searchstatus; - } - else if (ep.searchstatus == 'finished') { + } else if (ep.searchstatus == 'finished') { //el=$('td#' + ep.season + 'x' + ep.episode + '.search img'); img.prop('title','Searching'); img.prop('alt','searching'); img.parent().prop('class','epRetry'); - img.prop('src',sbRoot+'/images/' + searchImage); + img.prop('src',srRoot+'/images/' + searchImage); enableLink(el); // Update Status and Quality - var rSearchTerm = /(\w+)\s\((.+?)\)/; + rSearchTerm = /(\w+)\s\((.+?)\)/; HtmlContent = ep.status.replace(rSearchTerm,"$1"+' <span class="quality '+ep.quality+'">'+"$2"+'</span>'); parent.closest('tr').prop("class", ep.overview + " season-" + ep.season + " seasonstyle"); - } // update the status column if it exists parent.siblings('.col-status').html(HtmlContent); @@ -89,16 +87,16 @@ function updateImages(data) { if (ep.searchstatus == 'searching') { img_comEps.prop('title','Searching'); img_comEps.prop('alt','Searching'); - img_comEps.prop('src',sbRoot+'/images/' + loadingImage); + img_comEps.prop('src',srRoot+'/images/' + loadingImage); disableLink(el_comEps); } else if (ep.searchstatus == 'queued') { img_comEps.prop('title','Queued'); img_comEps.prop('alt','queued'); - img_comEps.prop('src',sbRoot+'/images/' + queuedImage ); + img_comEps.prop('src',srRoot+'/images/' + queuedImage ); } else if (ep.searchstatus == 'finished') { img_comEps.prop('title','Manual Search'); img_comEps.prop('alt','[search]'); - img_comEps.prop('src',sbRoot+'/images/' + searchImage); + img_comEps.prop('src',srRoot+'/images/' + searchImage); if (ep.overview == 'snatched') { el_comEps.closest('tr').remove(); } else { @@ -167,22 +165,12 @@ function disableLink(el) { }); $('#manualSearchModalFailed .btn').click(function(){ - val=$(this).text(); - if(val=='Yes'){ - failedDownload = true; - } else { - failedDownload = false; - } + failedDownload = ($(this).text() == 'Yes'); $("#manualSearchModalQuality").modal('show'); }); $('#manualSearchModalQuality .btn').click(function(){ - val=$(this).text(); - if(val=='Yes'){ - qualityDownload = true; - } else { - qualityDownload = false; - } + qualityDownload = ($(this).text() == 'Yes'); manualSearch(); }); @@ -196,7 +184,7 @@ function disableLink(el) { img=selectedEpisode.children('img'); img.prop('title','loading'); img.prop('alt',''); - img.prop('src',sbRoot+'/images/' + options.loadingImage); + img.prop('src',srRoot+'/images/' + options.loadingImage); var url = selectedEpisode.prop('href'); @@ -204,11 +192,7 @@ function disableLink(el) { url = url.replace("retryEpisode", "searchEpisode"); } - if (qualityDownload === true) { - url = url + "&downCurQuality=1"; - } else { - url = url + "&downCurQuality=0"; - } + url = url + "&downCurQuality=" + (qualityDownload ? '1' : '0'); $.getJSON(url, function(data){ @@ -237,9 +221,8 @@ function disableLink(el) { img.prop('title',img_result); img.prop('alt',img_result); img.prop('height', options.size); - img.prop('src',sbRoot+"/images/"+img_name); + img.prop('src',srRoot+"/images/"+img_name); }); - // // don't follow the link return false; diff --git a/gui/slick/js/ajaxEpSubtitles.js b/gui/slick/js/ajaxEpSubtitles.js index 261bf1a778b3c8bc345931b3c0060788d6445223..241ed7f698360dfc8012c966205cb8eeda0deae8 100644 --- a/gui/slick/js/ajaxEpSubtitles.js +++ b/gui/slick/js/ajaxEpSubtitles.js @@ -5,7 +5,7 @@ var subtitles_search_link = $(this); // fill with the ajax loading gif subtitles_search_link.empty(); - subtitles_search_link.append($("<img/>").attr({"src": sbRoot+"/images/loading16.gif", "alt": "", "title": "loading"})); + subtitles_search_link.append($("<img/>").attr({"src": srRoot+"/images/loading16.gif", "alt": "", "title": "loading"})); $.getJSON($(this).attr('href'), function(data){ if (data.result != "failure" && data.result != "No subtitles downloaded") { // clear and update the subtitles column with new informations @@ -14,9 +14,9 @@ $.each(subtitles,function(index, language){ if (language !== "" && language != "und") { if (index != subtitles.length - 1) { - subtitles_td.append($("<img/>").attr({"src": sbRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11})); + subtitles_td.append($("<img/>").attr({"src": srRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11})); } else { - subtitles_td.append($("<img/>").attr({"src": sbRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11})); + subtitles_td.append($("<img/>").attr({"src": srRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11})); } } }); @@ -37,7 +37,7 @@ var subtitles_merge_link = $(this); // fill with the ajax loading gif subtitles_merge_link.empty(); - subtitles_merge_link.append($("<img/>").attr({"src": sbRoot+"/images/loading16.gif", "alt": "", "title": "loading"})); + subtitles_merge_link.append($("<img/>").attr({"src": srRoot+"/images/loading16.gif", "alt": "", "title": "loading"})); $.getJSON($(this).attr('href'), function(data){ // don't allow other merges subtitles_merge_link.remove(); diff --git a/gui/slick/js/ajaxNotifications.js b/gui/slick/js/ajaxNotifications.js index f1b38d7cdfab4198322c67ad140574a0332e5ab2..80e2a359cbbc4ca11e7ca8d9973be386ec5f6099 100644 --- a/gui/slick/js/ajaxNotifications.js +++ b/gui/slick/js/ajaxNotifications.js @@ -1,5 +1,5 @@ -var message_url = sbRoot + '/ui/get_messages', - test = !1; +var message_url = srRoot + '/ui/get_messages', + test = !1; PNotify.prototype.options.addclass = 'stack-bottomright'; PNotify.prototype.options.buttons.closer_hover = !1; @@ -14,29 +14,30 @@ PNotify.prototype.options.width = '340px'; PNotify.desktop.permission(); function displayPNotify(type, title, message) { - var notification = new PNotify({ - type: type, title: title, - text: message.replace(/<br[\s\/]*(?:\s[^>]*)?>/ig, "\n") - .replace(/<[\/]?b(?:\s[^>]*)?>/ig, '*') - .replace(/<i(?:\s[^>]*)?>/ig, '[').replace(/<[\/]i>/ig, ']') - .replace(/<(?:[\/]?ul|\/li)(?:\s[^>]*)?>/ig, '').replace(/<li(?:\s[^>]*)?>/ig, "\n" + '* ') - }); + var notification = new PNotify({ + type: type, title: title, + text: message.replace(/<br[\s\/]*(?:\s[^>]*)?>/ig, "\n") + .replace(/<[\/]?b(?:\s[^>]*)?>/ig, '*') + .replace(/<i(?:\s[^>]*)?>/ig, '[').replace(/<[\/]i>/ig, ']') + .replace(/<(?:[\/]?ul|\/li)(?:\s[^>]*)?>/ig, '').replace(/<li(?:\s[^>]*)?>/ig, "\n" + '* ') + }); } function check_notifications() { - if ('visible' == document.visibilityState) { - $.getJSON(message_url, function (data) { - $.each(data, function (name, data) { - displayPNotify(data.type, data.title, data.message) - }); - }); - } - setTimeout(check_notifications, 3000) + if ('visible' == document.visibilityState) { + $.getJSON(message_url, function (data) { + $.each(data, function (name, data) { + displayPNotify(data.type, data.title, data.message); + }); + }); + } + setTimeout(function () { + "use strict"; + check_notifications(); + }, 3000); } $(document).ready(function(){ - check_notifications(); - if (test) { - displayPNotify('notice', 'test', 'test<br/><i class="test-class">hello <b>world</b></i><ul><li>item 1</li><li>item 2</li></ul>'); - } -}); \ No newline at end of file + check_notifications(); + if(test) displayPNotify('notice', 'test', 'test<br/><i class="test-class">hello <b>world</b></i><ul><li>item 1</li><li>item 2</li></ul>'); +}); diff --git a/gui/slick/js/apibuilder.js b/gui/slick/js/apibuilder.js index 65a53e704f2e55e04e0ded72c044a61930ef4436..c5f456ffb23902a2abd85aeb54733da7550277ce 100644 --- a/gui/slick/js/apibuilder.js +++ b/gui/slick/js/apibuilder.js @@ -1,641 +1,108 @@ -// Chained Selects - -// Copyright Xin Yang 2004 -// Web Site: www.yxScripts.com -// EMail: m_yangxin@hotmail.com -// Last Updated: Jan. 31, 2009 - -// This script is free as long as the copyright notice remains intact. - -var _disable_empty_list=false; -var _hide_empty_list=false; -var _image_commands=['?cmd=show.getbanner', '?cmd=show.getfanart', '?cmd=show.getnetworklogo', '?cmd=show.getposter']; - -function goListGroup(apikey, L7, L6, L5, L4, L3, L2, L1){ - var html, GlobalOptions = ""; - $('.global').each(function(){ - var checked = $(this).prop('checked'); - if(checked) { - var globalID = $(this).attr('id'); - // handle jsonp/callback global option differently - if(globalID == "jsonp") { - GlobalOptions = GlobalOptions + "&" + globalID + "=foo"; - } else { - GlobalOptions = GlobalOptions + "&" + globalID + "=1"; +$(document).ready(function() { + // Perform an API call + $('[data-action=api-call]').on('click', function() { + var parameters = $('[data-command=' + $(this).data('command-name') + ']'); + var profile = $('#option-profile').is(':checked'); + var targetId = $(this).data('target'); + var timeId = $(this).data('time'); + var url = $('#' + $(this).data('base-url')).text(); + var urlId = $(this).data('url'); + + $.each(parameters, function (index, item) { + var name = $(item).attr('name'); + var value = $(item).val(); + + if(name !== undefined && value !== undefined && name != value && value) { + if($.isArray(value)) { + value = value.join('|'); + } + + url += '&' + name + '=' + value; } - } - }); - - // Some commands return an image instead of JSON - if ($.inArray(L1, _image_commands) > -1) { - var imgcache = sbRoot + "/api/" + apikey + "/" + L1 + L2 + GlobalOptions; - html = imgcache + '<br/><br/><img src="' + sbRoot + '/images/loading16.gif" id="imgcache">'; - $('#apiResponse').html(html); - $.ajax({ - url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + GlobalOptions, - async: false, - cache: false, - dataType: "html", - success: function (img) { - $('#imgcache').attr('src', imgcache); - } }); - } else { - html = sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + GlobalOptions + "<br/><pre>"; - html += $.ajax({ - url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + GlobalOptions, - async: false, - dataType: "html" - }).responseText; - - html += '</pre>'; - $('#apiResponse').html(html); - } -} - -// ------ -if (typeof(disable_empty_list)=="undefined") { disable_empty_list=_disable_empty_list; } -if (typeof(hide_empty_list)=="undefined") { hide_empty_list=_hide_empty_list; } - -var cs_goodContent=true, cs_M="M", cs_L="L", cs_G="G", cs_EG="EG"; -var cs_names = []; -var cs_supportDOM=document.createElement; -var cs_nav=navigator.userAgent.toLowerCase(); -var cs_isIE7=(cs_nav.indexOf("msie 7")!=-1 || cs_nav.indexOf("msie 8")!=-1); -var cs_isOpera=(cs_nav.indexOf("opera")!=-1); -var cs_isMac=(cs_nav.indexOf("mac")!=-1); - -function cs_findOBJ(obj,n) { - for (var i=0; i<obj.length; i++) { - if (obj[i].name==n) { return obj[i]; } - } - return null; -} -function cs_findContent(n) { return cs_findOBJ(cs_content,n); } -function cs_findSubContent(n) { return cs_findOBJ(cs_subContent,n); } - -function cs_findM(m,n) { - if (m.name==n) { return m; } - - var sm=null; - for (var i=0; i<m.items.length; i++) { - if (m.items[i].type==cs_M) { - sm=cs_findM(m.items[i],n); - if (sm !== null) break; - } - } - return sm; -} - -function cs_subContentOBJ(n,list) { - this.name=n; - this.list=list; - - this.ifm=document.createElement("IFRAME"); - this.ifm.style.position="absolute"; left="-200px"; top="-200px"; visibility="hidden"; width="100px"; height="100px"; - document.body.appendChild(this.ifm); - this.ifm.src=n; -} - -cs_subContent = []; - -function cs_contentOBJ(n,obj){ - this.name=n; - this.menu=obj; - this.lists = []; - this.cookie=""; - this.callback=null; - this.count=1; -} - -cs_subContent = []; - -function cs_topmenuOBJ(tm) { - this.name=tm; - this.type=cs_M; - this.items = []; - this.df=","; - this.oidx=0; - - this.addM=cs_addM; this.addL=cs_addL; this.addG=cs_addG; this.endG=cs_endG; -} - -function cs_submenuOBJ(dis,link,sub,label,css) { - this.name=sub; - this.type=cs_M; - this.dis=dis; - this.link=link; - this.label=label; - this.css=css; - this.df=","; - this.oidx=0; - - this.addM=cs_addM; this.addL=cs_addL; this.addG=cs_addG; this.endG=cs_endG; - - if (typeof(cs_names[sub])=="undefined") { - this.items = []; - cs_names[sub] = this; - } else { - this.items = cs_names[sub].items; - } -} -function cs_linkOBJ(dis,link,label,css) { - this.type=cs_L; - this.dis=dis; - this.link=link; - this.label=label; - this.css=css; -} -function cs_groupOBJ(label,css) { - this.type=cs_G; - this.dis=""; - this.link=""; - this.label=label; - this.css=css; -} -function cs_groupOBJ2() { - this.type=cs_EG; - this.dis=""; - this.link=""; - this.label=""; -} - -function cs_addM(dis,link,sub,label,css) { - var x=new cs_submenuOBJ(dis,link,sub,label,css); - this.items[this.items.length]=x; -} -function cs_addL(dis,link,label,css) { this.items[this.items.length]=new cs_linkOBJ(dis,link,label,css); } -function cs_addG(label,css) { this.items[this.items.length]=new cs_groupOBJ(label,css); } -function cs_endG() { this.items[this.items.length]=new cs_groupOBJ2(); } - -function cs_showMsg(msg) { window.status=msg; } -function cs_badContent(n) { cs_goodContent=false; cs_showMsg("["+n+"] Not Found."); } - -function _setCookie(name, value) { - document.cookie=name+"="+value; -} -function cs_setCookie(name, value) { - setTimeout("_setCookie('"+name+"','"+value+"')",0); -} - -function cs_getCookie(name) { - var cookieRE=new RegExp(name+"=([^;]+)"); - if (document.cookie.search(cookieRE)!=-1) { - return RegExp.$1; - } - else { - return ""; - } -} - -function cs_optionOBJ(type,text,value,label,css) { this.type=type; this.text=text; this.value=value; this.label=label; this.css=css; } -function cs_getOptions(menu,list) { - var opt=[]; - for (var i=0; i<menu.items.length; i++) { - opt[i]=new cs_optionOBJ(menu.items[i].type, menu.items[i].dis, menu.items[i].link, menu.items[i].label, menu.items[i].css); - } - if (opt.length===0 && menu.name !== '') { - cs_getSubList(menu.name,list); - //opt[0]=new cs_optionOBJ(cs_L, "loading ...", "", "", ""); - } - return opt; -} -function cs_emptyList(list) { - if (cs_supportDOM && !cs_isMac && !cs_isIE7) { - while (list.lastChild) { - list.removeChild(list.lastChild); - } - } - else { - for (var i=list.options.length-1; i>=0; i--) { - list.options[i]=null; - } - } -} -function cs_refreshList(list,opt,df,key) { - var l=list.options.length; - var optGroup=null, newOpt=null, optCount=0, optPool=list; - - if (cs_isMac) { - var l=list.options.length; - var iCount=0; - - for (var i=0; i<opt.length; i++) { - if (opt[i].type!=cs_G && opt[i].type!=cs_EG) { - iCount=l+optCount; - - list.options[iCount]=new Option(opt[i].text, opt[i].value, df.indexOf(","+optCount+",")!=-1, df.indexOf(","+optCount+",")!=-1); - list.options[iCount].oidx=optCount; - list.options[iCount].idx=i; - list.options[iCount].key=key; - - if (opt[i].label !== '') { - list.options[iCount].label=opt[i].label; - } - if (opt[i].css !== '') { - list.options[iCount].className=opt[i].css; - } - - optCount++; - } - } - - return; - } - - for (var i=0; i<opt.length; i++) { - if (opt[i].type==cs_G) { - optGroup=document.createElement("optgroup"); - optGroup.setAttribute("label", opt[i].label); - if (opt[i].css !== '') { - optGroup.setAttribute("className", opt[i].css); - } - list.appendChild(optGroup); - optPool=optGroup; - } - else if (opt[i].type==cs_EG) { - optGroup=null; - optPool=list; - } - else { - newOpt=new Option(opt[i].text,opt[i].value); - if (cs_supportDOM && !cs_isIE7) { - optPool.appendChild(newOpt); - } - else { - list.options[l+optCount]=newOpt; - } - - newOpt.oidx=optCount; - newOpt.idx=i; - newOpt.key=key; - - // a workaround for IE, but will screw up with Opera - if (!cs_isOpera) { - newOpt.text=opt[i].text; - newOpt.value=opt[i].value; - } - - if (df.indexOf(","+optCount+",")!=-1) { - newOpt.selected=true; - } - if (opt[i].label !== '') { - newOpt.label=opt[i].label; - } - if (opt[i].css !== '') { - newOpt.className=opt[i].css; - } - - optCount++; - } - } -} - -function cs_getList(content,key) { - var menu=content.menu; - - if (key!="[]") { - var paths=key.substring(1,key.length-1).split(","); - for (var i=0; i<paths.length; i++) { - menu=menu.items[parseInt(paths[i],10)]; - } - } - - return menu; -} -function cs_getKey(key,idx) { - return "["+(key=="[]"?"":(key.substring(1,key.length-1)+","))+idx+"]"; -} -function cs_getSelected(mode,name,idx,key,df) { - if (mode) { - var cookies=cs_getCookie(name+"_"+idx); - if (cookies !== '') { - var mc=cookies.split("-"); - for (var i=0; i<mc.length; i++) { - if (mc[i].indexOf(key)!=-1) { - df=mc[i].substring(key.length); - break; - } - } - } - } - return df; -} -function cs_updateListGroup(content,idx,mode) { - var menu=null, list=content.lists[idx], options=list.options, has_sublist=false; - var key="", option=",", cookies=""; + if(profile) url += '&profile=1'; - //if (list.selectedIndex<0) { - // list.selectedIndex=0; - //} + var requestTime = new Date().getTime(); + $.get(url, function (data, textStatus, jqXHR) { + var responseTime = new Date().getTime() - requestTime; + var jsonp = $('#option-jsonp').is(':checked'); + var responseType = jqXHR.getResponseHeader('content-type') || ''; + var target = $(targetId); - for (var i=0; i<options.length; i++) { - if (options[i].selected) { - if (key!=options[i].key) { - cookies+=key === '' ? '' : ((cookies === '' ? '' : '-')+key+option); + $(timeId).text(responseTime + 'ms'); + $(urlId).text(url + (jsonp ? '&jsonp=foo' : '')); - key=options[i].key; - option=","; - menu=cs_getList(content,key); - } - - option+=options[i].oidx+","; - - if (idx+1<content.lists.length) { - if (menu.items.length > options[i].idx && menu.items[options[i].idx].type==cs_M) { - if (!has_sublist) { - has_sublist=true; - cs_emptyList(content.lists[idx+1]); - } - var subkey=cs_getKey(key,options[i].idx), df=cs_getSelected(mode,content.cookie,idx+1,subkey,menu.items[options[i].idx].df); - cs_refreshList(content.lists[idx+1],cs_getOptions(menu.items[options[i].idx],list),df,subkey); - } - } - } - } - - if (key !== '') { - cookies+=(cookies === '' ? '' : '-')+key+option; - } - - if (content.cookie) { - cs_setCookie(content.cookie+"_"+idx,cookies); - } - - if (has_sublist && idx+1<content.lists.length) { - if (disable_empty_list) { - content.lists[idx+1].disabled=false; - } - if (hide_empty_list) { - content.lists[idx+1].style.display="block"; - } - cs_updateListGroup(content,idx+1,mode); - } - else { - for (var s=idx+1; s<content.lists.length; s++) { - cs_emptyList(content.lists[s]); - - if (disable_empty_list) { - content.lists[s].disabled=true; - } - if (hide_empty_list) { - content.lists[s].style.display="none"; - } - - if (content.cookie) { - cs_setCookie(content.cookie+"_"+s,""); - } - } - } -} + if(responseType.slice(0, 6) == 'image/') { + target.html($('<img/>').attr('src', url)); + } else { + var json = JSON.stringify(data, null, 4); -function cs_initListGroup(content,mode) { - var key="[]", df=cs_getSelected(mode,content.cookie,0,key,content.menu.df); + if(jsonp) { + target.text('foo(' + json + ');'); + } else { + target.text(json); + } + } - cs_emptyList(content.lists[0]); - cs_refreshList(content.lists[0],cs_getOptions(content.menu,content.lists[0]),df,key); - cs_updateListGroup(content,0,mode); -} + target.parents('.result-wrapper').removeClass('hidden'); + }); + }); -function cs_updateList() { - var content=this.content; - for (var i=0; i<content.lists.length; i++) { - if (content.lists[i]==this) { - cs_updateListGroup(content,i,content.cookie); + // Remove the result of an API call + $('[data-action=clear-result]').on('click', function() { + $($(this).data('target')).html('').parents('.result-wrapper').addClass('hidden'); + }); - if (content.callback) { - var opt=""; - for (var j=0; j<this.options.length; j++) { - if (this.options[j].selected) { - if (opt !== '') { - opt+=","; - } - if (this.options[j].value !== '') { - opt+=this.options[j].value; - } - else if (this.options[j].text !== '') { - opt+=this.options[j].text; + // Update the list of episodes + $('[data-action=update-episodes').on('change', function() { + var command = $(this).data('command'); + var select = $('[data-command=' + command + '][name=episode]'); + var season = $(this).val(); + var show = $('[data-command=' + command + '][name=indexerid]').val(); + + if(select !== undefined) { + select.removeClass('hidden'); + select.find('option:gt(0)').remove(); + + for(var episode in episodes[show][season]) { + select.append($('<option>', { + value: episodes[show][season][episode], + label: 'Episode ' + episodes[show][season][episode], + })); } - else if (this.options[j].label !== '') { - opt+=this.options[j].label; - } - } } - content.callback(this,i+1,content.count,opt); - } - - if (this.handler) { - this.handler(); - } - - break; - } - } -} - -function cs_getSubList(n,list) { - if (cs_goodContent && cs_supportDOM) { - var cs_subList=cs_findSubContent(n); - if (cs_subList===null) { - cs_subContent[cs_subContent.length]=new cs_subContentOBJ(n,list); - } - } -} - -function cs_updateSubList(cn,sn) { - var cc=cs_findContent(cn), sc=cs_findContent(sn); - if (cc!==null && sc!==null) { - var cs_sub=cs_findM(cc.menu,sn); - if (cs_sub!==null) { - cs_sub.df=sc.menu.df; - cs_sub.oidx=sc.menu.oidx; - cs_sub.items=sc.menu.items; - } - } - - var cs_subList=cs_findSubContent(sn); - if (cs_subList!==null) { - cs_subList.list.onchange(); - - cs_subList.ifm.src=""; - document.body.removeChild(cs_subList.ifm); - cs_subList.ifm=null; - } -} - -// ------ -function addListGroup(n,tm) { - if (cs_goodContent) { - cs_names[tm]=new cs_topmenuOBJ(tm); - - var c=cs_findContent(n); - if (c===null) { - cs_content[cs_content.length]=new cs_contentOBJ(n,cs_names[tm]); - } - else { - delete(c.menu); c.menu=cs_names[tm]; - } - } -} - -function addList(n,dis,link,sub,df,label,css) { - if (typeof(sub)=="undefined" || sub === '') { - addOption(n,dis,link||"",df||"",label||"",css||""); - } - else if (cs_goodContent) { - if (typeof(cs_names[n])!="undefined") { - cs_names[n].addM(dis,link||"",sub+"",label||"",css||""); - if (typeof(df)!="undefined" && df) { - cs_names[n].df+=cs_names[n].oidx+","; - } - cs_names[n].oidx++; - } - else { - cs_badContent(n); - } - } -} - -function addOption(n,dis,link,df,label,css) { - if (cs_goodContent) { - if (typeof(cs_names[n])!="undefined") { - cs_names[n].addL(dis,link||"",label||"",css||""); - if (typeof(df)!="undefined" && df) { - cs_names[n].df+=cs_names[n].oidx+","; - } - cs_names[n].oidx++; - } - else { - cs_badContent(n); - } - } -} - -function addOptGroup(n,label,css) { - if (cs_goodContent && cs_supportDOM && !cs_isOpera) { - if (typeof(cs_names[n])!="undefined") { - cs_names[n].addG(label,css||""); - } - else { - cs_badContent(n); - } - } -} - -function endOptGroup(n) { - if (cs_goodContent && cs_supportDOM && !cs_isOpera) { - if (typeof(cs_names[n])!="undefined") { - cs_names[n].endG(); - } - else { - cs_badContent(n); - } - } -} - -function initListGroup(n) { - var _content=cs_findContent(n), count=0; - if (_content!==null) { - var content=new cs_contentOBJ("cs_"+_content.count+"_"+n,_content.menu); - content.count=_content.count++; - cs_content[cs_content.length]=content; - - for (var i=1; i<initListGroup.arguments.length; i++) { - if (typeof(arguments[i])=="object" && arguments[i].tagName && arguments[i].tagName=="SELECT") { - content.lists[count]=arguments[i]; - - arguments[i].handler=arguments[i].onchange; - arguments[i].onchange=cs_updateList; - arguments[i].content=content; arguments[i].idx=count++; - } - else if (typeof(arguments[i])=="string" && /^[a-zA-Z_]\w*$/.test(arguments[i])) { - content.cookie=arguments[i]; - } - else if (typeof(arguments[i])=="function") { - content.callback=arguments[i]; - } - else { - cs_showMsg("Warning: Unexpected argument in initListGroup() for ["+n+"]"); - } - } - - if (content.lists.length>0) { - cs_initListGroup(content,content.cookie); - } - } -} - -function initListGroups(n) { - var listCount=0; - for (var i=1; i<initListGroups.arguments.length; i++) { - // opera takes select array as function - if ((typeof(arguments[i])=="object" || typeof(arguments[i])=="function") && arguments[i].length && typeof(arguments[i][0])!="undefined" && arguments[i][0].tagName && arguments[i][0].tagName=="SELECT") { - if (listCount>arguments[i].length || listCount===0) { - listCount=arguments[i].length; - } - } - } - - var _content=cs_findContent(n), count=0, content=null; - if (_content!==null) { - for (var l=0; l<listCount; l++) { - count=0; - content=new cs_contentOBJ("cs_"+_content.count+"_"+n,_content.menu); - content.count=_content.count++; - cs_content[cs_content.length]=content; - - for (var i=1; i<initListGroups.arguments.length; i++) { - if ((typeof(arguments[i])=="object" || typeof(arguments[i])=="function") && arguments[i].length && typeof(arguments[i][0])!="undefined" && arguments[i][0].tagName && arguments[i][0].tagName=="SELECT") { - content.lists[count]=arguments[i][l]; + }); - arguments[i][l].handler=arguments[i][l].onchange; - arguments[i][l].onchange=cs_updateList; - arguments[i][l].content=content; arguments[i][l].idx=count++; - } - else if (typeof(arguments[i])=="string" && /^[a-zA-Z_]\w*$/.test(arguments[i])) { - content.cookie=arguments[i]+"_"+l; - } - else if (typeof(arguments[i])=="function") { - content.callback=arguments[i]; - } - else { - cs_showMsg("Warning: Unexpected argument in initListGroups() for ["+n+"]"); + // Update the list of seasons + $('[data-action=update-seasons').on('change', function() { + var command = $(this).data('command'); + var select = $('[data-command=' + command + '][name=season]'); + var show = $(this).val(); + + if(select !== undefined) { + select.removeClass('hidden'); + select.find('option:gt(0)').remove(); + + for(var season in episodes[show]) { + select.append($('<option>', { + value: season, + label: (season === 0) ? 'Specials' : 'Season ' + season, + })); + } } - } - - if (content.lists.length>0) { - cs_initListGroup(content,content.cookie); - } - } - } -} + }); -function resetListGroup(n,count) { - var content=cs_findContent("cs_"+(count||1)+"_"+n); - if (content!==null && content.lists.length>0) { - cs_initListGroup(content,""); - } -} + // Enable command search + $('#command-search').typeahead({ + source: commands, + }); + $('#command-search').on('change', function() { + var command = $(this).typeahead('getActive'); -function selectOptions(n,opts,mode) { - var content=cs_findContent(n); - if (content!==null) { - var optss=opts.split(":"), menu=content.menu, path=true; - for (var i=0; i<optss.length; i+=2) { - if (menu.type==cs_M && path) { - path=false; - for (var o=0; o<menu.items.length; o++) { - if (mode===0 && menu.items[o].dis==optss[i] || mode==1 && menu.items[o].link==optss[i] || mode==2 && o==optss[i]) { - path=true; - if (optss[i+1]!="-") { - menu.df=","+o+","; - } - menu=menu.items[o]; - break; - } + if(command) { + var commandId = command.replace('.', '-'); + $('[href=#command-' + commandId + ']').click(); } - } - } - } -} + }); +}); diff --git a/gui/slick/js/blackwhite.js b/gui/slick/js/blackwhite.js index 49a86fedef94201ca269090fe2c1cd0dfb1bc8f1..e8618899c95ebd24c0d385f35375e579231eb83a 100644 --- a/gui/slick/js/blackwhite.js +++ b/gui/slick/js/blackwhite.js @@ -18,7 +18,7 @@ function update_bwlist(show_name) { $('#blackwhitelist').show(); if (show_name) { - $.getJSON(sbRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) { + $.getJSON(srRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) { if (data.result == 'success') { $.each(data.groups, function(i, group) { var option = $("<option>"); diff --git a/gui/slick/js/browser.js b/gui/slick/js/browser.js index 9da6a8bafe019f9dfa2d49b2cd658e9a7518d768..24ca3e4edb90a86ff97dda7349d14223e0ece144 100644 --- a/gui/slick/js/browser.js +++ b/gui/slick/js/browser.js @@ -4,8 +4,8 @@ $.Browser = { defaults: { title: 'Choose Directory', - url: sbRoot + '/browser/', - autocompleteURL: sbRoot + '/browser/complete', + url: srRoot + '/browser/', + autocompleteURL: srRoot + '/browser/complete', includeFiles: 0 } }; diff --git a/gui/slick/js/config.js b/gui/slick/js/config.js index 62d3579804f9c9f30bf8bba876275737124c34ec..7c852360b89e1f1ea408996f73d007bc5d69b81d 100644 --- a/gui/slick/js/config.js +++ b/gui/slick/js/config.js @@ -1,14 +1,14 @@ $(document).ready(function(){ $(".enabler").each(function(){ - if (!$(this).prop('checked')) - $('#content_'+$(this).attr('id')).hide(); + if (!$(this).prop('checked')) $('#content_'+$(this).attr('id')).hide(); }); $(".enabler").click(function() { - if ($(this).prop('checked')) + if ($(this).prop('checked')){ $('#content_'+$(this).attr('id')).fadeIn("fast", "linear"); - else + } else { $('#content_'+$(this).attr('id')).fadeOut("fast", "linear"); + } }); $(".viewIf").click(function() { @@ -22,45 +22,51 @@ $(document).ready(function(){ }); $(".datePresets").click(function() { - var def = $('#date_presets').val() + var def = $('#date_presets').val(); if ($(this).prop('checked') && '%x' == def) { - def = '%a, %b %d, %Y' - $('#date_use_system_default').html('1') - } else if (!$(this).prop('checked') && '1' == $('#date_use_system_default').html()) - def = '%x' + def = '%a, %b %d, %Y'; + $('#date_use_system_default').html('1'); + } else if (!$(this).prop('checked') && '1' == $('#date_use_system_default').html()){ + def = '%x'; + } - $('#date_presets').attr('name', 'date_preset_old') - $('#date_presets').attr('id', 'date_presets_old') + $('#date_presets').attr('name', 'date_preset_old'); + $('#date_presets').attr('id', 'date_presets_old'); - $('#date_presets_na').attr('name', 'date_preset') - $('#date_presets_na').attr('id', 'date_presets') + $('#date_presets_na').attr('name', 'date_preset'); + $('#date_presets_na').attr('id', 'date_presets'); - $('#date_presets_old').attr('name', 'date_preset_na') - $('#date_presets_old').attr('id', 'date_presets_na') + $('#date_presets_old').attr('name', 'date_preset_na'); + $('#date_presets_old').attr('id', 'date_presets_na'); - if (def) - $('#date_presets').val(def) + if (def) $('#date_presets').val(def); }); - // bind 'myForm' and provide a simple callback function + // bind 'myForm' and provide a simple callback function $('#configForm').ajaxForm({ beforeSubmit: function(){ $('.config_submitter .config_submitter_refresh').each(function(){ $(this).attr("disabled", "disabled"); - $(this).after('<span><img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>'); + $(this).after('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>'); $(this).hide(); }); }, success: function(){ - setTimeout('config_success()', 2000) + setTimeout(function () { + "use strict"; + config_success(); + }, 2000); } }); - $('#api_key').click(function(){ $('#api_key').select() }); + $('#api_key').click(function(){ + $('#api_key').select(); + }); + $("#generate_new_apikey").click(function(){ - $.get(sbRoot + '/config/general/generateApiKey', + $.get(srRoot + '/config/general/generateApiKey', function(data){ - if (data.error != undefined) { + if (data.error !== undefined) { alert(data.error); return; } @@ -69,27 +75,27 @@ $(document).ready(function(){ }); $('#branchCheckout').click(function() { - var url = sbRoot+'/home/branchCheckout?branch='+$("#branchVersion").val(); - var checkDBversion = sbRoot + "/home/getDBcompare" - $.getJSON(checkDBversion, function(data){ - if (data.status == "success") { - if (data.message == "equal") { - //Checkout Branch - window.location.href = url; - } - if (data.message == "upgrade") { - if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) { - //Checkout Branch - window.location.href = url; - } - } - if (data.message == "downgrade") { - alert("Can't switch branch as this will result in a database downgrade.") - } - } - }); + var url = srRoot+'/home/branchCheckout?branch='+$("#branchVersion").val(); + var checkDBversion = srRoot + "/home/getDBcompare"; + $.getJSON(checkDBversion, function(data){ + if (data.status == "success") { + if (data.message == "equal") { + //Checkout Branch + window.location.href = url; + } + if (data.message == "upgrade") { + if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) { + //Checkout Branch + window.location.href = url; + } + } + if (data.message == "downgrade") { + alert("Can't switch branch as this will result in a database downgrade."); + } + } + }); }); - + }); function config_success(){ @@ -102,8 +108,8 @@ function config_success(){ $(this).removeAttr("disabled"); $(this).next().remove(); $(this).show(); - url = sbRoot+'/config/providers/'; - window.location.href = url; + url = srRoot+'/config/providers/'; + window.location.href = url; }); $('#email_show').trigger('notify'); } diff --git a/gui/slick/js/configBackupRestore.js b/gui/slick/js/configBackupRestore.js index af00757da5f6ae8869883bd64ad2e9353dab0dd2..fc690ba76973405d6f071490c702db11a12bfc6b 100644 --- a/gui/slick/js/configBackupRestore.js +++ b/gui/slick/js/configBackupRestore.js @@ -1,11 +1,11 @@ $(document).ready(function(){ - var loading = '<img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; + var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; $('#Backup').click(function() { $("#Backup").attr("disabled", true); $('#Backup-result').html(loading); var backupDir = $("#backupDir").val(); - $.get(sbRoot + "/config/backuprestore/backup", {'backupDir': backupDir}) + $.get(srRoot + "/config/backuprestore/backup", {'backupDir': backupDir}) .done(function (data) { $('#Backup-result').html(data); $("#Backup").attr("disabled", false); @@ -15,10 +15,10 @@ $(document).ready(function(){ $("#Restore").attr("disabled", true); $('#Restore-result').html(loading); var backupFile = $("#backupFile").val(); - $.get(sbRoot + "/config/backuprestore/restore", {'backupFile': backupFile}) + $.get(srRoot + "/config/backuprestore/restore", {'backupFile': backupFile}) .done(function (data) { $('#Restore-result').html(data); $("#Restore").attr("disabled", false); }); }); -}); \ No newline at end of file +}); diff --git a/gui/slick/js/configNotifications.js b/gui/slick/js/configNotifications.js index 4222f207be2df8fbf7d1a5845a0bb2de455a89af..5c69d7d47e8b187334cf3036df63256b0073f203 100644 --- a/gui/slick/js/configNotifications.js +++ b/gui/slick/js/configNotifications.js @@ -1,5 +1,5 @@ $(document).ready(function(){ - var loading = '<img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; + var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; $('#testGrowl').click(function () { var growl_host = $.trim($('#growl_host').val()); @@ -12,7 +12,7 @@ $(document).ready(function(){ $('#growl_host').removeClass('warning'); $(this).prop('disabled', true); $('#testGrowl-result').html(loading); - $.get(sbRoot + '/home/testGrowl', {'host': growl_host, 'password': growl_password}) + $.get(srRoot + '/home/testGrowl', {'host': growl_host, 'password': growl_password}) .done(function (data) { $('#testGrowl-result').html(data); $('#testGrowl').prop('disabled', false); @@ -30,11 +30,10 @@ $(document).ready(function(){ $('#prowl_api').removeClass('warning'); $(this).prop('disabled', true); $('#testProwl-result').html(loading); - $.get(sbRoot + '/home/testProwl', {'prowl_api': prowl_api, 'prowl_priority': prowl_priority}) - .done(function (data) { - $('#testProwl-result').html(data); - $('#testProwl').prop('disabled', false); - }); + $.get(srRoot + '/home/testProwl', {'prowl_api': prowl_api, 'prowl_priority': prowl_priority}).done(function (data) { + $('#testProwl-result').html(data); + $('#testProwl').prop('disabled', false); + }); }); $('#testKODI').click(function () { @@ -49,11 +48,10 @@ $(document).ready(function(){ $('#kodi_host').removeClass('warning'); $(this).prop('disabled', true); $('#testKODI-result').html(loading); - $.get(sbRoot + '/home/testKODI', {'host': kodi_host, 'username': kodi_username, 'password': kodi_password}) - .done(function (data) { - $('#testKODI-result').html(data); - $('#testKODI').prop('disabled', false); - }); + $.get(srRoot + '/home/testKODI', {'host': kodi_host, 'username': kodi_username, 'password': kodi_password}).done(function (data) { + $('#testKODI-result').html(data); + $('#testKODI').prop('disabled', false); + }); }); $('#testPMC').click(function () { @@ -68,11 +66,10 @@ $(document).ready(function(){ $('#plex_host').removeClass('warning'); $(this).prop('disabled', true); $('#testPMC-result').html(loading); - $.get(sbRoot + '/home/testPMC', {'host': plex_host, 'username': plex_client_username, 'password': plex_client_password}) - .done(function (data) { - $('#testPMC-result').html(data); - $('#testPMC').prop('disabled', false); - }); + $.get(srRoot + '/home/testPMC', {'host': plex_host, 'username': plex_client_username, 'password': plex_client_password}).done(function (data) { + $('#testPMC-result').html(data); + $('#testPMC').prop('disabled', false); + }); }); $('#testPMS').click(function () { @@ -88,11 +85,10 @@ $(document).ready(function(){ $('#plex_server_host').removeClass('warning'); $(this).prop('disabled', true); $('#testPMS-result').html(loading); - $.get(sbRoot + '/home/testPMS', {'host': plex_server_host, 'username': plex_username, 'password': plex_password, 'plex_server_token': plex_server_token}) - .done(function (data) { - $('#testPMS-result').html(data); - $('#testPMS').prop('disabled', false); - }); + $.get(srRoot + '/home/testPMS', {'host': plex_server_host, 'username': plex_username, 'password': plex_password, 'plex_server_token': plex_server_token}).done(function (data) { + $('#testPMS-result').html(data); + $('#testPMS').prop('disabled', false); + }); }); $('#testEMBY').click(function () { @@ -115,11 +111,10 @@ $(document).ready(function(){ $('#emby_host,#emby_apikey').removeClass('warning'); $(this).prop('disabled', true); $('#testEMBY-result').html(loading); - $.get(sbRoot + '/home/testEMBY', {'host': emby_host, 'emby_apikey': emby_apikey}) - .done(function (data) { - $('#testEMBY-result').html(data); - $('#testEMBY').prop('disabled', false); - }); + $.get(srRoot + '/home/testEMBY', {'host': emby_host, 'emby_apikey': emby_apikey}).done(function (data) { + $('#testEMBY-result').html(data); + $('#testEMBY').prop('disabled', false); + }); }); $('#testBoxcar').click(function() { @@ -132,11 +127,10 @@ $(document).ready(function(){ $('#boxcar_username').removeClass('warning'); $(this).prop('disabled', true); $('#testBoxcar-result').html(loading); - $.get(sbRoot + '/home/testBoxcar', {'username': boxcar_username}) - .done(function (data) { - $('#testBoxcar-result').html(data); - $('#testBoxcar').prop('disabled', false); - }); + $.get(srRoot + '/home/testBoxcar', {'username': boxcar_username}).done(function (data) { + $('#testBoxcar-result').html(data); + $('#testBoxcar').prop('disabled', false); + }); }); $('#testBoxcar2').click(function () { @@ -149,11 +143,10 @@ $(document).ready(function(){ $('#boxcar2_accesstoken').removeClass('warning'); $(this).prop('disabled', true); $('#testBoxcar2-result').html(loading); - $.get(sbRoot + '/home/testBoxcar2', {'accesstoken': boxcar2_accesstoken}) - .done(function (data) { - $('#testBoxcar2-result').html(data); - $('#testBoxcar2').prop('disabled', false); - }); + $.get(srRoot + '/home/testBoxcar2', {'accesstoken': boxcar2_accesstoken}).done(function (data) { + $('#testBoxcar2-result').html(data); + $('#testBoxcar2').prop('disabled', false); + }); }); $('#testPushover').click(function () { @@ -176,23 +169,26 @@ $(document).ready(function(){ $('#pushover_userkey,#pushover_apikey').removeClass('warning'); $(this).prop('disabled', true); $('#testPushover-result').html(loading); - $.get(sbRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey}) - .done(function (data) { - $('#testPushover-result').html(data); - $('#testPushover').prop('disabled', false); - }); + $.get(srRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey}).done(function (data) { + $('#testPushover-result').html(data); + $('#testPushover').prop('disabled', false); + }); }); $('#testLibnotify').click(function() { $('#testLibnotify-result').html(loading); - $.get(sbRoot + '/home/testLibnotify', - function (data) { $('#testLibnotify-result').html(data); }); + $.get(srRoot + '/home/testLibnotify', function (data) { + $('#testLibnotify-result').html(data); + }); }); $('#twitterStep1').click(function() { $('#testTwitter-result').html(loading); - $.get(sbRoot + '/home/twitterStep1', function (data) {window.open(data); }) - .done(function () { $('#testTwitter-result').html('<b>Step1:</b> Confirm Authorization'); }); + $.get(srRoot + '/home/twitterStep1', function (data) { + window.open(data); + }).done(function() { + $('#testTwitter-result').html('<b>Step1:</b> Confirm Authorization'); + }); }); $('#twitterStep2').click(function () { @@ -204,13 +200,15 @@ $(document).ready(function(){ } $('#twitter_key').removeClass('warning'); $('#testTwitter-result').html(loading); - $.get(sbRoot + '/home/twitterStep2', {'key': twitter_key}, - function (data) { $('#testTwitter-result').html(data); }); + $.get(srRoot + '/home/twitterStep2', {'key': twitter_key}, function(data) { + $('#testTwitter-result').html(data); + }); }); $('#testTwitter').click(function() { - $.get(sbRoot + '/home/testTwitter', - function (data) { $('#testTwitter-result').html(data); }); + $.get(srRoot + '/home/testTwitter', function(data) { + $('#testTwitter-result').html(data); + }); }); $('#settingsNMJ').click(function() { @@ -222,28 +220,27 @@ $(document).ready(function(){ $('#testNMJ-result').html(loading); var nmj_host = $('#nmj_host').val(); - $.get(sbRoot + '/home/settingsNMJ', {'host': nmj_host}, - function (data) { - if (data === null) { - $('#nmj_database').removeAttr('readonly'); - $('#nmj_mount').removeAttr('readonly'); - } - var JSONData = $.parseJSON(data); - $('#testNMJ-result').html(JSONData.message); - $('#nmj_database').val(JSONData.database); - $('#nmj_mount').val(JSONData.mount); - - if (JSONData.database) { - $('#nmj_database').attr('readonly', true); - } else { - $('#nmj_database').removeAttr('readonly'); - } - if (JSONData.mount) { - $('#nmj_mount').attr('readonly', true); - } else { - $('#nmj_mount').removeAttr('readonly'); - } - }); + $.get(srRoot + '/home/settingsNMJ', {'host': nmj_host}, function (data) { + if (data === null) { + $('#nmj_database').removeAttr('readonly'); + $('#nmj_mount').removeAttr('readonly'); + } + var JSONData = $.parseJSON(data); + $('#testNMJ-result').html(JSONData.message); + $('#nmj_database').val(JSONData.database); + $('#nmj_mount').val(JSONData.mount); + + if (JSONData.database) { + $('#nmj_database').attr('readonly', true); + } else { + $('#nmj_database').removeAttr('readonly'); + } + if (JSONData.mount) { + $('#nmj_mount').attr('readonly', true); + } else { + $('#nmj_mount').removeAttr('readonly'); + } + }); }); $('#testNMJ').click(function () { @@ -258,11 +255,10 @@ $(document).ready(function(){ $('#nmj_host').removeClass('warning'); $(this).prop('disabled', true); $('#testNMJ-result').html(loading); - $.get(sbRoot + '/home/testNMJ', {'host': nmj_host, 'database': nmj_database, 'mount': nmj_mount}) - .done(function (data) { - $('#testNMJ-result').html(data); - $('#testNMJ').prop('disabled', false); - }); + $.get(srRoot + '/home/testNMJ', {'host': nmj_host, 'database': nmj_database, 'mount': nmj_mount}).done(function (data) { + $('#testNMJ-result').html(data); + $('#testNMJ').prop('disabled', false); + }); }); $('#settingsNMJv2').click(function() { @@ -283,8 +279,7 @@ $(document).ready(function(){ } var nmjv2_dbinstance=$('#NMJv2db_instance').val(); - $.get(sbRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance}, - function (data){ + $.get(srRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance}, function (data){ if (data === null) { $('#nmjv2_database').removeAttr('readonly'); } @@ -292,10 +287,11 @@ $(document).ready(function(){ $('#testNMJv2-result').html(JSONData.message); $('#nmjv2_database').val(JSONData.database); - if (JSONData.database) + if (JSONData.database){ $('#nmjv2_database').attr('readonly', true); - else + } else { $('#nmjv2_database').removeAttr('readonly'); + } }); }); @@ -309,11 +305,10 @@ $(document).ready(function(){ $('#nmjv2_host').removeClass('warning'); $(this).prop('disabled', true); $('#testNMJv2-result').html(loading); - $.get(sbRoot + '/home/testNMJv2', {'host': nmjv2_host}) - .done(function (data) { - $('#testNMJv2-result').html(data); - $('#testNMJv2').prop('disabled', false); - }); + $.get(srRoot + '/home/testNMJv2', {'host': nmjv2_host}) .done(function (data) { + $('#testNMJv2-result').html(data); + $('#testNMJv2').prop('disabled', false); + }); }); $('#testFreeMobile').click(function () { @@ -336,11 +331,10 @@ $(document).ready(function(){ $('#freemobile_id,#freemobile_apikey').removeClass('warning'); $(this).prop('disabled', true); $('#testFreeMobile-result').html(loading); - $.get(sbRoot + '/home/testFreeMobile', {'freemobile_id': freemobile_id, 'freemobile_apikey': freemobile_apikey}) - .done(function (data) { - $('#testFreeMobile-result').html(data); - $('#testFreeMobile').prop('disabled', false); - }); + $.get(srRoot + '/home/testFreeMobile', {'freemobile_id': freemobile_id, 'freemobile_apikey': freemobile_apikey}).done(function (data) { + $('#testFreeMobile-result').html(data); + $('#testFreeMobile').prop('disabled', false); + }); }); $('#TraktGetPin').click(function () { @@ -350,27 +344,13 @@ $(document).ready(function(){ $('#trakt_pin').removeClass('hide'); }); - $('#trakt_pin').change(function() { - var trakt_pin = $('#trakt_pin').val(); - - if (trakt_pin.length !== 0) { - $('#TraktGetPin').addClass('hide'); - $('#authTrakt').removeClass('hide'); - } - else { - $('#TraktGetPin').removeClass('hide'); - $('#authTrakt').addClass('hide'); - } - }); - - $('#trakt_pin').keyup(function () { + $('#trakt_pin').on('keyup change', function(){ var trakt_pin = $('#trakt_pin').val(); if (trakt_pin.length !== 0) { $('#TraktGetPin').addClass('hide'); $('#authTrakt').removeClass('hide'); - } - else { + } else { $('#TraktGetPin').removeClass('hide'); $('#authTrakt').addClass('hide'); } @@ -379,12 +359,11 @@ $(document).ready(function(){ $('#authTrakt').click(function() { var trakt_pin = $('#trakt_pin').val(); if (trakt_pin.length !== 0) { - $.get(sbRoot + '/home/getTraktToken', { "trakt_pin": trakt_pin }) - .done(function (data) { - $('#testTrakt-result').html(data); - $('#authTrakt').addClass('hide'); - $('#trakt_pin').addClass('hide'); - $('#TraktGetPin').addClass('hide'); + $.get(srRoot + '/home/getTraktToken', { "trakt_pin": trakt_pin }).done(function (data) { + $('#testTrakt-result').html(data); + $('#authTrakt').addClass('hide'); + $('#trakt_pin').addClass('hide'); + $('#TraktGetPin').addClass('hide'); }); } }); @@ -404,18 +383,17 @@ $(document).ready(function(){ if (/\s/g.test(trakt_trending_blacklist)) { $('#testTrakt-result').html('Check blacklist name; the value need to be a trakt slug'); - $('#trakt_blacklist_name').addClass('warning'); + $('#trakt_blacklist_name').addClass('warning'); return; } $('#trakt_username').removeClass('warning'); - $('#trakt_blacklist_name').removeClass('warning'); + $('#trakt_blacklist_name').removeClass('warning'); $(this).prop('disabled', true); $('#testTrakt-result').html(loading); - $.get(sbRoot + '/home/testTrakt', {'username': trakt_username, 'blacklist_name': trakt_trending_blacklist}) - .done(function (data) { - $('#testTrakt-result').html(data); - $('#testTrakt').prop('disabled', false); - }); + $.get(srRoot + '/home/testTrakt', {'username': trakt_username, 'blacklist_name': trakt_trending_blacklist}).done(function (data) { + $('#testTrakt-result').html(data); + $('#testTrakt').prop('disabled', false); + }); }); $('#testEmail').click(function () { @@ -448,8 +426,9 @@ $(document).ready(function(){ if (to === null || to.length === 0 || to.match(/.*@.*/) === null) { status.html('<p style="color: red;">You must provide a recipient email address!</p>'); } else { - $.get(sbRoot + '/home/testEmail', {host: host, port: port, smtp_from: from, use_tls: tls, user: user, pwd: pwd, to: to}, - function (msg) { $('#testEmail-result').html(msg); }); + $.get(srRoot + '/home/testEmail', {host: host, port: port, smtp_from: from, use_tls: tls, user: user, pwd: pwd, to: to}, function (msg) { + $('#testEmail-result').html(msg); + }); } } }); @@ -465,11 +444,10 @@ $(document).ready(function(){ $('#nma_api').removeClass('warning'); $(this).prop('disabled', true); $('#testNMA-result').html(loading); - $.get(sbRoot + '/home/testNMA', {'nma_api': nma_api, 'nma_priority': nma_priority}) - .done(function (data) { - $('#testNMA-result').html(data); - $('#testNMA').prop('disabled', false); - }); + $.get(srRoot + '/home/testNMA', {'nma_api': nma_api, 'nma_priority': nma_priority}).done(function (data) { + $('#testNMA-result').html(data); + $('#testNMA').prop('disabled', false); + }); }); $('#testPushalot').click(function () { @@ -482,11 +460,10 @@ $(document).ready(function(){ $('#pushalot_authorizationtoken').removeClass('warning'); $(this).prop('disabled', true); $('#testPushalot-result').html(loading); - $.get(sbRoot + '/home/testPushalot', {'authorizationToken': pushalot_authorizationtoken}) - .done(function (data) { - $('#testPushalot-result').html(data); - $('#testPushalot').prop('disabled', false); - }); + $.get(srRoot + '/home/testPushalot', {'authorizationToken': pushalot_authorizationtoken}).done(function (data) { + $('#testPushalot-result').html(data); + $('#testPushalot').prop('disabled', false); + }); }); $('#testPushbullet').click(function () { @@ -499,18 +476,15 @@ $(document).ready(function(){ $('#pushbullet_api').removeClass('warning'); $(this).prop('disabled', true); $('#testPushbullet-result').html(loading); - $.get(sbRoot + '/home/testPushbullet', {'api': pushbullet_api}) - .done(function (data) { - $('#testPushbullet-result').html(data); - $('#testPushbullet').prop('disabled', false); - }); + $.get(srRoot + '/home/testPushbullet', {'api': pushbullet_api}).done(function (data) { + $('#testPushbullet-result').html(data); + $('#testPushbullet').prop('disabled', false); + }); }); function get_pushbullet_devices(msg){ - if(msg){ - $('#testPushbullet-result').html(loading); - } + if(msg) $('#testPushbullet-result').html(loading); var pushbullet_api = $("#pushbullet_api").val(); @@ -520,30 +494,26 @@ $(document).ready(function(){ return false; } - $.get(sbRoot + "/home/getPushbulletDevices", {'api': pushbullet_api}, - function (data) { - var devices = jQuery.parseJSON(data).devices; - var current_pushbullet_device = $("#pushbullet_device").val(); - $("#pushbullet_device_list").html(''); - for (var i = 0; i < devices.length; i++) { - if(devices[i].active === true) { - if(current_pushbullet_device == devices[i].iden) { - $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'" selected>' + devices[i].nickname + '</option>'); - } else { - $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'">' + devices[i].nickname + '</option>'); - } + $.get(srRoot + "/home/getPushbulletDevices", {'api': pushbullet_api}, function (data) { + var devices = jQuery.parseJSON(data).devices; + var current_pushbullet_device = $("#pushbullet_device").val(); + $("#pushbullet_device_list").html(''); + for (var i = 0; i < devices.length; i++) { + if(devices[i].active === true) { + if(current_pushbullet_device == devices[i].iden) { + $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'" selected>' + devices[i].nickname + '</option>'); + } else { + $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'">' + devices[i].nickname + '</option>'); } } - if (current_pushbullet_device === '') { - $("#pushbullet_device_list").prepend('<option value="" selected>All devices</option>'); - } else { - $("#pushbullet_device_list").prepend('<option value="">All devices</option>'); - } - if(msg) { - $('#testPushbullet-result').html(msg); - } } - ); + if (current_pushbullet_device === '') { + $("#pushbullet_device_list").prepend('<option value="" selected>All devices</option>'); + } else { + $("#pushbullet_device_list").prepend('<option value="">All devices</option>'); + } + if(msg) $('#testPushbullet-result').html(msg); + }); $("#pushbullet_device_list").change(function(){ $("#pushbullet_device").val($("#pushbullet_device_list").val()); @@ -558,22 +528,22 @@ $(document).ready(function(){ // we have to call this function on dom ready to create the devices select get_pushbullet_devices(); - $('#email_show').change(function () { + $('#email_show').change(function() { var key = parseInt($('#email_show').val(), 10); $('#email_show_list').val(key >= 0 ? notify_data[key.toString()].list : ''); }); // Update the internal data struct anytime settings are saved to the server - $('#email_show').bind('notify', function () { load_show_notify_lists(); }); + $('#email_show').bind('notify', function() { + load_show_notify_lists(); + }); function load_show_notify_lists() { - $.get(sbRoot + "/home/loadShowNotifyLists", function (data) { + $.get(srRoot + "/home/loadShowNotifyLists", function(data) { var list, html, s; list = $.parseJSON(data); notify_data = list; - if (list._size === 0) { - return; - } + if (list._size === 0) return; html = '<option value="-1">-- Select --</option>'; for (s in list) { if (s.charAt(0) !== '_') { @@ -588,7 +558,7 @@ $(document).ready(function(){ load_show_notify_lists(); $('#email_show_save').click(function() { - $.post(sbRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) { + $.post(srRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) { // Reload the per show notify lists to reflect changes load_show_notify_lists(); }); @@ -596,11 +566,10 @@ $(document).ready(function(){ // show instructions for plex when enabled $('#use_plex').click(function() { - if ( $(this).is(':checked') ) { + if ($(this).is(':checked')) { $('.plexinfo').removeClass('hide'); } else { $('.plexinfo').addClass('hide'); } }); - }); diff --git a/gui/slick/js/configPostProcessing.js b/gui/slick/js/configPostProcessing.js index 0f6b36787004d106f7f86bbb1b16e618edac55f7..ff1bb61ad46f8bebfb6df6d349a7650056aa441d 100644 --- a/gui/slick/js/configPostProcessing.js +++ b/gui/slick/js/configPostProcessing.js @@ -1,5 +1,4 @@ $(document).ready(function () { - // http://stackoverflow.com/questions/2219924/idiomatic-jquery-delayed-event-only-after-a-short-pause-in-typing-e-g-timew var typewatch = (function () { var timer = 0; @@ -11,19 +10,16 @@ $(document).ready(function () { function israr_supported() { var pattern = $('#naming_pattern').val(); - $.get(sbRoot + '/config/postProcessing/isRarSupported', - function (data) { - if (data == "supported") { - } else { - $('#unpack').qtip('option', { - 'content.text': 'Unrar Executable not found.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#unpack').qtip('toggle', true); - $('#unpack').css('background-color', '#FFFFDD'); - - } - }); + $.get(srRoot + '/config/postProcessing/isRarSupported', function (data) { + if (data !== "supported") { + $('#unpack').qtip('option', { + 'content.text': 'Unrar Executable not found.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#unpack').qtip('toggle', true); + $('#unpack').css('background-color', '#FFFFDD'); + } + }); } function fill_examples() { @@ -31,134 +27,124 @@ $(document).ready(function () { var multi = $('#naming_multi_ep :selected').val(); var anime_type = $('input[name="naming_anime"]:checked').val(); - $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: 3}, - function (data) { - if (data) { - $('#naming_example').text(data + '.ext'); - $('#naming_example_div').show(); - } else { - $('#naming_example_div').hide(); - } - }); - - $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: 3}, - function (data) { - if (data) { - $('#naming_example_multi').text(data + '.ext'); - $('#naming_example_multi_div').show(); - } else { - $('#naming_example_multi_div').hide(); - } - }); - - $.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, - function (data) { - if (data == "invalid") { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern is invalid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_pattern').qtip('toggle', true); - $('#naming_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_pattern').qtip('toggle', true); - $('#naming_pattern').css('background-color', '#FFFFDD'); - } else { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern is valid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-green' - }); - $('#naming_pattern').qtip('toggle', false); - $('#naming_pattern').css('background-color', '#FFFFFF'); - } - }); + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: 3}, function (data) { + if (data) { + $('#naming_example').text(data + '.ext'); + $('#naming_example_div').show(); + } else { + $('#naming_example_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: 3}, function (data) { + if (data) { + $('#naming_example_multi').text(data + '.ext'); + $('#naming_example_multi_div').show(); + } else { + $('#naming_example_multi_div').hide(); + } + }); + $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { + if (data == "invalid") { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern is invalid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_pattern').qtip('toggle', true); + $('#naming_pattern').css('background-color', '#FFDDDD'); + } else if (data == "seasonfolders") { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_pattern').qtip('toggle', true); + $('#naming_pattern').css('background-color', '#FFFFDD'); + } else { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern is valid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-green' + }); + $('#naming_pattern').qtip('toggle', false); + $('#naming_pattern').css('background-color', '#FFFFFF'); + } + }); } function fill_abd_examples() { var pattern = $('#naming_abd_pattern').val(); - $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'}, - function (data) { - if (data) { - $('#naming_abd_example').text(data + '.ext'); - $('#naming_abd_example_div').show(); - } else { - $('#naming_abd_example_div').hide(); - } - }); - - $.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, abd: 'True'}, - function (data) { - if (data == "invalid") { - $('#naming_abd_pattern').qtip('option', { - 'content.text': 'This pattern is invalid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_abd_pattern').qtip('toggle', true); - $('#naming_abd_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { - $('#naming_abd_pattern').qtip('option', { - 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_abd_pattern').qtip('toggle', true); - $('#naming_abd_pattern').css('background-color', '#FFFFDD'); - } else { - $('#naming_abd_pattern').qtip('option', { - 'content.text': 'This pattern is valid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-green' - }); - $('#naming_abd_pattern').qtip('toggle', false); - $('#naming_abd_pattern').css('background-color', '#FFFFFF'); - } - }); + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'}, function (data) { + if (data) { + $('#naming_abd_example').text(data + '.ext'); + $('#naming_abd_example_div').show(); + } else { + $('#naming_abd_example_div').hide(); + } + }); + $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, abd: 'True'}, function (data) { + if (data == "invalid") { + $('#naming_abd_pattern').qtip('option', { + 'content.text': 'This pattern is invalid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_abd_pattern').qtip('toggle', true); + $('#naming_abd_pattern').css('background-color', '#FFDDDD'); + } else if (data == "seasonfolders") { + $('#naming_abd_pattern').qtip('option', { + 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_abd_pattern').qtip('toggle', true); + $('#naming_abd_pattern').css('background-color', '#FFFFDD'); + } else { + $('#naming_abd_pattern').qtip('option', { + 'content.text': 'This pattern is valid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-green' + }); + $('#naming_abd_pattern').qtip('toggle', false); + $('#naming_abd_pattern').css('background-color', '#FFFFFF'); + } + }); } function fill_sports_examples() { var pattern = $('#naming_sports_pattern').val(); - $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'}, - function (data) { - if (data) { - $('#naming_sports_example').text(data + '.ext'); - $('#naming_sports_example_div').show(); - } else { - $('#naming_sports_example_div').hide(); - } - }); - - $.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, sports: 'True'}, - function (data) { - if (data == "invalid") { - $('#naming_sports_pattern').qtip('option', { - 'content.text': 'This pattern is invalid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_sports_pattern').qtip('toggle', true); - $('#naming_sports_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { - $('#naming_sports_pattern').qtip('option', { - 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_sports_pattern').qtip('toggle', true); - $('#naming_sports_pattern').css('background-color', '#FFFFDD'); - } else { - $('#naming_sports_pattern').qtip('option', { - 'content.text': 'This pattern is valid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-green' - }); - $('#naming_sports_pattern').qtip('toggle', false); - $('#naming_sports_pattern').css('background-color', '#FFFFFF'); - } - }); + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'}, function (data) { + if (data) { + $('#naming_sports_example').text(data + '.ext'); + $('#naming_sports_example_div').show(); + } else { + $('#naming_sports_example_div').hide(); + } + }); + $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, sports: 'True'}, function (data) { + if (data == "invalid") { + $('#naming_sports_pattern').qtip('option', { + 'content.text': 'This pattern is invalid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_sports_pattern').qtip('toggle', true); + $('#naming_sports_pattern').css('background-color', '#FFDDDD'); + } else if (data == "seasonfolders") { + $('#naming_sports_pattern').qtip('option', { + 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_sports_pattern').qtip('toggle', true); + $('#naming_sports_pattern').css('background-color', '#FFFFDD'); + } else { + $('#naming_sports_pattern').qtip('option', { + 'content.text': 'This pattern is valid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-green' + }); + $('#naming_sports_pattern').qtip('toggle', false); + $('#naming_sports_pattern').css('background-color', '#FFFFFF'); + } + }); } function fill_anime_examples() { @@ -166,51 +152,48 @@ $(document).ready(function () { var multi = $('#naming_anime_multi_ep :selected').val(); var anime_type = $('input[name="naming_anime"]:checked').val(); - $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: anime_type}, - function (data) { - if (data) { - $('#naming_example_anime').text(data + '.ext'); - $('#naming_example_anime_div').show(); - } else { - $('#naming_example_anime_div').hide(); - } - }); - - $.get(sbRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: anime_type}, - function (data) { - if (data) { - $('#naming_example_multi_anime').text(data + '.ext'); - $('#naming_example_multi_anime_div').show(); - } else { - $('#naming_example_multi_anime_div').hide(); - } - }); - - $.get(sbRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, - function (data) { - if (data == "invalid") { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern is invalid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_pattern').qtip('toggle', true); - $('#naming_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_pattern').qtip('toggle', true); - $('#naming_pattern').css('background-color', '#FFFFDD'); - } else { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern is valid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-green' - }); - $('#naming_pattern').qtip('toggle', false); - $('#naming_pattern').css('background-color', '#FFFFFF'); - } - }); + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: anime_type}, function (data) { + if (data) { + $('#naming_example_anime').text(data + '.ext'); + $('#naming_example_anime_div').show(); + } else { + $('#naming_example_anime_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { + if (data) { + $('#naming_example_multi_anime').text(data + '.ext'); + $('#naming_example_multi_anime_div').show(); + } else { + $('#naming_example_multi_anime_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { + if (data == "invalid") { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern is invalid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_pattern').qtip('toggle', true); + $('#naming_pattern').css('background-color', '#FFDDDD'); + } else if (data == "seasonfolders") { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_pattern').qtip('toggle', true); + $('#naming_pattern').css('background-color', '#FFFFDD'); + } else { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern is valid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-green' + }); + $('#naming_pattern').qtip('toggle', false); + $('#naming_pattern').css('background-color', '#FFFFFF'); + } + }); } function setup_naming() { @@ -257,7 +240,7 @@ $(document).ready(function () { fill_anime_examples(); } - $('#unpack').change(function () { + $('#unpack').on('change', function(){ if(this.checked) { israr_supported(); } else { @@ -265,35 +248,35 @@ $(document).ready(function () { } }); - $('#name_presets').change(function () { + $('#name_presets').on('change', function(){ setup_naming(); }); - $('#name_abd_presets').change(function () { + $('#name_abd_presets').on('change', function(){ setup_abd_naming(); }); - $('#naming_custom_abd').change(function () { + $('#naming_custom_abd').on('change', function(){ setup_abd_naming(); }); - $('#name_sports_presets').change(function () { + $('#name_sports_presets').on('change', function(){ setup_sports_naming(); }); - $('#naming_custom_sports').change(function () { + $('#naming_custom_sports').on('change', function(){ setup_sports_naming(); }); - $('#name_anime_presets').change(function () { + $('#name_anime_presets').on('change', function(){ setup_anime_naming(); }); - $('#naming_custom_anime').change(function () { + $('#naming_custom_anime').on('change', function(){ setup_anime_naming(); }); - $('input[name="naming_anime"]').click(function(){ + $('input[name="naming_anime"]').on('click', function(){ setup_anime_naming(); }); @@ -334,19 +317,19 @@ $(document).ready(function () { }, 500); }); - $('#show_naming_key').click(function () { + $('#show_naming_key').on('click', function(){ $('#naming_key').toggle(); }); - $('#show_naming_abd_key').click(function () { + $('#show_naming_abd_key').on('click', function(){ $('#naming_abd_key').toggle(); }); - $('#show_naming_sports_key').click(function () { + $('#show_naming_sports_key').on('click', function(){ $('#naming_sports_key').toggle(); }); - $('#show_naming_anime_key').click(function () { + $('#show_naming_anime_key').on('click', function(){ $('#naming_anime_key').toggle(); }); - $('#do_custom').click(function () { + $('#do_custom').on('click', function(){ $('#naming_pattern').val($('#name_presets :selected').attr('id')); $('#naming_custom').show(); $('#naming_pattern').focus(); @@ -356,7 +339,6 @@ $(document).ready(function () { setup_sports_naming(); setup_anime_naming(); - // -- start of metadata options div toggle code -- $('#metadataType').on('change keyup', function () { $(this).showHideMetadata(); @@ -378,12 +360,11 @@ $(document).ready(function () { $(this).showHideMetadata(); // -- end of metadata options div toggle code -- - $('.metadata_checkbox').click(function () { + $('.metadata_checkbox').on('click', function(){ $(this).refreshMetadataConfig(false); }); $.fn.refreshMetadataConfig = function (first) { - var cur_most = 0; var cur_most_provider = ''; @@ -440,11 +421,10 @@ $(document).ready(function () { $('#metadataType option[value=' + cur_most_provider + ']').attr('selected', 'selected'); $(this).showHideMetadata(); } - }; $(this).refreshMetadataConfig(true); - $('img[title]').qtip( { + $('img[title]').qtip({ position: { viewport: $(window), at: 'bottom center', @@ -458,7 +438,7 @@ $(document).ready(function () { classes: 'qtip-shadow qtip-dark' } }); - $('i[title]').qtip( { + $('i[title]').qtip({ position: { viewport: $(window), at: 'top center', @@ -472,7 +452,7 @@ $(document).ready(function () { classes: 'qtip-rounded qtip-shadow ui-tooltip-sb' } }); - $('.custom-pattern,#unpack').qtip( { + $('.custom-pattern,#unpack').qtip({ content: 'validating...', show: { event: false, @@ -492,5 +472,4 @@ $(document).ready(function () { classes: 'qtip-rounded qtip-shadow qtip-red' } }); - }); diff --git a/gui/slick/js/configProviders.js b/gui/slick/js/configProviders.js index f9560b362ef6eb3553da436b5b1e669161446d01..466df5ceb8c2b47b3e72ae5b12235185359cd8bd 100644 --- a/gui/slick/js/configProviders.js +++ b/gui/slick/js/configProviders.js @@ -1,5 +1,4 @@ $(document).ready(function(){ - $.fn.showHideProviders = function() { $('.providerDiv').each(function(){ var providerName = $(this).attr('id'); @@ -37,8 +36,8 @@ $(document).ready(function(){ var params = {url: url, name: name, key: key}; var returnData; - $(".updating_categories").wrapInner('<span><img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>'); - var jqxhr = $.getJSON(sbRoot + '/config/providers/getNewznabCategories', params, + $(".updating_categories").wrapInner('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>'); + var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params, function(data){ $(this).updateNewznabCaps( data, selectedProvider ); console.debug(data.tv_categories); @@ -67,7 +66,7 @@ $(document).ready(function(){ } if ($('#provider_order_list > #'+id).length === 0 && showProvider !== false) { - var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + sbRoot + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; + var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; $('#provider_order_list').append(toAdd); $('#provider_order_list').sortable("refresh"); @@ -85,7 +84,7 @@ $(document).ready(function(){ $(this).populateTorrentRssSection(); if ($('#provider_order_list > #'+id).length === 0) { - var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + sbRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; + var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; $('#provider_order_list').append(toAdd); $('#provider_order_list').sortable("refresh"); @@ -467,14 +466,12 @@ $(document).ready(function(){ var params = {name: name}; // send to the form with ajax, get a return value - $.getJSON(sbRoot + '/config/providers/canAddNewznabProvider', params, - function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } - - $(this).addProvider(data.success, name, url, key, cat, 0); + $.getJSON(srRoot + '/config/providers/canAddNewznabProvider', params, function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } + $(this).addProvider(data.success, name, url, key, cat, 0); }); }); @@ -494,7 +491,7 @@ $(document).ready(function(){ var params = { name: name, url: url, cookies: cookies, titleTAG: titleTAG}; // send to the form with ajax, get a return value - $.getJSON(sbRoot + '/config/providers/canAddTorrentRssProvider', params, + $.getJSON(srRoot + '/config/providers/canAddTorrentRssProvider', params, function(data){ if (data.error !== undefined) { alert(data.error); diff --git a/gui/slick/js/configSearch.js b/gui/slick/js/configSearch.js index 14c839b61748a7646ec99d15a10de8c16aca0640..35dfd6b00c9c1c03e52c0ce85a8aaed4374068bb 100644 --- a/gui/slick/js/configSearch.js +++ b/gui/slick/js/configSearch.js @@ -1,15 +1,15 @@ $(document).ready(function(){ - var loading = '<img src="' + sbRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; + var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; function toggle_torrent_title(){ - if ($('#use_torrents').prop('checked')) + if ($('#use_torrents').prop('checked')){ $('#no_torrents').show(); - else + } else { $('#no_torrents').hide(); + } } $.fn.nzb_method_handler = function() { - var selectedProvider = $('#nzb_method :selected').val(), blackhole_settings = '#blackhole_settings', sabnzbd_settings = '#sabnzbd_settings', @@ -188,8 +188,10 @@ $(document).ready(function(){ var sab_password = $('#sab_password').val(); var sab_apiKey = $('#sab_apikey').val(); - $.get(sbRoot + '/home/testSABnzbd', {'host': sab_host, 'username': sab_username, 'password': sab_password, 'apikey': sab_apiKey}, - function (data){ $('#testSABnzbd_result').html(data); }); + $.get(srRoot + '/home/testSABnzbd', {'host': sab_host, 'username': sab_username, 'password': sab_password, 'apikey': sab_apiKey}, + function(data){ + $('#testSABnzbd_result').html(data); + }); }); @@ -208,8 +210,8 @@ $(document).ready(function(){ var torrent_username = $('#torrent_username').val(); var torrent_password = $('#torrent_password').val(); - $.get(sbRoot + '/home/testTorrent', {'torrent_method': torrent_method, 'host': torrent_host, 'username': torrent_username, 'password': torrent_password}, - function (data){ $('#test_torrent_result').html(data); }); + $.get(srRoot + '/home/testTorrent', {'torrent_method': torrent_method, 'host': torrent_host, 'username': torrent_username, 'password': torrent_password}, + function(data){ $('#test_torrent_result').html(data); }); }); $('#torrent_host').change($(this).rtorrent_scgi); diff --git a/gui/slick/js/configSubtitles.js b/gui/slick/js/configSubtitles.js index 6a3f2f5f1a7374808800f1fecb60062f6c080502..05974d6dfb467491a8f66bbdbabb7a5e4c1418c2 100644 --- a/gui/slick/js/configSubtitles.js +++ b/gui/slick/js/configSubtitles.js @@ -5,11 +5,11 @@ $(document).ready(function(){ var serviceName = $(this).attr('id'); var selectedService = $('#editAService :selected').val(); - if (selectedService+'Div' == serviceName) + if (selectedService+'Div' == serviceName){ $(this).show(); - else + } else { $(this).hide(); - + } }); }; @@ -19,12 +19,11 @@ $(document).ready(function(){ var newData = [isDefault, [name, url, key]]; if ($('#service_order_list > #'+id).length === 0 && showService !== false) { - var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="service_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + sbRoot + '/images/services/newznab.gif" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; + var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="service_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/services/newznab.gif" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; $('#service_order_list').append(toAdd); $('#service_order_list').sortable("refresh"); } - }; $.fn.deleteService = function (id) { @@ -32,14 +31,14 @@ $(document).ready(function(){ }; $.fn.refreshServiceList = function() { - var idArr = $("#service_order_list").sortable('toArray'); - var finalArr = []; - $.each(idArr, function(key, val) { - var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; - finalArr.push(val + ':' + checked); - }); - - $("#service_order").val(finalArr.join(' ')); + var idArr = $("#service_order_list").sortable('toArray'); + var finalArr = []; + $.each(idArr, function(key, val) { + var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; + finalArr.push(val + ':' + checked); + }); + + $("#service_order").val(finalArr.join(' ')); }; $('#editAService').change(function(){ @@ -63,5 +62,4 @@ $(document).ready(function(){ }); $("#service_order_list").disableSelection(); - }); diff --git a/gui/slick/js/confirmations.js b/gui/slick/js/confirmations.js index b88dab2f21b12de2a0dc1c40cff4fdbdfec3e48b..2746732902d192ee5bd37f1985addd59ebf5493b 100644 --- a/gui/slick/js/confirmations.js +++ b/gui/slick/js/confirmations.js @@ -1,5 +1,5 @@ $(document).ready(function () { - $('a.shutdown').bind('click', function(e) { + $('a.shutdown').on('click', function(e) { e.preventDefault(); var target = $(this).attr('href'); $.confirm({ @@ -20,7 +20,7 @@ $(document).ready(function () { }); }); - $('a.restart').bind('click', function(e) { + $('a.restart').on('click', function(e) { e.preventDefault(); var target = $(this).attr('href'); $.confirm({ @@ -64,7 +64,7 @@ $(document).ready(function () { }); }); - $('a.clearhistory').bind('click', function(e) { + $('a.clearhistory').on('click', function(e) { e.preventDefault(); var target = $(this).attr('href'); $.confirm({ @@ -85,7 +85,7 @@ $(document).ready(function () { }); }); - $('a.trimhistory').bind('click', function(e) { + $('a.trimhistory').on('click', function(e) { e.preventDefault(); var target = $(this).attr('href'); $.confirm({ diff --git a/gui/slick/js/displayShow.js b/gui/slick/js/displayShow.js index 8f413118b1cf5c9e4d49022e9a763970a2c3bc5d..138abad496103bb89f8775aadf5aa922474c2e53 100644 --- a/gui/slick/js/displayShow.js +++ b/gui/slick/js/displayShow.js @@ -1,10 +1,10 @@ $(document).ready(function () { - $('#sbRoot').ajaxEpSearch({'colorRow': true}); + $('#srRoot').ajaxEpSearch({'colorRow': true}); - $('#sbRoot').ajaxEpSubtitlesSearch(); + $('#srRoot').ajaxEpSubtitlesSearch(); - $('#seasonJump').change(function () { + $('#seasonJump').on('change', function(){ var id = $('#seasonJump option:selected').val(); if (id && id != 'jump') { var season = $('#seasonJump option:selected').data('season'); @@ -15,18 +15,18 @@ $(document).ready(function () { $(this).val('jump'); }); - $("#prevShow").click(function () { + $("#prevShow").on('click', function(){ $('#pickShow option:selected').prev('option').prop('selected', 'selected'); $("#pickShow").change(); }); - $("#nextShow").click(function () { + $("#nextShow").on('click', function(){ $('#pickShow option:selected').next('option').prop('selected', 'selected'); $("#pickShow").change(); }); - $('#changeStatus').click(function () { - var sbRoot = $('#sbRoot').val(); + $('#changeStatus').on('click', function(){ + var srRoot = $('#srRoot').val(); var epArr = []; $('.epCheck').each(function () { @@ -35,12 +35,11 @@ $(document).ready(function () { if (epArr.length === 0) return false; - url = sbRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val(); + url = srRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val(); window.location.href = url; - }); - $('.seasonCheck').click(function () { + $('.seasonCheck').on('click', function(){ var seasCheck = this; var seasNo = $(seasCheck).attr('id'); @@ -52,7 +51,7 @@ $(document).ready(function () { }); var lastCheck = null; - $('.epCheck').click(function (event) { + $('.epCheck').on('click', function (event) { if (!lastCheck || !event.shiftKey) { lastCheck = this; @@ -62,7 +61,7 @@ $(document).ready(function () { var check = this; var found = 0; - $('.epCheck').each(function () { + $('.epCheck').each(function() { switch (found) { case 2: return false; @@ -78,7 +77,7 @@ $(document).ready(function () { }); // selects all visible episode checkboxes. - $('.seriesCheck').click(function () { + $('.seriesCheck').on('click', function () { $('.epCheck:visible').each(function () { this.checked = true; }); @@ -88,7 +87,7 @@ $(document).ready(function () { }); // clears all visible episode checkboxes and the season selectors - $('.clearAll').click(function () { + $('.clearAll').on('click', function () { $('.epCheck:visible').each(function () { this.checked = false; }); @@ -98,11 +97,11 @@ $(document).ready(function () { }); // handle the show selection dropbox - $('#pickShow').change(function () { - var sbRoot = $('#sbRoot').val(); + $('#pickShow').on('change', function () { + var srRoot = $('#srRoot').val(); var val = $(this).val(); if (val === 0) return; - url = sbRoot + '/home/displayShow?show=' + val; + url = srRoot + '/home/displayShow?show=' + val; window.location.href = url; }); @@ -124,8 +123,7 @@ $(document).ready(function () { }); }); - $.fn.showHideRows = function (whichClass) { - + $.fn.showHideRows = function(whichClass) { var status = $('#checkboxControls > input, #' + whichClass).prop('checked'); $("tr." + whichClass).each(function (e) { if (status) { @@ -153,75 +151,68 @@ $(document).ready(function () { }; function setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) { - var sbRoot = $('#sbRoot').val(); + var srRoot = $('#srRoot').val(); var showId = $('#showID').val(); var indexer = $('#indexer').val(); if (sceneSeason === '') sceneSeason = null; if (sceneEpisode === '') sceneEpisode = null; - $.getJSON(sbRoot + '/home/setSceneNumbering', - { - 'show': showId, - 'indexer': indexer, - 'forSeason': forSeason, - 'forEpisode': forEpisode, - 'sceneSeason': sceneSeason, - 'sceneEpisode': sceneEpisode - }, - function (data) { - // Set the values we get back - if (data.sceneSeason === null || data.sceneEpisode === null) { - $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(''); - } - else { - $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(data.sceneSeason + 'x' + data.sceneEpisode); - } - if (!data.success) { - if (data.errorMessage) { - alert(data.errorMessage); - } else { - alert('Update failed.'); - } + $.getJSON(srRoot + '/home/setSceneNumbering',{ + 'show': showId, + 'indexer': indexer, + 'forSeason': forSeason, + 'forEpisode': forEpisode, + 'sceneSeason': sceneSeason, + 'sceneEpisode': sceneEpisode + }, function(data) { + // Set the values we get back + if (data.sceneSeason === null || data.sceneEpisode === null) { + $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(''); + } else { + $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(data.sceneSeason + 'x' + data.sceneEpisode); + } + if (!data.success) { + if (data.errorMessage) { + alert(data.errorMessage); + } else { + alert('Update failed.'); } } - ); + }); } function setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute) { - var sbRoot = $('#sbRoot').val(); + var srRoot = $('#srRoot').val(); var showId = $('#showID').val(); var indexer = $('#indexer').val(); if (sceneAbsolute === '') sceneAbsolute = null; - $.getJSON(sbRoot + '/home/setSceneNumbering', - { - 'show': showId, - 'indexer': indexer, - 'forAbsolute': forAbsolute, - 'sceneAbsolute': sceneAbsolute - }, - function (data) { - // Set the values we get back - if (data.sceneAbsolute === null) { - $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(''); - } - else { - $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(data.sceneAbsolute); - } - if (!data.success) { - if (data.errorMessage) { - alert(data.errorMessage); - } else { - alert('Update failed.'); - } + $.getJSON(srRoot + '/home/setSceneNumbering', { + 'show': showId, + 'indexer': indexer, + 'forAbsolute': forAbsolute, + 'sceneAbsolute': sceneAbsolute + }, + function(data) { + // Set the values we get back + if (data.sceneAbsolute === null) { + $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(''); + } else { + $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(data.sceneAbsolute); + } + if (!data.success) { + if (data.errorMessage) { + alert(data.errorMessage); + } else { + alert('Update failed.'); } } - ); + }); } - $('.sceneSeasonXEpisode').change(function () { + $('.sceneSeasonXEpisode').on('change', function() { // Strip non-numeric characters $(this).val($(this).val().replace(/[^0-9xX]*/g, '')); var forSeason = $(this).attr('data-for-season'); @@ -239,7 +230,7 @@ $(document).ready(function () { setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode); }); - $('.sceneAbsolute').change(function () { + $('.sceneAbsolute').on('change', function() { // Strip non-numeric characters $(this).val($(this).val().replace(/[^0-9xX]*/g, '')); var forAbsolute = $(this).attr('data-for-absolute'); diff --git a/gui/slick/js/failedDownloads.js b/gui/slick/js/failedDownloads.js index 7d7fe27349804729fb14055dc8133a9eab859f6f..62b2fea48d175a327bd3ce63adca11ccb7406195 100644 --- a/gui/slick/js/failedDownloads.js +++ b/gui/slick/js/failedDownloads.js @@ -1,5 +1,5 @@ $(document).ready(function(){ - $('#submitMassRemove').click(function(){ + $('#submitMassRemove').on('click', function(){ var removeArr = []; $('.removeCheck').each(function() { @@ -10,11 +10,11 @@ $(document).ready(function(){ if (removeArr.length === 0) return false; - url = sbRoot + '/manage/failedDownloads?toRemove='+removeArr.join('|'); + url = srRoot + '/manage/failedDownloads?toRemove='+removeArr.join('|'); window.location.href = url; }); - $('.bulkCheck').click(function(){ + $('.bulkCheck').on('click', function(){ var bulkCheck = this; var whichBulkCheck = $(bulkCheck).attr('id'); diff --git a/gui/slick/js/fuzzyMoment.js b/gui/slick/js/fuzzyMoment.js deleted file mode 100644 index 60c83bb825bcc7c9e2eaffa2ed399d6d995d6b81..0000000000000000000000000000000000000000 --- a/gui/slick/js/fuzzyMoment.js +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Fuzzy Moment - convert an absolute date text into a fuzzy moment - * - * containerClass string The class name of dom element to convert (default: 'fuzzydate') - * dateHasTime boolean Whether containerClass contains a time (default: false) - * dateFormat string The python token date formatting - * timeFormat string The python token time formatting - * trimZero Whether to trim leading "0"s (default : false) - * dtGlue string To insert between the output of date and time (default: '<br />') - * dtInline Bool Whether to output date inline or use more than one line - */ - function fuzzyMoment(fmConfig) { - - var containerClass = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.containerClass)) ? '.fuzzydate' : fmConfig.containerClass), - dateWithTime = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.dateHasTime)) ? false : !!fmConfig.dateHasTime), - dateFormat = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.dateFormat)) ? '' : fmConfig.dateFormat), - timeFormat = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.timeFormat)) ? '' : fmConfig.timeFormat), - trimZero = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.trimZero)) ? false : !!fmConfig.trimZero), - dtGlue = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.dtGlue)) ? '<br />' : fmConfig.dtGlue), - dtInline = (/undefined/i.test(typeof(fmConfig)) || /undefined/i.test(typeof(fmConfig.dtInline)) ? false : fmConfig.dtInline), - - jd = (function (str) { - var token_map = ['a', 'ddd', 'A', 'dddd', 'b', 'MMM', 'B', 'MMMM', 'd', 'DD', 'm', 'MM', 'y', 'YY', 'Y', 'YYYY', 'x', 'L', - 'H', 'HH', 'I', 'hh', 'M', 'mm', 'S', 'ss', 'p', 'A'], - result = ''; - - for (var i = 0; i < str.length; i++) - if (/[aAbBdmyYxHIMSp]/.test(str[i])) { - for (var t = 0; t < token_map.length; t = t + 2) - if (str[i] == token_map[t]) { - result += token_map[t + 1]; - break; - } - } else if ('%' != str[i]) - result += str[i]; - - return result; - }), - dateToken = jd(dateFormat), - timeToken = jd(timeFormat), - - 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-rounded qtip-dark qtip-shadow ui-tooltip-sb' - } - }); - }); - - if (trimZero) { - timeToken = timeToken.replace(/hh/g, 'h'); - timeToken = timeToken.replace(/HH/g, 'H'); - dateToken = dateToken.replace(/\bDD\b/g, 'D'); - } - - $(containerClass).each(function() { - var input = $(this).text(), - dateA = '[<span class="fd">', - dtSeparator = ' ', - timeA = '</span>]', timeB = '[' + timeA; - - if (dateWithTime) { - var timeMeta = input.match(/^.{6,}?([,\s]+)(\d{1,2}).(?:\d{2,2})(?:.(\d{2,2}))?(?:\s([ap]m))?$/im); - if (null != timeMeta) { - dtSeparator = (! /undefined/i.test(typeof(timeMeta[1])) ? timeMeta[1] : dtSeparator); - // adjust timeToken to num digits of input hours - timeToken = (! /undefined/i.test(typeof(timeMeta[2])) && 1 == timeMeta[2].length ? timeToken.replace(/hh/ig, 'h') : timeToken); - // adjust timeToken to use seconds if input has them - timeToken = (! /undefined/i.test(typeof(timeMeta[3])) && 2 == timeMeta[3].length ? timeToken : timeToken.replace(/.ss/, '')); - // adjust timeToken to am/pm or AM/PM if input has it - timeToken = (! /undefined/i.test(typeof(timeMeta[4])) && 2 == timeMeta[4].length ? timeToken.replace(/A$/, (/[ap]m/.test(timeMeta[4]) ? 'a' : 'A')) : timeToken); - } - timeA = '</span>' + dtGlue + '<span class="ft">]' + timeToken + '[' + timeA; - timeB = '[</span>' + dtGlue + '<span class="ft">]' + timeToken + timeB; - } - - var inputTokens = dateToken + dtSeparator + (dateWithTime ? timeToken : 'HH:mm:ss'); - - if (! moment(input + (dateWithTime ? '' : dtSeparator + '00:00:00'), inputTokens).isValid()) - return; - - moment.lang('en', { - calendar: { - lastDay:dateA + 'Yesterday' + timeA, sameDay:dateA + 'Today' + timeA, nextDay:dateA + 'Tomorrow' + timeA, - lastWeek:dateA + 'Last] ddd' + timeB, nextWeek:dateA + 'On] ddd' + timeB, - sameElse:dateA + ']ddd, MMM D YYYY[' + timeA - }, - relativeTime: { - future:'In %s', past:'%s ago', s:'seconds', m:'A minute', mm:'%d minutes', h:'An hour', hh:'%d hours', - d:'A day', dd:'%d days', M:'A month', MM:'%d months', y:'A year', yy:'%d years' - } - }); - - var airdatetime = moment(input + (dateWithTime ? '' : dtSeparator + '00:00:00'), inputTokens), - airdate = airdatetime.clone().hour(0).minute(0).second(0).millisecond(0), - today = moment({}), - day = Math.abs(airdate.diff(today, 'days')), - week = Math.abs(weekdiff = airdate.diff(today, 'week')), isPast = weekdiff < 0, - titleThis = false, qTipTime = false, - result = (0 == week ? airdatetime.calendar() : ''); - - if (/\bOn\b/i.test(result)) { - var fuzzer = false, weekday = today.day(); - if (3 == weekday) - fuzzer = (5 <= day); - else if (4 == weekday || 5 == weekday) - fuzzer = (4 <= day); - else - fuzzer = (6 == day); - if (fuzzer) - result = result.replace(/\bOn\b/i, 'Next'); - - } else if (! /\b((Yester|To)day\b|Tomo|Last\b)/i.test(result)) { - if (14 > day) - result = airdate.from(today) + (dateWithTime ? dtGlue + airdatetime.format(timeToken) : ''); - else if (4 > week) { - result = (isPast ? '' : 'In ') + (1 == week ? 'A' : week) + ' week' + (1 == week ? '' : 's') + (isPast ? ' ago' : ''); - qTipTime = true; - } else { - result = airdate.from(today); - qTipTime = true; - var month = airdate.diff(today, 'month'); - if (1 == parseInt(airdate.year() - today.year())) - result += (dtInline ? ' ' : '<br />') + '(Next Year)'; - } - titleThis = true; - } - result = day < 7 ? result.replace(/\bLast \b/i, '') : result; - - var n = false; // disable for prod - $(this).html(result); - if (dateWithTime && /(Yester|To)day/i.test(result)) - $(this).find('.fd').attr('title',(n?'1) ':'') + moment.duration(airdatetime.diff(moment(),'seconds'),'seconds').humanize(true)).each(addQTip); - else if (dateWithTime) - $(this).find('.fd').attr('title',(n?'2) ':'') + airdate.from(today)).each(addQTip); - else if (! /Today/i.test(result)) - $(this).find('.fd').attr('title',(n?'3) ':'') + airdate.from(today)).each(addQTip); - else - titleThis = false; - - if (titleThis) - if (dateWithTime && qTipTime) - $(this).attr('title',(n?'4) ':'') + airdatetime.format(inputTokens)).each(addQTip); - else - $(this).attr('title',(n?'5) ':'') + airdate.format(dateToken)).each(addQTip); - else - if (dateWithTime && qTipTime) - $(this).find('.ft').attr('title',(n?'6) ':'') + airdatetime.format(inputTokens)).each(addQTip); - else - $(this).find('.ft').attr('title',(n?'7) ':'') + airdate.format(dateToken)).each(addQTip); - }); -} diff --git a/gui/slick/js/lib/bootstrap3-typeahead.min.js b/gui/slick/js/lib/bootstrap3-typeahead.min.js new file mode 100644 index 0000000000000000000000000000000000000000..89959ab83d2f84143b287846dcf0c5c41d39200d Binary files /dev/null and b/gui/slick/js/lib/bootstrap3-typeahead.min.js differ diff --git a/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js b/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js index 4a6b4d10d1fc8e96ab14e2613c3a6313828e6abb..a914012a03db2ea885fff998706878bb4a4735ae 100644 --- a/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js +++ b/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js @@ -9,7 +9,7 @@ var scrolltotop={ //startline: Integer. Number of pixels from top of doc scrollbar is scrolled before showing control //scrollto: Keyword (Integer, or "Scroll_to_Element_ID"). How far to scroll document up when control is clicked on (0=top). setting: {startline:100, scrollto: 0, scrollduration:1000, fadeduration:[500, 100]}, - controlHTML: top_image_html,//set in inc_top.tmpl so it can be $sbRooted + controlHTML: top_image_html,//set in inc_top.tmpl so it can be $srRooted controlattrs: {offsetx:10, offsety:10}, //offset of control relative to right/ bottom of window corner anchorkeyword: '#top', //Enter href value of HTML anchors on the page that should also act as "Scroll Up" links diff --git a/gui/slick/js/lib/jquery.tokeninput.js b/gui/slick/js/lib/jquery.tokeninput.js index bf309d79fd17d3638703f596c3cdcceb25189213..5ef1b848253697db47349dbe156fee3a0a2952f5 100644 --- a/gui/slick/js/lib/jquery.tokeninput.js +++ b/gui/slick/js/lib/jquery.tokeninput.js @@ -43,8 +43,8 @@ var DEFAULT_SETTINGS = { idPrefix: "token-input-", // Formatters - resultsFormatter: function(item){ return "<li><img src='"+sbRoot+"/images/subtitles/flags/"+item["id"]+".png' /> " + item[this.propertyToSearch]+ "</li>" }, - tokenFormatter: function(item) { return "<li><img src='"+sbRoot+"/images/subtitles/flags/"+item["id"]+".png' /> <p>" + item[this.propertyToSearch] + "</p></li>" }, + resultsFormatter: function(item){ return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' /> " + item[this.propertyToSearch]+ "</li>" }, + tokenFormatter: function(item) { return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' /> <p>" + item[this.propertyToSearch] + "</p></li>" }, flag: "flag", // Callbacks diff --git a/gui/slick/js/manageEpisodeStatuses.js b/gui/slick/js/manageEpisodeStatuses.js index 61fad70d6c8dea4d2a2366c3ff62a7a1893d3e35..313087e304d70118e8fce0284910cea75c99af3d 100644 --- a/gui/slick/js/manageEpisodeStatuses.js +++ b/gui/slick/js/manageEpisodeStatuses.js @@ -28,31 +28,27 @@ $(document).ready(function() { var action = $(this).attr('value'); if (!clicked) { - $.getJSON(sbRoot+'/manage/showEpisodeStatuses', - { - indexer_id: cur_indexer_id, - whichStatus: $('#oldStatus').val() - }, - function (data) { - $.each(data, function(season,eps){ - $.each(eps, function(episode, name) { - //alert(season+'x'+episode+': '+name); - last_row.after(make_row(cur_indexer_id, season, episode, name, checked)); - }); - }); - }); + $.getJSON(srRoot+'/manage/showEpisodeStatuses',{ + indexer_id: cur_indexer_id, + whichStatus: $('#oldStatus').val() + }, function (data) { + $.each(data, function(season,eps){ + $.each(eps, function(episode, name) { + //alert(season+'x'+episode+': '+name); + last_row.after(make_row(cur_indexer_id, season, episode, name, checked)); + }); + }); + }); $(this).attr('data-clicked',1); $(this).prop('value', 'Collapse'); } else { if (action === 'Collapse') { $('table tr').filter('.show-'+cur_indexer_id).hide(); $(this).prop('value', 'Expand'); - } - else if (action === 'Expand') { + } else if (action === 'Expand') { $('table tr').filter('.show-'+cur_indexer_id).show(); $(this).prop('value', 'Collapse'); } - } }); diff --git a/gui/slick/js/manageSubtitleMissed.js b/gui/slick/js/manageSubtitleMissed.js index cc292030c15c51f15848cb8c361e45cc7ad897ca..a05ff4480d55b3c2d199b24ab3670a784b562cba 100644 --- a/gui/slick/js/manageSubtitleMissed.js +++ b/gui/slick/js/manageSubtitleMissed.js @@ -32,27 +32,24 @@ $(document).ready(function() { var action = $(this).attr('value'); if (!clicked) { - $.getJSON(sbRoot + '/manage/showSubtitleMissed', - { - indexer_id: cur_indexer_id, - whichSubs: $('#selectSubLang').val() - }, - function (data) { - $.each(data, function(season, eps) { - $.each(eps, function(episode, data) { - //alert(season+'x'+episode+': '+name); - last_row.after(make_row(cur_indexer_id, season, episode, data.name, data.subtitles, checked)); - }); - }); - }); + $.getJSON(srRoot + '/manage/showSubtitleMissed', { + indexer_id: cur_indexer_id, + whichSubs: $('#selectSubLang').val() + }, function(data) { + $.each(data, function(season, eps) { + $.each(eps, function(episode, data) { + //alert(season+'x'+episode+': '+name); + last_row.after(make_row(cur_indexer_id, season, episode, data.name, data.subtitles, checked)); + }); + }); + }); $(this).attr('data-clicked', 1); $(this).prop('value', 'Collapse'); } else { if (action === 'Collapse') { $('table tr').filter('.show-' + cur_indexer_id).hide(); $(this).prop('value', 'Expand'); - } - else if (action === 'Expand') { + } else if (action === 'Expand') { $('table tr').filter('.show-' + cur_indexer_id).show(); $(this).prop('value', 'Collapse'); } diff --git a/gui/slick/js/massEdit.js b/gui/slick/js/massEdit.js index 523149c642a90bb3f7d3a76155533c8ca040e268..116792887eaf4d95a1bce6655e8b532a143e0108 100644 --- a/gui/slick/js/massEdit.js +++ b/gui/slick/js/massEdit.js @@ -1,5 +1,4 @@ $(document).ready(function(){ - function find_dir_index(which){ var dir_parts = which.split('_'); return dir_parts[dir_parts.length-1]; @@ -19,14 +18,11 @@ $(document).ready(function(){ var cur_id = find_dir_index($(this).attr('id')); var initial_dir = $("#new_root_dir_"+cur_id).val(); $(this).nFileBrowser(edit_root_dir, {initialDir: initial_dir, which_id: cur_id}); - }); - - $('.delete_root_dir').click(function(){ - var cur_id = find_dir_index($(this).attr('id')); - - $('#new_root_dir_'+cur_id).val(null); - $('#display_new_root_dir_'+cur_id).html('<b>DELETED</b>'); - }); + $('.delete_root_dir').click(function(){ + var cur_id = find_dir_index($(this).attr('id')); + $('#new_root_dir_'+cur_id).val(null); + $('#display_new_root_dir_'+cur_id).html('<b>DELETED</b>'); + }); }); diff --git a/gui/slick/js/massUpdate.js b/gui/slick/js/massUpdate.js index 1a149f6e078f60cc0f0e781269d01ca952bd98a1..7ec531d6213ae7a7339e0ce322867c83c068ec35 100644 --- a/gui/slick/js/massUpdate.js +++ b/gui/slick/js/massUpdate.js @@ -1,18 +1,18 @@ $(document).ready(function(){ - $('#submitMassEdit').click(function(){ + $('#submitMassEdit').on('click', function(){ var editArr = []; $('.editCheck').each(function() { - if (this.checked === true) editArr.push($(this).attr('id').split('-')[1]); + if(this.checked === true) editArr.push($(this).attr('id').split('-')[1]); }); - if (editArr.length === 0) return; + if(editArr.length === 0) return; url = 'massEdit?toEdit='+editArr.join('|'); window.location.href = url; }); - $('#submitMassUpdate').click(function(){ + $('#submitMassUpdate').on('click', function(){ var updateArr = []; var refreshArr = []; @@ -23,52 +23,52 @@ $(document).ready(function(){ var metadataArr = []; $('.updateCheck').each(function() { - if (this.checked === true) updateArr.push($(this).attr('id').split('-')[1]); + if(this.checked === true) updateArr.push($(this).attr('id').split('-')[1]); }); $('.refreshCheck').each(function() { - if (this.checked === true) refreshArr.push($(this).attr('id').split('-')[1]); + if(this.checked === true) refreshArr.push($(this).attr('id').split('-')[1]); }); $('.renameCheck').each(function() { - if (this.checked === true) renameArr.push($(this).attr('id').split('-')[1]); + if(this.checked === true) renameArr.push($(this).attr('id').split('-')[1]); }); $('.subtitleCheck').each(function() { - if (this.checked === true) subtitleArr.push($(this).attr('id').split('-')[1]); + if(this.checked === true) subtitleArr.push($(this).attr('id').split('-')[1]); }); $('.removeCheck').each(function() { - if (this.checked === true) removeArr.push($(this).attr('id').split('-')[1]); + if(this.checked === true) removeArr.push($(this).attr('id').split('-')[1]); }); var deleteCount = 0; $('.deleteCheck').each(function() { - if (this.checked === true) deleteCount++; + if(this.checked === true) deleteCount++; }); - if (deleteCount >= 1) { + if(deleteCount >= 1) { bootbox.confirm("You have selected to delete " + deleteCount + " show(s). Are you sure you wish to cntinue? All files will be removed from your system.", function(result) { - if (result) { + if(result) { $('.deleteCheck').each(function() { - if (this.checked === true) { + if(this.checked === true) { deleteArr.push($(this).attr('id').split('-')[1]); } }); } - if (updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false; + if(updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false; url = 'massUpdate?toUpdate='+updateArr.join('|')+'&toRefresh='+refreshArr.join('|')+'&toRename='+renameArr.join('|')+'&toSubtitle='+subtitleArr.join('|')+'&toDelete='+deleteArr.join('|')+'&toRemove='+removeArr.join('|')+'&toMetadata='+metadataArr.join('|'); window.location.href = url; }); } else { - if (updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false; + if(updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false; url = 'massUpdate?toUpdate='+updateArr.join('|')+'&toRefresh='+refreshArr.join('|')+'&toRename='+renameArr.join('|')+'&toSubtitle='+subtitleArr.join('|')+'&toDelete='+deleteArr.join('|')+'&toRemove='+removeArr.join('|')+'&toMetadata='+metadataArr.join('|'); window.location.href = url; } /* $('.metadataCheck').each(function() { - if (this.checked == true) { + if(this.checked == true) { metadataArr.push($(this).attr('id').split('-')[1]) } }); @@ -76,19 +76,19 @@ $(document).ready(function(){ }); - $('.bulkCheck').click(function(){ + $('.bulkCheck').on('click', function(){ var bulkCheck = this; var whichBulkCheck = $(bulkCheck).attr('id'); $('.'+whichBulkCheck).each(function(){ - if (!this.disabled) this.checked = !this.checked; + if(!this.disabled) this.checked = !this.checked; }); }); ['.editCheck', '.updateCheck', '.refreshCheck', '.renameCheck', '.deleteCheck', '.removeCheck'].forEach(function(name) { var lastCheck = null; - $(name).click(function(event) { + $(name).on('click', function(event) { if(!lastCheck || !event.shiftKey) { lastCheck = this; return; @@ -101,9 +101,9 @@ $(document).ready(function(){ switch (found) { case 2: return false; case 1: - if (!this.disabled) this.checked = lastCheck.checked; + if(!this.disabled) this.checked = lastCheck.checked; } - if (this == check || this == lastCheck) found++; + if(this == check || this == lastCheck) found++; }); lastClick = this; }); diff --git a/gui/slick/js/new/comingEpisodes.js b/gui/slick/js/new/comingEpisodes.js index b739fd6f6b06727a6c2db454807931e29b5a4ed9..62ba8e4305099bcd10e10ceb66f02377134e524e 100644 --- a/gui/slick/js/new/comingEpisodes.js +++ b/gui/slick/js/new/comingEpisodes.js @@ -1,40 +1,3 @@ -if($('meta[data-var="sickbeard.COMING_EPS_LAYOUT"]').data('content') == 'list'){ - $.tablesorter.addParser({ - id: 'loadingNames', - is: function(s) { - return false; - }, - format: function(s) { - if (0 === s.indexOf('Loading...')){ - return s.replace('Loading...', '000'); - } else { - return ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'False' ? (s || '') : (s || '').replace(/^(The|A|An)\s/i,'')); - } - }, - 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 new Date(s).getTime(); - }, - type: 'numeric' - }); -} - $(document).ready(function(){ if($('meta[data-var="sickbeard.COMING_EPS_LAYOUT"]').data('content') == 'list'){ var sortCodes = {'date': 0, 'show': 1, 'network': 4}; @@ -49,7 +12,7 @@ $(document).ready(function(){ 5: function(node) { return $(node).find('span').text().toLowerCase(); } }, headers: { - 0: { sorter: 'cDate' }, + 0: { sorter: 'realISODate' }, 1: { sorter: 'loadingNames' }, 2: { sorter: false }, 3: { sorter: false }, @@ -61,10 +24,10 @@ $(document).ready(function(){ } }); - $('#sbRoot').ajaxEpSearch(); + $('#srRoot').ajaxEpSearch(); } if($('meta[data-var="sickbeard.COMING_EPS_LAYOUT"]').data('content') == 'banner' || $('meta[data-var="sickbeard.COMING_EPS_LAYOUT"]').data('content') == 'poster'){ - $('#sbRoot').ajaxEpSearch({'size': 16, 'loadingImage': 'loading16' + themeSpinner + '.gif'}); + $('#srRoot').ajaxEpSearch({'size': 16, 'loadingImage': 'loading16' + themeSpinner + '.gif'}); $('.ep_summary').hide(); $('.ep_summaryTrigger').click(function() { $(this).next('.ep_summary').slideToggle('normal', function() { diff --git a/gui/slick/js/new/config_postProcessing.js b/gui/slick/js/new/config_postProcessing.js new file mode 100644 index 0000000000000000000000000000000000000000..b09818bbde162ac33d4ccf2226e67b51f05a3a58 --- /dev/null +++ b/gui/slick/js/new/config_postProcessing.js @@ -0,0 +1,2 @@ +$('#config-components').tabs(); +$('#tv_download_dir').fileBrowser({ title: 'Select TV Download Directory' }); diff --git a/gui/slick/js/new/config_search.js b/gui/slick/js/new/config_search.js new file mode 100644 index 0000000000000000000000000000000000000000..a2ee476715d1ac3a2c2a6e7ea07be5c3cad6e630 --- /dev/null +++ b/gui/slick/js/new/config_search.js @@ -0,0 +1,5 @@ +$('#config-components').tabs(); +$('#nzb_dir').fileBrowser({ title: 'Select .nzb black hole/watch location' }); +$('#torrent_dir').fileBrowser({ title: 'Select .torrent black hole/watch location' }); +$('#torrent_path').fileBrowser({ title: 'Select .torrent download location' }); +$('#tv_download_dir').fileBrowser({ title: 'Select TV download location' }); diff --git a/gui/slick/js/new/config_subtitles.js b/gui/slick/js/new/config_subtitles.js new file mode 100644 index 0000000000000000000000000000000000000000..f970bf657070a5fcf85c6c918b205ed1c07fbca4 --- /dev/null +++ b/gui/slick/js/new/config_subtitles.js @@ -0,0 +1,10 @@ +$(document).ready(function() { + $("#subtitles_languages").tokenInput([$('meta[data-var="subtitles.subtitleLanguageFilter"]').data('content')], { + method: "POST", + hintText: "Write to search a language and select it", + preventDuplicates: true, + prePopulate: [$('meta[data-var="prePopulate"]').data('content')] + }); +}); +$('#config-components').tabs(); +$('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' }); diff --git a/gui/slick/js/new/displayShow.js b/gui/slick/js/new/displayShow.js new file mode 100644 index 0000000000000000000000000000000000000000..17344f7c692cf79bd3389eec25f05b4f0e090d11 --- /dev/null +++ b/gui/slick/js/new/displayShow.js @@ -0,0 +1,35 @@ +$(document).ready(function(){ + $('.addQTip').each(function () { + $(this).css({'cursor':'help', 'text-shadow':'0px 0px 0.5px #666'}); + $(this).qtip({ + show: {solo:true}, + position: {viewport:$(window), my:'left center', adjust:{ y: -10, x: 2 }}, + style: {tip:{corner:true, method:'polygon'}, classes:'qtip-rounded qtip-shadow ui-tooltip-sb'} + }); + }); + $.fn.generateStars = function() { + return this.each(function(i,e){$(e).html($('<span/>').width($(e).text()*12));}); + }; + + $('.imdbstars').generateStars(); + + $("#showTable, #animeTable").tablesorter({ + widgets: ['saveSort', 'stickyHeaders', 'columnSelector'], + widgetOptions : { + columnSelector_saveColumns: true, + columnSelector_layout : '<br/><label><input type="checkbox">{name}</label>', + columnSelector_mediaquery: false, + columnSelector_cssChecked : 'checked' + }, + }); + + $('#popover').popover({ + placement: 'bottom', + html: true, // required if content has HTML + content: '<div id="popover-target"></div>' + }) + // bootstrap popover event triggered when the popover opens + .on('shown.bs.popover', function () { + $.tablesorter.columnSelector.attachTo( $("#showTable, #animeTable"), '#popover-target'); + }); +}); diff --git a/gui/slick/js/new/errorlogs.js b/gui/slick/js/new/errorlogs.js new file mode 100644 index 0000000000000000000000000000000000000000..377fe7ae9063b4aba963505c174721256284b057 --- /dev/null +++ b/gui/slick/js/new/errorlogs.js @@ -0,0 +1,4 @@ +setTimeout(function () { + "use strict"; + location.reload(true); +}, 60000); diff --git a/gui/slick/js/new/history.js b/gui/slick/js/new/history.js index d1fda4e62418a0715859b5f54162a9a73765bfc0..6897dc21ac9ae9187f86569e9ff4f65fb9c92ed4 100644 --- a/gui/slick/js/new/history.js +++ b/gui/slick/js/new/history.js @@ -1,14 +1,3 @@ -$.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'], @@ -16,61 +5,36 @@ $(document).ready(function(){ textExtraction: (function(){ if($('meta[data-var="layout"]').data('content') == 'detailed'){ return { - 0: function(node) { return $(node).find("span").text().toLowerCase(); }, + 0: function(node) { return $(node).find('time').attr('datetime'); }, 4: function(node) { return $(node).find("span").text().toLowerCase(); } }; } else { return { - 0: function(node) { return $(node).find("span").text().toLowerCase(); }, + 0: function(node) { return $(node).find('time').attr('datetime'); }, 1: function(node) { return $(node).find("span").text().toLowerCase(); }, 2: function(node) { return $(node).attr("provider").toLowerCase(); }, 5: function(node) { return $(node).attr("quality").toLowerCase(); } }; } - }), + }()), headers: (function(){ if($('meta[data-var="layout"]').data('content') == 'detailed'){ return { - 0: { sorter: 'cDate' }, + 0: { sorter: 'realISODate' }, 4: { sorter: 'quality' } }; } else { return { - 0: { sorter: 'cDate' }, + 0: { sorter: 'realISODate' }, 4: { sorter: false }, 5: { sorter: 'quality' } }; } - }) + }()) }); $('#history_limit').on('change', function() { - var url = sbRoot + '/history/?limit=' + $(this).val(); + var url = srRoot + '/history/?limit=' + $(this).val(); window.location.href = url; }); - - if(['True', 1].indexOf($('meta[data-var="sickbeard.FUZZY_DATING"]').data('content')) >= 0){ - $.timeago.settings.allowFuture = true; - $.timeago.settings.strings = { - prefixAgo: null, - prefixFromNow: 'In ', - suffixAgo: "ago", - suffixFromNow: "", - seconds: "less than a minute", - minute: "about a minute", - minutes: "%d minutes", - hour: "about an hour", - hours: "about %d hours", - day: "a day", - days: "%d days", - month: "about a month", - months: "%d months", - year: "about a year", - years: "%d years", - wordSeparator: " ", - numbers: [] - }; - $("[datetime]").timeago(); - } - }); diff --git a/gui/slick/js/new/home.js b/gui/slick/js/new/home.js index 30ece0195542a13156644d703c2615992f33a54a..c2f342c60dc4715122de4435129c16eb926873ba 100644 --- a/gui/slick/js/new/home.js +++ b/gui/slick/js/new/home.js @@ -190,30 +190,6 @@ $(document).ready(function(){ } } - if(['True', 1].indexOf($('meta[data-var="sickbeard.FUZZY_DATING"]').data('content')) >= 0){ - $.timeago.settings.allowFuture = true; - $.timeago.settings.strings = { - prefixAgo: null, - prefixFromNow: 'In ', - suffixAgo: "ago", - suffixFromNow: "", - seconds: "less than a minute", - minute: "about a minute", - minutes: "%d minutes", - hour: "about an hour", - hours: "about %d hours", - day: "a day", - days: "%d days", - month: "about a month", - months: "%d months", - year: "about a year", - years: "%d years", - wordSeparator: " ", - numbers: [] - }; - $("[datetime]").timeago(); - } - var $container = [$('#container'), $('#container-anime')]; $.each($container, function (j) { diff --git a/gui/slick/js/new/home_addExistingShow.js b/gui/slick/js/new/home_addExistingShow.js new file mode 100644 index 0000000000000000000000000000000000000000..744d4877dd8dafc6140a16da7552779e1ca3982f --- /dev/null +++ b/gui/slick/js/new/home_addExistingShow.js @@ -0,0 +1,6 @@ +$(document).ready(function(){ + $( "#tabs" ).tabs({ + collapsible: true, + selected: ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'True' ? -1 : 0) + }); +}); diff --git a/gui/slick/js/new/home_postprocess.js b/gui/slick/js/new/home_postprocess.js new file mode 100644 index 0000000000000000000000000000000000000000..1449181d942143c4692485c5e009fc37d57a2b28 --- /dev/null +++ b/gui/slick/js/new/home_postprocess.js @@ -0,0 +1 @@ +$('#episodeDir').fileBrowser({ title: 'Select Unprocessed Episode Folder', key: 'postprocessPath' }); diff --git a/gui/slick/js/new/home_recommendedShows.js b/gui/slick/js/new/home_recommendedShows.js new file mode 100644 index 0000000000000000000000000000000000000000..4e292d5854ff0918dc4a1f38c0bec27afa41dc1b --- /dev/null +++ b/gui/slick/js/new/home_recommendedShows.js @@ -0,0 +1,62 @@ +$(document).ready(function(){ + $( "#tabs" ).tabs({ + collapsible: true, + selected: ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'True' ? -1 : 0) + }); + + // initialise combos for dirty page refreshes + $('#showsort').val('original'); + $('#showsortdirection').val('asc'); + + var $container = [$('#container')]; + $.each($container, function (j) { + this.isotope({ + itemSelector: '.trakt_show', + sortBy: 'original-order', + layoutMode: 'fitRows', + getSortData: { + name: function( itemElem ) { + var name = $( itemElem ).attr('data-name'); + return ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'True' ? (name || '') : (name || '').replace(/^(The|A|An)\s/i,'')); + }, + rating: '[data-rating] parseInt', + votes: '[data-votes] parseInt', + } + }); + }); + + $('#showsort').on( 'change', function() { + var sortCriteria; + switch (this.value) { + case 'original': + sortCriteria = 'original-order'; + break; + case 'rating': + /* randomise, else the rating_votes can already + * have sorted leaving this with nothing to do. + */ + $('#container').isotope({sortBy: 'random'}); + sortCriteria = 'rating'; + break; + case 'rating_votes': + sortCriteria = ['rating', 'votes']; + break; + case 'votes': + sortCriteria = 'votes'; + break; + default: + sortCriteria = 'name'; + break; + } + $('#container').isotope({sortBy: sortCriteria}); + }); + + $('#showsortdirection').on( 'change', function() { + $('#container').isotope({sortAscending: ('asc' == this.value)}); + }); +}); + +setTimeout(function () { + "use strict"; + location.reload(true); +}, 60000); diff --git a/gui/slick/js/new/manage_backlogOverview.js b/gui/slick/js/new/manage_backlogOverview.js new file mode 100644 index 0000000000000000000000000000000000000000..d61b28a48d8b8fe2ce6c9996a5c937c6b44a0f3a --- /dev/null +++ b/gui/slick/js/new/manage_backlogOverview.js @@ -0,0 +1,8 @@ +$(document).ready(function(){ + $('#pickShow').change(function(){ + var id = $(this).val(); + if (id) { + $('html,body').animate({scrollTop: $('#show-' + id).offset().top -25},'slow'); + } + }); +}); diff --git a/gui/slick/js/new/manage_failedDownloads.js b/gui/slick/js/new/manage_failedDownloads.js new file mode 100644 index 0000000000000000000000000000000000000000..9186bac811cd71d3f6f9d2f8c803093c9198671d --- /dev/null +++ b/gui/slick/js/new/manage_failedDownloads.js @@ -0,0 +1,11 @@ +$(document).ready(function(){ + $("#failedTable:has(tbody tr)").tablesorter({ + widgets: ['zebra'], + sortList: [[0,0]], + headers: { 3: { sorter: false } } + }); + $('#limit').change(function(){ + url = srRoot + '/manage/failedDownloads/?limit='+$(this).val(); + window.location.href = url; + }); +}); diff --git a/gui/slick/js/new/manage_massEdit.js b/gui/slick/js/new/manage_massEdit.js new file mode 100644 index 0000000000000000000000000000000000000000..c5406abafaec22c07b604edfe2f726ebcf6525c8 --- /dev/null +++ b/gui/slick/js/new/manage_massEdit.js @@ -0,0 +1 @@ +$('#location').fileBrowser({ title: 'Select Show Location' }); diff --git a/gui/slick/js/new/parsers.js b/gui/slick/js/new/parsers.js new file mode 100644 index 0000000000000000000000000000000000000000..a4d0bba30e2b6a423acfc793e6b483d8ecbbc784 --- /dev/null +++ b/gui/slick/js/new/parsers.js @@ -0,0 +1,45 @@ +$.tablesorter.addParser({ + id: 'loadingNames', + is: function(s) { + return false; + }, + format: function(s) { + if (0 === s.indexOf('Loading...')){ + return s.replace('Loading...', '000'); + } else { + return ($('meta[data-var="sickbeard.SORT_ARTICLE"]').data('content') == 'False' ? (s || '') : (s || '').replace(/^(The|A|An)\s/i,'')); + } + }, + 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: 'realISODate', + is: function(s) { + return false; + }, + format: function(s) { + return new Date(s).getTime(); + }, + type: 'numeric' +}); + +$.tablesorter.addParser({ + id: 'cDate', + is: function(s) { + return false; + }, + format: function(s) { + return s; + }, + type: 'numeric' +}); diff --git a/gui/slick/js/new/status.js b/gui/slick/js/new/status.js new file mode 100644 index 0000000000000000000000000000000000000000..3c3c461cd66050c43490bd4083a0db5ee59e5a8a --- /dev/null +++ b/gui/slick/js/new/status.js @@ -0,0 +1,9 @@ +$(document).ready(function() { + $("#schedulerStatusTable").tablesorter({ + widgets: ['saveSort', 'zebra'] + }); + $("#queueStatusTable").tablesorter({ + widgets: ['saveSort', 'zebra'], + sortList: [[3,0], [4,0], [2,1]] + }); +}); diff --git a/gui/slick/js/new/viewlogs.js b/gui/slick/js/new/viewlogs.js index 0f94159940bd158ecfad41bf4f2edb2950161994..dea989b1fe4b2ce25b6d0bd9f70f54c1421ee92b 100644 --- a/gui/slick/js/new/viewlogs.js +++ b/gui/slick/js/new/viewlogs.js @@ -8,7 +8,7 @@ $(document).ready(function(){ $('#minLevel').prop('disabled', true); $('#logFilter').prop('disabled', true); $('#logSearch').prop('disabled', true); - url = sbRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val(); + url = srRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val(); $.get(url, function(data){ history.pushState('data', '', url); $('pre').html($(data).find('pre').html()); @@ -38,7 +38,7 @@ $(document).ready(function(){ $('#minLevel option[value=20]').prop('selected', true); $('#minLevel').prop('disabled', false); $('#logFilter').prop('disabled', false); - url = sbRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val(); + url = srRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val(); $.get(url, function(data){ history.pushState('data', '', url); $('pre').html($(data).find('pre').html()); diff --git a/gui/slick/js/newShow.js b/gui/slick/js/newShow.js index 60d2576ac7f40558d76390f8d3b1abf3457f9910..c347253fb5164bc715aac310501c510bc0b0cbfe 100644 --- a/gui/slick/js/newShow.js +++ b/gui/slick/js/newShow.js @@ -8,10 +8,10 @@ $(document).ready(function () { if (searchRequestXhr) searchRequestXhr.abort(); var searchingFor = $('#nameToSearch').val().trim() + ' on ' + $('#providedIndexer option:selected').text() + ' in ' + $('#indexerLangSelect').val(); - $('#searchResults').empty().html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> searching ' + searchingFor + '...'); + $('#searchResults').empty().html('<img id="searchingAnim" src="' + srRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> searching ' + searchingFor + '...'); searchRequestXhr = $.ajax({ - url: sbRoot + '/home/addShows/searchIndexersForShowName', + url: srRoot + '/home/addShows/searchIndexersForShowName', data: {'search_term': $('#nameToSearch').val().trim(), 'lang': $('#indexerLangSelect').val(), 'indexer': $('#providedIndexer').val()}, timeout: parseInt($('#indexer_timeout').val(), 10) * 1000, dataType: 'json', @@ -166,7 +166,7 @@ $(document).ready(function () { // if we have a show name then sanitize and use it for the dir name if (show_name.length) { - $.get(sbRoot + '/home/addShows/sanitizeFileName', {name: show_name}, function (data) { + $.get(srRoot + '/home/addShows/sanitizeFileName', {name: show_name}, function (data) { $('#displayText').html(sample_text.replace('||', data)); }); // if not then it's unknown @@ -205,7 +205,7 @@ $(document).ready(function () { if ($('#anime').prop('checked')) { $('#blackwhitelist').show(); if (show_name) { - $.getJSON(sbRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) { + $.getJSON(srRoot + '/home/fetch_releasegroups', {'show_name': show_name}, function (data) { if (data.result == 'success') { $.each(data.groups, function(i, group) { var option = $("<option>"); diff --git a/gui/slick/js/plotTooltip.js b/gui/slick/js/plotTooltip.js index 6f7379220405b03d5630437831fe273672026a5f..a29e5f86919457eb1f28cb359196c6145bd1c869 100644 --- a/gui/slick/js/plotTooltip.js +++ b/gui/slick/js/plotTooltip.js @@ -5,7 +5,7 @@ $(function () { content: { text: 'Loading...', ajax: { - url: $("#sbRoot").val() + '/home/plotDetails', + url: $("#srRoot").val() + '/home/plotDetails', type: 'GET', data: { show: match[1], diff --git a/gui/slick/js/qualityChooser.js b/gui/slick/js/qualityChooser.js index 1fb8b4981e2a6aefef4a46489b797c952dd7453e..8cf90a5d32b6b49c97654756e47f5ebff65333df 100644 --- a/gui/slick/js/qualityChooser.js +++ b/gui/slick/js/qualityChooser.js @@ -1,6 +1,6 @@ $(document).ready(function() { function setFromPresets (preset) { - if (preset == 0) { + if (parseInt(preset) === 0) { $('#customQuality').show(); return; } else { diff --git a/gui/slick/js/recommendedShows.js b/gui/slick/js/recommendedShows.js index 649f00bad2c32ff0c7667417728473637bc7c5dc..81c60af84987c92521239f9532a96fdc23e7c817 100644 --- a/gui/slick/js/recommendedShows.js +++ b/gui/slick/js/recommendedShows.js @@ -4,9 +4,9 @@ $(document).ready(function() { function loadContent() { if (trendingRequestXhr) trendingRequestXhr.abort(); - $('#trendingShows').html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> Loading Recommended Shows...'); + $('#trendingShows').html('<img id="searchingAnim" src="' + srRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> Loading Recommended Shows...'); trendingRequestXhr = $.ajax({ - url: sbRoot + '/home/addShows/getRecommendedShows/', + url: srRoot + '/home/addShows/getRecommendedShows/', timeout: 60 * 1000, error: function () { $('#trendingShows').empty().html('Trakt timed out, refresh page to try again'); diff --git a/gui/slick/js/restart.js b/gui/slick/js/restart.js index 07f741bbdd10da629bcaac2780a81dbc7d8846dc..7e6fd4b7a528cebb424ff599dd5439dd85bb6134 100644 --- a/gui/slick/js/restart.js +++ b/gui/slick/js/restart.js @@ -3,7 +3,7 @@ $(document).ready(function() { window.console_prefix = 'Restart: '; window.current_pid = ''; - var is_alive_url = sbRoot + '/home/is_alive/'; + var is_alive_url = srRoot + '/home/is_alive/'; var check_isAlive = setInterval(is_alive, 1000); @@ -38,7 +38,7 @@ $(document).ready(function() { $('#restart_loading').hide(); $('#restart_success').show(); $('#refresh_message').show(); - setTimeout(function(){window.location = sbRoot + '/' + sbDefaultPage + '/';}, 5000); + setTimeout(function(){window.location = srRoot + '/' + sbDefaultPage + '/';}, 5000); } } diff --git a/gui/slick/js/rootDirs.js b/gui/slick/js/rootDirs.js index 286ba763eafe7c2ed59b578993a6b569c6f4f441..d9e0e52dfb5e1aae7123a497fbcddec9cf5c670e 100644 --- a/gui/slick/js/rootDirs.js +++ b/gui/slick/js/rootDirs.js @@ -41,7 +41,7 @@ $(document).ready(function() { setDefault($('#rootDirs option').attr('id')); refreshRootDirs(); - $.get(sbRoot+'/config/general/saveRootDirs', { rootDirString: $('#rootDirText').val() }); + $.get(srRoot+'/config/general/saveRootDirs', { rootDirString: $('#rootDirText').val() }); } function editRootDir(path) { @@ -61,7 +61,7 @@ $(document).ready(function() { } refreshRootDirs(); - $.get(sbRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()}); + $.get(srRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()}); } $('#addRootDir').click(function(){$(this).nFileBrowser(addRootDir);}); @@ -96,14 +96,14 @@ $(document).ready(function() { } refreshRootDirs(); - $.get(sbRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()}); + $.get(srRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()}); }); $('#defaultRootDir').click(function(){ if ($("#rootDirs option:selected").length) setDefault($("#rootDirs option:selected").attr('id')); refreshRootDirs(); - $.get(sbRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()}); + $.get(srRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()}); }); function setDefault(which, force){ diff --git a/gui/slick/js/sceneExceptionsTooltip.js b/gui/slick/js/sceneExceptionsTooltip.js index 20c04e88ff2737d47fe9324df94c0a3aedb3f208..2be78993531d180af40997ac31bed8ba14c4a27d 100644 --- a/gui/slick/js/sceneExceptionsTooltip.js +++ b/gui/slick/js/sceneExceptionsTooltip.js @@ -5,7 +5,7 @@ $(function () { content: { text: 'Loading...', ajax: { - url: $("#sbRoot").val() + '/home/sceneExceptions', + url: $("#srRoot").val() + '/home/sceneExceptions', type: 'GET', data: { show: match[1] diff --git a/gui/slick/js/script.js b/gui/slick/js/script.js index cb4e383fb647a8e86c79c740ae466c6cbb46f813..63ccea508dd32364b498f9792ad2b5334b34cb74 100644 --- a/gui/slick/js/script.js +++ b/gui/slick/js/script.js @@ -61,8 +61,8 @@ function resetFilters(text) { function initFancybox() { if ($("a[rel=dialog]").length > 0) { - $.getScript(sbRoot + '/js/fancybox/jquery.fancybox.pack.js', function () { - $("head").append("<link rel='stylesheet' href='" + sbRoot + "/js/fancybox/jquery.fancybox.css'>"); + $.getScript(srRoot + '/js/fancybox/jquery.fancybox.pack.js', function () { + $("head").append("<link rel='stylesheet' href='" + srRoot + "/js/fancybox/jquery.fancybox.css'>"); $("a[rel=dialog]").fancybox({ type: "image", padding: 0, @@ -131,4 +131,30 @@ function init() { $(document).ready(function () { init(); + $(document).ready(function() { + $('.dropdown-toggle').dropdownHover(); + if(['True', 1].indexOf($('meta[data-var="sickbeard.FUZZY_DATING"]').data('content')) >= 0){ + $.timeago.settings.allowFuture = true; + $.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: 'In ', + suffixAgo: "ago", + suffixFromNow: "", + seconds: "less than a minute", + minute: "about a minute", + minutes: "%d minutes", + hour: "about an hour", + hours: "about %d hours", + day: "a day", + days: "%d days", + month: "about a month", + months: "%d months", + year: "about a year", + years: "%d years", + wordSeparator: " ", + numbers: [] + }; + $("[datetime]").timeago(); + } + }); }); diff --git a/gui/slick/js/testRename.js b/gui/slick/js/testRename.js index f59879991c7feb98db87befc2897c59058795ed5..b0972122ab2171de2a82d2138a5e4b5006e78745 100644 --- a/gui/slick/js/testRename.js +++ b/gui/slick/js/testRename.js @@ -35,7 +35,7 @@ $(document).ready(function(){ if (epArr.length === 0) return false; - url = sbRoot+'/home/doRename?show='+$('#showID').attr('value')+'&eps='+epArr.join('|'); + url = srRoot+'/home/doRename?show='+$('#showID').attr('value')+'&eps='+epArr.join('|'); window.location.href = url; }); diff --git a/gui/slick/views/apiBuilder.mako b/gui/slick/views/apiBuilder.mako index 7a42cf0bee1d00515eab718e69402c49891fffa8..9e5a6bdf7203805fce643c889fe4bd7ff211894e 100644 --- a/gui/slick/views/apiBuilder.mako +++ b/gui/slick/views/apiBuilder.mako @@ -1,401 +1,263 @@ -<!DOCTYPE HTML> +<%! + import sickbeard +%> +<!DOCTYPE html> <html> - <head> - <meta charset="utf-8"> - <title>SickRage - API Builder</title> - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> - <meta name="viewport" content="width=device-width"> - <meta name="robots" content="noindex"> - - <script type="text/javascript" charset="utf-8"> - sbRoot = '${sbRoot}'; - </script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/apibuilder.js?${sbPID}"></script> +<head> + <meta charset="utf-8"> + <meta name="robots" content="noindex, nofollow"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width"> + + <!-- These values come from css/dark.css and css/light.css --> + % if sbThemeName == "dark": + <meta name="theme-color" content="#15528F"> + % elif sbThemeName == "light": + <meta name="theme-color" content="#333333"> + % endif + + <title>SickRage - BRANCH:[${sickbeard.BRANCH}] - ${title}</title> + + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + <meta name="msapplication-TileColor" content="#FFFFFF"> + <meta name="msapplication-TileImage" content="${srRoot}/images/ico/favicon-144.png"> + <meta name="msapplication-config" content="${srRoot}/css/browserconfig.xml"> + + <link rel="shortcut icon" href="${srRoot}/images/ico/favicon.ico"> + <link rel="icon" sizes="16x16 32x32 64x64" href="${srRoot}/images/ico/favicon.ico"> + <link rel="icon" type="image/png" sizes="196x196" href="${srRoot}/images/ico/favicon-196.png"> + <link rel="icon" type="image/png" sizes="160x160" href="${srRoot}/images/ico/favicon-160.png"> + <link rel="icon" type="image/png" sizes="96x96" href="${srRoot}/images/ico/favicon-96.png"> + <link rel="icon" type="image/png" sizes="64x64" href="${srRoot}/images/ico/favicon-64.png"> + <link rel="icon" type="image/png" sizes="32x32" href="${srRoot}/images/ico/favicon-32.png"> + <link rel="icon" type="image/png" sizes="16x16" href="${srRoot}/images/ico/favicon-16.png"> + <link rel="apple-touch-icon" sizes="152x152" href="${srRoot}/images/ico/favicon-152.png"> + <link rel="apple-touch-icon" sizes="144x144" href="${srRoot}/images/ico/favicon-144.png"> + <link rel="apple-touch-icon" sizes="120x120" href="${srRoot}/images/ico/favicon-120.png"> + <link rel="apple-touch-icon" sizes="114x114" href="${srRoot}/images/ico/favicon-114.png"> + <link rel="apple-touch-icon" sizes="76x76" href="${srRoot}/images/ico/favicon-76.png"> + <link rel="apple-touch-icon" sizes="72x72" href="${srRoot}/images/ico/favicon-72.png"> + <link rel="apple-touch-icon" href="${srRoot}/images/ico/favicon-57.png"> + + <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/bootstrap.min.css?${sbPID}"/> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/browser.css?${sbPID}" /> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/jquery-ui-1.10.4.custom.min.css?${sbPID}" /> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/style.css?${sbPID}"/> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/${sbThemeName}.css?${sbPID}" /> +</head> +<body> +<nav class="navbar navbar-default navbar-fixed-top hidden-print" role="navigation"> + <div class="container-fluid"> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-collapsed"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="${srRoot}/apibuilder/" title="SickRage"> + <img alt="SickRage" src="${srRoot}/images/sickrage.png" style="height: 50px;" class="img-responsive pull-left" /> + <p class="navbar-text hidden-xs">${title}</p> + </a> + </div> + + <div class="collapse navbar-collapse" id="nav-collapsed"> + <div class="btn-group navbar-btn" data-toggle="buttons"> + <label class="btn btn-primary"> + <input autocomplete="off" id="option-profile" type="checkbox" /> Profile + </label> + <label class="btn btn-primary"> + <input autocomplete="off" id="option-jsonp" type="checkbox" /> JSONP + </label> + </div> - <style type="text/css"> - #apibuilder select { padding: 2px 2px 2px 6px; display: block; float: left; margin: auto 8px 4px auto; } - #apibuilder select option { padding: 1px 6px; line-height: 1.2em; } - #apibuilder .disabled { color: #ccc; } - #apibuilder .action { background-color: #efefef; } - </style> + <ul class="nav navbar-nav navbar-right"> + <li><a href="${srRoot}/home/">Back to SickRage</a></li> + <li class="hidden-xs"> + <a href="https://github.com/SiCKRAGETV/SickRage/wiki/Donations" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href); return false;"> + <img src="${srRoot}/images/donate.jpg" alt="[donate]" class="navbaricon" /> + </a> + </li> + </ul> + + <form class="navbar-form navbar-right"> + <div class="form-group"> + <input autocomplete="off" class="form-control" id="command-search" placeholder="Command name" type="search"/> + </div> + </form> + </div> + </div> +</nav> + +<div id="content"> + <div class="panel-group" id="commands_list"> + % for command in sorted(commands): + <% + command_id = command.replace('.', '-') + help = commands[command]((), {'help': 1}).run() + %> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="panel-title"> + <a data-toggle="collapse" data-parent="#commands_list" href="#command-${command_id}">${command}</a> + </h4> + </div> + <div class="panel-collapse collapse" id="command-${command_id}"> + <div class="panel-body"> + <blockquote>${help['message']}</blockquote> + + % if help['data']['optionalParameters'] or help['data']['requiredParameters']: + <h4>Parameters</h4> + + <table class="tablesorter"> + <thead> + <tr> + <th>Name</th> + <th>Required</th> + <th>Description</th> + <th>Type</th> + <th>Default value</th> + <th>Allowed values</th> + </tr> + </thead> + ${display_parameters_doc(help['data']['requiredParameters'], True)} + ${display_parameters_doc(help['data']['optionalParameters'], False)} + </table> + % endif + + <h4>Playground</h4> + + URL: <kbd id="command-${command_id}-base-url">/api/${apikey}/?cmd=${command}</kbd><br /> + + % if help['data']['requiredParameters']: + Required parameters: ${display_parameters_playground(help['data']['requiredParameters'], True, command_id)}<br /> + % endif + + % if help['data']['optionalParameters']: + Optional parameters: ${display_parameters_playground(help['data']['optionalParameters'], False, command_id)}<br /> + % endif + + <button class="btn btn-primary" data-action="api-call" data-command-name="${command_id}" data-base-url="command-${command_id}-base-url" data-target="#command-${command_id}-response" data-time="#command-${command_id}-time" data-url="#command-${command_id}-url">Call API</button><br /> + + <div class="result-wrapper hidden"> + <div class="clearfix"> + <span class="pull-left"> + Response: <strong id="command-${command_id}-time"></strong><br /> + URL: <kbd id="command-${command_id}-url"></kbd> + </span> + <span class="pull-right"> + <button class="btn btn-default" data-action="clear-result" data-target="#command-${command_id}-response">Clear</button> + </span> + </div> + + <pre><code id="command-${command_id}-response"></code></pre> + </div> + </div> + </div> + </div> + % endfor + </div> +</div> <script type="text/javascript"> -var hide_empty_list=true; -var disable_empty_list=true; - -addListGroup("api", "Command"); - -addOption("Command", "SickRage", "?cmd=sb", 1); //make default -addList("Command", "SickRage.AddRootDir", "?cmd=sb.addrootdir", "sb.addrootdir", "", "", "action"); -addOption("Command", "SickRage.CheckScheduler", "?cmd=sb.checkscheduler", "", "", "action"); -addOption("Command", "SickRage.CheckVersion", "?cmd=sb.checkversion", "", "", "action"); -addList("Command", "SickRage.DeleteRootDir", "?cmd=sb.deleterootdir", "sb.deleterootdir", "", "", "action"); -addOption("Command", "SickRage.GetDefaults", "?cmd=sb.getdefaults", "", "", "action"); -addOption("Command", "SickRage.GetMessages", "?cmd=sb.getmessages", "", "", "action"); -addOption("Command", "SickRage.GetRootDirs", "?cmd=sb.getrootdirs", "", "", "action"); -addList("Command", "SickRage.PauseBacklog", "?cmd=sb.pausebacklog", "sb.pausebacklog", "", "", "action"); -addOption("Command", "SickRage.Ping", "?cmd=sb.ping", "", "", "action"); -addOption("Command", "SickRage.Restart", "?cmd=sb.restart", "", "", "action"); -addList("Command", "SickRage.SearchIndexers", "?cmd=sb.searchindexers", "sb.searchindexers", "", "", "action"); -addList("Command", "SickRage.SearchTVDb", "?cmd=sb.searchtvdb", "sb.searchindexers", "", "", "action"); -addList("Command", "SickRage.SearchTVRage", "?cmd=sb.searchtvrage", "sb.searchindexers", "", "", "action"); -addList("Command", "SickRage.SetDefaults", "?cmd=sb.setdefaults", "sb.setdefaults", "", "", "action"); -addOption("Command", "SickRage.Shutdown", "?cmd=sb.shutdown", "", "", "action"); -addOption("Command", "SickRage.Update", "?cmd=sb.update", "", "", "action"); -addOption("Command", "Backlog", "?cmd=backlog", "", "", "action"); -addList("Command", "Coming Episodes", "?cmd=future", "future"); -addList("Command", "Episode", "?cmd=episode", "episode"); -addList("Command", "Episode.Search", "?cmd=episode.search", "episode.search", "", "", "action"); -addList("Command", "Episode.SetStatus", "?cmd=episode.setstatus", "episode.setstatus", "", "", "action"); -addList("Command", "Episode.SubtitleSearch", "?cmd=episode.subtitlesearch", "episode.search", "", "", "action"); -addList("Command", "Scene Exceptions", "?cmd=exceptions", "exceptions"); -addOption("Command", "Failed", "?cmd=failed", "", "", "action"); -addList("Command", "History", "?cmd=history", "history"); -addOption("Command", "History.Clear", "?cmd=history.clear", "", "", "action"); -addOption("Command", "History.Trim", "?cmd=history.trim", "", "", "action"); -addList("Command", "Logs", "?cmd=logs", "logs"); -addList("Command", "Show", "?cmd=show", "indexerid"); -addList("Command", "Show.AddExisting", "?cmd=show.addexisting", "show.addexisting", "", "", "action"); -addList("Command", "Show.AddNew", "?cmd=show.addnew", "show.addnew", "", "", "action"); -addList("Command", "Show.Cache", "?cmd=show.cache", "indexerid", "", "", "action"); -addList("Command", "Show.Delete", "?cmd=show.delete", "show.delete", "", "", "action"); -addList("Command", "Show.GetBanner", "?cmd=show.getbanner", "indexerid", "", "", "action"); -addList("Command", "Show.GetFanArt", "?cmd=show.getfanart", "indexerid", "", "", "action"); -addList("Command", "Show.GetNetworkLogo", "?cmd=show.getnetworklogo", "indexerid", "", "", "action"); -addList("Command", "Show.GetPoster", "?cmd=show.getposter", "indexerid", "", "", "action"); -addList("Command", "Show.GetQuality", "?cmd=show.getquality", "indexerid", "", "", "action"); -addList("Command", "Show.Pause", "?cmd=show.pause", "show.pause", "", "", "action"); -addList("Command", "Show.Refresh", "?cmd=show.refresh", "indexerid", "", "", "action"); -addList("Command", "Show.SeasonList", "?cmd=show.seasonlist", "show.seasonlist", "", "", "action"); -addList("Command", "Show.Seasons", "?cmd=show.seasons", "seasons", "", "", "action"); -addList("Command", "Show.SetQuality", "?cmd=show.setquality", "show.setquality", "", "", "action"); -addList("Command", "Show.Stats", "?cmd=show.stats", "indexerid", "", "", "action"); -addList("Command", "Show.Update", "?cmd=show.update", "indexerid", "", "", "action"); -addList("Command", "Shows", "?cmd=shows", "shows"); -addOption("Command", "Shows.Stats", "?cmd=shows.stats", "", "", "action"); - -// addOption("indexerid", "Optional Param", "", 1); -% for curShow in sortedShowList: -addOption("indexerid", "${curShow.name}", "&indexerid=${curShow.indexerid}"); -% endfor - -addOption("logs", "Optional Param", "", 1); -addOption("logs", "Debug", "&min_level=debug"); -addOption("logs", "Info", "&min_level=info"); -addOption("logs", "Warning", "&min_level=warning"); -addOption("logs", "Error", "&min_level=error"); - -addOption("sb.setdefaults", "Optional Param", "", 1); -addList("sb.setdefaults", "Exclude Paused Shows on ComingEps", "&future_show_paused=0", "sb.setdefaults-status"); -addList("sb.setdefaults", "Include Paused Shows on ComingEps", "&future_show_paused=1", "sb.setdefaults-status"); - -addOption("sb.setdefaults-status", "Optional Param", "", 1); -addList("sb.setdefaults-status", "Wanted", "&status=wanted", "sb.setdefaults-opt"); -addList("sb.setdefaults-status", "Skipped", "&status=skipped", "sb.setdefaults-opt"); -addList("sb.setdefaults-status", "Archived", "&status=archived", "sb.setdefaults-opt"); -addList("sb.setdefaults-status", "Ignored", "&status=ignored", "sb.setdefaults-opt"); - -addOption("sb.setdefaults-opt", "Optional Param", "", 1); -addList("sb.setdefaults-opt", "Flatten (No Season Folder)", "&flatten_folders=1", "quality"); -addList("sb.setdefaults-opt", "Use Season Folder", "&flatten_folders=0", "quality"); - -addOption("shows", "Optional Param", "", 1); -addOption("shows", "Show Only Paused", "&paused=1"); -addOption("shows", "Show Only Not Paused", "&paused=0"); -addOption("shows", "Sort by Show Name", "&sort=name"); -addOption("shows", "Sort by INDEXER ID", "&sort=id"); - -addList("show.addexisting", "C:\\temp\\show1", "&location=C:\\temp\\show1", "show.addexisting-indexerid"); -addList("show.addexisting", "D:\\Temp\\show2", "&location=D:\\Temp\\show2", "show.addexisting-indexerid"); -addList("show.addexisting", "S:\\TV\\Ancient Aliens", "&location=S:\\TV\\Ancient Aliens", "show.addexisting-indexerid"); -addList("show.addexisting", "S:\\TV\\Chuck", "&location=S:\\TV\\Chuck", "show.addexisting-indexerid"); - -addList("show.addexisting-indexerid", "101501 (Ancient Aliens)", "&indexerid=101501", "show.addexisting-opt"); -addList("show.addexisting-indexerid", "80348 (Chuck)", "&indexerid=80348", "show.addexisting-opt"); - -addOption("show.addexisting-opt", "Optional Param", "", 1); -addList("show.addexisting-opt", "Flatten (No Season Folder)", "&flatten_folders=1", "quality"); -addList("show.addexisting-opt", "Use Season Folder", "&flatten_folders=0", "quality"); - -addList("show.addnew", "101501 (Ancient Aliens)", "&indexerid=101501", "show.addnew-loc"); -addList("show.addnew", "80348 (Chuck)", "&indexerid=80348", "show.addnew-loc"); - -addOption("show.addnew-loc", "Optional Param", "", 1); -addList("show.addnew-loc", "C:\\Temp", "&location=C:\\temp", "show.addnew-status"); -addList("show.addnew-loc", "D:\\Temp", "&location=D:\\Temp", "show.addnew-status"); -addList("show.addnew-loc", "S:\\TV", "&location=S:\\TV", "show.addnew-status"); -addList("show.addnew-loc", "/usr/bin", "&location=/usr/bin", "show.addnew-status"); - -addOption("show.addnew-status", "Optional Param", "", 1); -addList("show.addnew-status", "Wanted", "&status=wanted", "show.addnew-opt"); -addList("show.addnew-status", "Skipped", "&status=skipped", "show.addnew-opt"); -addList("show.addnew-status", "Archived", "&status=archived", "show.addnew-opt"); -addList("show.addnew-status", "Ignored", "&status=ignored", "show.addnew-opt"); - -addOption("show.addnew-opt", "Optional Param", "", 1); -addList("show.addnew-opt", "Flatten (No Season Folder)", "&flatten_folders=1", "quality"); -addList("show.addnew-opt", "Use Season Folder", "&flatten_folders=0", "quality"); - -addOptGroup("sb.searchindexers", "Search by Name"); -addList("sb.searchindexers", "Lost", "&name=Lost", "sb.searchindexers-lang"); -addList("sb.searchindexers", "office", "&name=office", "sb.searchindexers-lang"); -addList("sb.searchindexers", "OffiCE", "&name=OffiCE", "sb.searchindexers-lang"); -addList("sb.searchindexers", "Leno", "&name=leno", "sb.searchindexers-lang"); -addList("sb.searchindexers", "Top Gear", "&name=Top Gear", "sb.searchindexers-lang"); -endOptGroup("sb.searchindexers"); -addOptGroup("sb.searchindexers", "Search by indexerid"); -addList("sb.searchindexers", "73739", "&indexerid=73739", "sb.searchindexers-lang"); -addList("sb.searchindexers", "74608", "&indexerid=74608", "sb.searchindexers-lang"); -addList("sb.searchindexers", "199051", "&indexerid=199051", "sb.searchindexers-lang"); -addList("sb.searchindexers", "123456 (invalid show)", "&indexerid=123456", "sb.searchindexers-lang"); -endOptGroup("sb.searchindexers"); - -addOption("sb.searchindexers-lang", "Optional Param", "", 1); -addOption("sb.searchindexers-lang", "Chinese", "&lang=zh"); // 27 -addOption("sb.searchindexers-lang", "Croatian", "&lang=hr"); // 31 -addOption("sb.searchindexers-lang", "Czech", "&lang=cs"); // 28 -addOption("sb.searchindexers-lang", "Danish", "&lang=da"); // 10 -addOption("sb.searchindexers-lang", "Dutch", "&lang=nl"); // 13 -addOption("sb.searchindexers-lang", "English", "&lang=en"); // 7 -addOption("sb.searchindexers-lang", "Finnish", "&lang=fi"); // 11 -- Suomeksi -addOption("sb.searchindexers-lang", "French", "&lang=fr"); // 17 -addOption("sb.searchindexers-lang", "German", "&lang=de"); // 14 -addOption("sb.searchindexers-lang", "Greek", "&lang=el"); // 20 -addOption("sb.searchindexers-lang", "Hebrew", "&lang=he"); // 24 -addOption("sb.searchindexers-lang", "Hungarian", "&lang=hu"); // 19 -- Magyar -addOption("sb.searchindexers-lang", "Italian", "&lang=it"); // 15 -addOption("sb.searchindexers-lang", "Japanese", "&lang=ja"); // 25 -addOption("sb.searchindexers-lang", "Korean", "&lang=ko"); // 32 -addOption("sb.searchindexers-lang", "Norwegian", "&lang=no"); // 9 -addOption("sb.searchindexers-lang", "Polish", "&lang=pl"); // 18 -addOption("sb.searchindexers-lang", "Portuguese", "&lang=pt");// 26 -addOption("sb.searchindexers-lang", "Russian", "&lang=ru"); // 22 -addOption("sb.searchindexers-lang", "Slovenian", "&lang=sl"); // 30 -addOption("sb.searchindexers-lang", "Spanish", "&lang=es"); // 16 -addOption("sb.searchindexers-lang", "Swedish", "&lang=sv"); // 8 -addOption("sb.searchindexers-lang", "Turkish", "&lang=tr"); // 21 - -% for curShow in sortedShowList: -addList("seasons", "${curShow.name}", "&indexerid=${curShow.indexerid}", "seasons-${curShow.indexerid}"); -% endfor - -% for curShow in sortedShowList: -addList("show.seasonlist", "${curShow.name}", "&indexerid=${curShow.indexerid}", "show.seasonlist-sort"); -% endfor - -addOption("show.seasonlist-sort", "Optional Param", "", 1); -addOption("show.seasonlist-sort", "Sort by Ascending", "&sort=asc"); - -% for curShow in sortedShowList: -addList("show.setquality", "${curShow.name}", "&indexerid=${curShow.indexerid}", "quality"); -% endfor - -//build out generic quality options -addOptGroup("quality", "Quality Templates"); -addOption("quality", "SD", "&initial=sdtv|sddvd"); -addOption("quality", "HD", "&initial=hdtv|fullhdtv|hdwebdl|fullhdwebdl|hdbluray|fullhdbluray"); -addOption("quality", "HD720p", "&initial=hdtv|hdwebdl|hdbluray"); -addOption("quality", "HD1080p", "&initial=fullhdtv|fullhdwebdl|fullhdbluray"); -addOption("quality", "ANY", "&initial=sdtv|sddvd|hdtv|fullhdtv|hdwebdl|fullhdwebdl|hdbluray|fullhdbluray|unknown"); -endOptGroup("quality"); -addOptGroup("quality", "Inital (Custom)"); -addList("quality", "SD TV", "&initial=sdtv", "quality-archive"); -addList("quality", "SD DVD", "&initial=sddvd", "quality-archive"); -addList("quality", "HD TV", "&initial=hdtv", "quality-archive"); -addList("quality", "RawHD TV", "&initial=rawhdtv", "quality-archive"); -addList("quality", "1080p HD TV", "&initial=fullhdtv", "quality-archive"); -addList("quality", "720p Web-DL", "&initial=hdwebdl", "quality-archive"); -addList("quality", "1080p Web-DL", "&initial=fullhdwebdl", "quality-archive"); -addList("quality", "720p BluRay", "&initial=hdbluray", "quality-archive"); -addList("quality", "1080p BluRay", "&initial=fullhdbluray", "quality-archive"); -addList("quality", "Unknown", "&initial=unknown", "quality-archive"); -endOptGroup("quality"); -addOptGroup("quality", "Random (Custom)"); -addList("quality", "SD DVD/720p Web-DL", "&initial=sddvd|hdwebdl", "quality-archive"); -addList("quality", "SD TV/HD TV", "&initial=sdtv|hdtv", "quality-archive"); -endOptGroup("quality"); - -addOption("quality-archive", "Optional Param", "", 1); -addOptGroup("quality-archive", "Archive (Custom)"); -addList("quality-archive", "SD DVD", "&archive=sddvd"); -addList("quality-archive", "HD TV", "&archive=hdtv"); -addList("quality-archive", "RawHD TV", "&archive=rawhdtv"); -addList("quality-archive", "1080p HD TV", "&archive=fullhdtv"); -addList("quality-archive", "720p Web-DL", "&archive=hdwebdl"); -addList("quality-archive", "1080p Web-DL", "&archive=fullhdwebdl"); -addList("quality-archive", "720p BluRay", "&archive=hdbluray"); -addList("quality-archive", "1080p BluRay", "&archive=fullhdbluray"); -endOptGroup("quality-archive"); -addOptGroup("quality-archive", "Random (Custom)"); -addList("quality-archive", "HD TV/1080p BluRay", "&archive=hdtv|fullhdbluray"); -addList("quality-archive", "720p Web-DL/720p BluRay", "&archive=hdwebdl|hdbluray"); -endOptGroup("quality-archive"); - -// build out each show's season list for season cmd -% for curShow in seasonSQLResults: -addOption("seasons-${curShow}", "Optional Param", "", 1); - % for curShowSeason in seasonSQLResults[curShow]: -addOption("seasons-${curShow}", "${curShowSeason['season']}", "&season=${curShowSeason['season']}"); - % endfor -% endfor - -% for curShow in sortedShowList: -addList("episode", "${curShow.name}", "&indexerid=${curShow.indexerid}", "episode-${curShow.indexerid}"); -% endfor - -// build out each show's season+episode list for episode cmd -% for curShow in episodeSQLResults: - % for curShowSeason in episodeSQLResults[curShow]: -addList("episode-${curShow}", "${curShowSeason['season']} x ${curShowSeason['episode']}", "&season=${curShowSeason['season']}&episode=${curShowSeason['episode']}", "episode-${curShow}-full"); - % endfor -addOption("episode-${curShow}-full", "Optional Param", "", 1); -addOption("episode-${curShow}-full", "Show Full Path", "&full_path=1"); -% endfor - -// build out tvshow list for episode.search -% for curShow in sortedShowList: -addList("episode.search", "${curShow.name}", "&indexerid=${curShow.indexerid}", "episode.search-${curShow.indexerid}"); -% endfor - -// build out each show's season+episode list for episode.search cmd -% for curShow in episodeSQLResults: - % for curShowSeason in episodeSQLResults[curShow]: -addOption("episode.search-${curShow}", "${curShowSeason['season']} x ${curShowSeason['episode']}", "&season=${curShowSeason['season']}&episode=${curShowSeason['episode']}"); - % endfor -% endfor - -// build out tvshow list for episode.setstatus -% for curShow in sortedShowList: -addList("episode.setstatus", "${curShow.name}", "&indexerid=${curShow.indexerid}", "episode.setstatus-${curShow.indexerid}"); -% endfor - -// build out each show's season+episode list for episode.setstatus cmd -% for curShow in episodeSQLResults: - <% curSeason = -1 %> - % for curShowSeason in episodeSQLResults[curShow]: - % if curShowSeason['season'] != curSeason and curShowSeason['season'] != 0: - // insert just the season as the ep number is now optional - addList("episode.setstatus-${curShow}", "Season ${curShowSeason['season']}", "&season=${curShowSeason['season']}", "episode-status-${curShow}"); - % endif - <% curSeason = int(curShowSeason['season']) %> -addList("episode.setstatus-${curShow}", "${curShowSeason['season']} x ${curShowSeason['episode']}", "&season=${curShowSeason['season']}&episode=${curShowSeason['episode']}", "episode-status-${curShow}"); - % endfor -addList("episode-status-${curShow}", "Wanted", "&status=wanted", "force"); -addList("episode-status-${curShow}", "Skipped", "&status=skipped", "force"); -addList("episode-status-${curShow}", "Archived", "&status=archived", "force"); -addList("episode-status-${curShow}", "Ignored", "&status=ignored", "force"); -% endfor - -addOption("force", "Optional Param", "", 1); -addOption("force", "Replace Downloaded EP", "&force=1"); -addOption("force", "Skip Downloaded EP", "&force=0"); - -addOption("future", "Optional Param", "", 1); -addList("future", "Sort by Date", "&sort=date", "future-type"); -addList("future", "Sort by Network", "&sort=network", "future-type"); -addList("future", "Sort by Show Name", "&sort=show", "future-type"); - -addOption("future-type", "Optional Param", "", 1); -addList("future-type", "Show All Types", "&type=today|missed|soon|later", "future-paused"); -addList("future-type", "Show Today", "&type=today", "future-paused"); -addList("future-type", "Show Missed", "&type=missed", "future-paused"); -addList("future-type", "Show Soon", "&type=soon", "future-paused"); -addList("future-type", "Show Later", "&type=later", "future-paused"); -addList("future-type", "Show Today & Missed", "&type=today|missed", "future-paused"); - -addOption("future-paused", "Optional Param", "", 1); -addOption("future-paused", "Include Paused Shows", "&paused=1"); -addOption("future-paused", "Exclude Paused Shows", "&paused=0"); - -addOption("history", "Optional Param", "", 1); -addList("history", "Show Only Downloaded", "&type=downloaded", "history-type"); -addList("history", "Show Only Snatched", "&type=snatched", "history-type"); -//addOptGroup("history", "Limit Results"); -addList("history", "Limit Results (2)", "&limit=2", "history-limit"); -addList("history", "Limit Results (25)", "&limit=25", "history-limit"); -addList("history", "Limit Results (50)", "&limit=50", "history-limit"); -//endOptGroup("history"); - -addOption("history-type", "Optional Param", "", 1); -addOption("history-type", "Limit Results (2)", "&limit=2"); -addOption("history-type", "Limit Results (25)", "&limit=25"); -addOption("history-type", "Limit Results (50)", "&limit=50"); - -addOption("history-limit", "Optional Param", "", 1); -addOption("history-limit", "Show Only Downloaded", "&type=downloaded"); -addOption("history-limit", "Show Only Snatched", "&type=snatched"); - -addOption("exceptions", "Optional Param", "", 1); -% for curShow in sortedShowList: -addOption("exceptions", "${curShow.name}", "&indexerid=${curShow.indexerid}"); -% endfor - -addOption("sb.pausebacklog", "Optional Param", "", 1); -addOption("sb.pausebacklog", "Pause", "&pause=1"); -addOption("sb.pausebacklog", "Unpause", "&pause=0"); - -addList("sb.addrootdir", "C:\\Temp", "&location=C:\\Temp", "sb.addrootdir-opt"); -addList("sb.addrootdir", "/usr/bin", "&location=/usr/bin/", "sb.addrootdir-opt"); -addList("sb.addrootdir", "S:\\Invalid_Location", "&location=S:\\Invalid_Location", "sb.addrootdir-opt"); - -addOption("sb.addrootdir-opt", "Optional Param", "", 1); -addOption("sb.addrootdir-opt", "Default", "&default=1"); -addOption("sb.addrootdir-opt", "Not Default", "&default=0"); - -addOption("sb.deleterootdir", "C:\\Temp", "&location=C:\\Temp", "", 1); -addOption("sb.deleterootdir", "/usr/bin", "&location=/usr/bin/"); -addOption("sb.deleterootdir", "S:\\Invalid_Location", "&location=S:\\Invalid_Location"); - -% for curShow in sortedShowList: -addList("show.pause", "${curShow.name}", "&indexerid=${curShow.indexerid}", "show.pause-opt"); -% endfor -addOption("show.pause-opt", "Optional Param", "", 1); -addOption("show.pause-opt", "Unpause", "&pause=0"); -addOption("show.pause-opt", "Pause", "&pause=1"); - -% for curShow in sortedShowList: -addList("show.delete", "${curShow.name}", "&indexerid=${curShow.indexerid}", "show.delete-opt"); -% endfor -addOption("show.delete-opt", "Remove Files", "&removefiles=1"); -addOption("show.delete-opt", "Don't Remove Files", "&removefiles=0"); - +var commands = ${sorted(commands)}; +var episodes = ${episodes}; </script> -</head> - -<body onload="initListGroup('api', document.apibuilder.firstlevel, document.apibuilder.secondlevel, document.apibuilder.thirdlevel, document.apibuilder.forthlevel, document.apibuilder.fifthlevel, document.apibuilder.sixthlevel, document.apibuilder.seventhlevel)"> +<script type="text/javascript" src="${srRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/lib/bootstrap.min.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/lib/bootstrap3-typeahead.min.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/apibuilder.js?${sbPID}"></script> +</body> +</html> -<form name="apibuilder" id="apibuilder" action=""> -<table align="center"> +<%def name="display_parameters_doc(parameters, required)"> +<tbody> +% for parameter in parameters: + <% parameter_help = parameters[parameter] %> <tr> <td> - <input type="text" size="40" id="apikey" name="apikey" value="${apikey}"> - <input type="checkbox" id="debug" class="global"><label for="debug"> Debug?</label> - <input type="checkbox" id="profile" class="global"><label for="profile"> Profile?</label> - <input type="checkbox" id="jsonp" class="global"><label for="jsonp"> JSONP?</label> - <input type="checkbox" id="help" class="global"><label for="help"> Help?</label> + % if required: + <strong>${parameter}</strong> + % else: + ${parameter} + % endif </td> - </tr> - <tr> - <td> - <select name="firstlevel"><option></option></select> - <select name="secondlevel"><option></option></select> - <select name="thirdlevel"><option></option></select> - <select name="forthlevel"><option></option></select> - <select name="fifthlevel"><option></option></select> - <select name="sixthlevel"><option></option></select> - <select name="seventhlevel"><option></option></select> - <div style="float: left; "> - <input type="button" value="Reset" onclick="resetListGroup('api',1)" /> - <input type="button" value="Go" onclick="goListGroup(this.form['apikey'].value, this.form['seventhlevel'].value, this.form['sixthlevel'].value, this.form['fifthlevel'].value, this.form['forthlevel'].value, this.form['thirdlevel'].value, this.form['secondlevel'].value, this.form['firstlevel'].value)" /> - </div> + <td class="text-center"> + % if required: + <span class="glyphicon glyphicon-ok text-success" title="Yes"></span> + % else: + <span class="glyphicon glyphicon-remove text-muted" title="No"></span> + % endif </td> + <td>${parameter_help['desc'] if 'desc' in parameter_help else ''}</td> + <td>${parameter_help['type'] if 'type' in parameter_help else ''}</td> + <td>${parameter_help['defaultValue'] if 'defaultValue' in parameter_help else ''}</td> + <td>${parameter_help['allowedValues'] if 'allowedValues' in parameter_help else ''}</td> </tr> -</table> -</form> - -<div id="apiResponse"></div> - -</body> +% endfor +</tbody> +</%def> + +<%def name="display_parameters_playground(parameters, required, command)"> +<div class="form-inline"> + % for parameter in parameters: + <% + parameter_help = parameters[parameter] + allowed_values = parameter_help['allowedValues'] if 'allowedValues' in parameter_help else '' + type = parameter_help['type'] if 'type' in parameter_help else '' + %> + + % if isinstance(allowed_values, list): + <select class="form-control"${('', ' multiple="multiple"')[type == 'list']} name="${parameter}" data-command="${command}"> + <option>${parameter}</option> + + % if allowed_values == [0, 1]: + <option value="0">No</option> + <option value="1">Yes</option> + % else: + % for allowed_value in allowed_values: + <option value="${allowed_value}">${allowed_value}</option> + % endfor + % endif + </select> + % elif parameter == 'indexerid': + <select class="form-control" name="${parameter}" data-action="update-seasons" data-command="${command}"> + <option>${parameter}</option> + + % for show in shows: + <option value="${show.indexerid}">${show.name}</option> + % endfor + </select> + + % if 'season' in parameters: + <select class="form-control hidden" name="season" data-action="update-episodes" data-command="${command}"> + <option>season</option> + </select> + % endif -</html> + % if 'episode' in parameters: + <select class="form-control hidden" name="episode" data-command="${command}"> + <option>episode</option> + </select> + % endif + % elif parameter == 'tvdbid': + <select class="form-control" name="${parameter}" data-command="${command}"> + <option>${parameter}</option> + + % for show in shows: + <option value="${show.indexerid}">${show.name}</option> + % endfor + </select> + % elif type == 'int': + % if parameter not in ('episode', 'season'): + <input class="form-control" name="${parameter}" placeholder="${parameter}" type="number" data-command="${command}" /> + % endif + % elif type == 'string': + <input class="form-control" name="${parameter}" placeholder="${parameter}" type="text" data-command="${command}" /> + % endif +% endfor +</div> +</%def> diff --git a/gui/slick/views/comingEpisodes.mako b/gui/slick/views/comingEpisodes.mako index d462f4dba77eb0a5764c0d9cc9c62fc9f73bd446..75740dbbc377376e7e3717ccf2f9407177203ccf 100644 --- a/gui/slick/views/comingEpisodes.mako +++ b/gui/slick/views/comingEpisodes.mako @@ -12,9 +12,9 @@ <meta data-var="sickbeard.COMING_EPS_LAYOUT" data-content="${sickbeard.COMING_EPS_LAYOUT}"> </%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/ajaxEpSearch.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/new/comingEpisodes.js"></script> +<script type="text/javascript" src="${srRoot}/js/ajaxEpSearch.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/comingEpisodes.js"></script> </%block> <%block name="css"> <style type="text/css"> @@ -24,33 +24,32 @@ </%block> <%block name="content"> <% sort = sickbeard.COMING_EPS_SORT %> -<% fuzzydate = 'airdate' %> <%namespace file="/inc_defs.mako" import="renderQualityPill"/> <h1 class="header">${header}</h1> <div class="h2footer pull-right"> <span>Layout: <select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;"> - <option value="${sbRoot}/setComingEpsLayout/?layout=poster" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'poster']} >Poster</option> - <option value="${sbRoot}/setComingEpsLayout/?layout=calendar" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'calendar']} >Calendar</option> - <option value="${sbRoot}/setComingEpsLayout/?layout=banner" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'banner']} >Banner</option> - <option value="${sbRoot}/setComingEpsLayout/?layout=list" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'list']} >List</option> + <option value="${srRoot}/setComingEpsLayout/?layout=poster" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'poster']} >Poster</option> + <option value="${srRoot}/setComingEpsLayout/?layout=calendar" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'calendar']} >Calendar</option> + <option value="${srRoot}/setComingEpsLayout/?layout=banner" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'banner']} >Banner</option> + <option value="${srRoot}/setComingEpsLayout/?layout=list" ${('', 'selected="selected"')[sickbeard.COMING_EPS_LAYOUT == 'list']} >List</option> </select> </span> <span>Sort By: <select name="sort" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;"> - <option value="${sbRoot}/setComingEpsSort/?sort=date" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'date']} >Date</option> - <option value="${sbRoot}/setComingEpsSort/?sort=network" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'network']} >Network</option> - <option value="${sbRoot}/setComingEpsSort/?sort=show" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'show']} >Show</option> + <option value="${srRoot}/setComingEpsSort/?sort=date" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'date']} >Date</option> + <option value="${srRoot}/setComingEpsSort/?sort=network" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'network']} >Network</option> + <option value="${srRoot}/setComingEpsSort/?sort=show" ${('', 'selected="selected"')[sickbeard.COMING_EPS_SORT == 'show']} >Show</option> </select> </span> <span>View Paused: <select name="viewpaused" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;"> - <option value="${sbRoot}/toggleComingEpsDisplayPaused" ${('', 'selected="selected"')[not bool(sickbeard.COMING_EPS_DISPLAY_PAUSED)]}>Hidden</option> - <option value="${sbRoot}/toggleComingEpsDisplayPaused" ${('', 'selected="selected"')[bool(sickbeard.COMING_EPS_DISPLAY_PAUSED)]}>Shown</option> + <option value="${srRoot}/toggleComingEpsDisplayPaused" ${('', 'selected="selected"')[not bool(sickbeard.COMING_EPS_DISPLAY_PAUSED)]}>Hidden</option> + <option value="${srRoot}/toggleComingEpsDisplayPaused" ${('', 'selected="selected"')[bool(sickbeard.COMING_EPS_DISPLAY_PAUSED)]}>Shown</option> </select> </span> </div> @@ -73,7 +72,7 @@ <!-- start list view //--> <% show_div = 'listing-default' %> -<input type="hidden" id="sbRoot" value="${sbRoot}" /> +<input type="hidden" id="srRoot" value="${srRoot}" /> <table id="showListTable" class="sickbeardTable tablesorter seasonstyle" cellspacing="1" border="0" cellpadding="0"> @@ -116,17 +115,13 @@ %> <tr class="${show_div}"> - ## forced to use a div to wrap airdate, the column sort went crazy with a span <td align="center" nowrap="nowrap"> <% airDate = sbdatetime.sbdatetime.sbfdatetime(cur_result['localtime']).decode(sickbeard.SYS_ENCODING) %> <% isoDate = sbdatetime.sbdatetime.convert_to_setting(cur_result['localtime']).isoformat('T') %> - <span class="${fuzzydate}"> - <time datetime="${isoDate}" class="date">${airDate}</time> - </span> - <span class="sort_data">${time.mktime(cur_result['localtime'].timetuple())}</span> + <time datetime="${isoDate}" class="date">${airDate}</time> </td> - <td class="tvShow" nowrap="nowrap"><a href="${sbRoot}/home/displayShow?show=${cur_result['showid']}">${cur_result['show_name']}</a> + <td class="tvShow" nowrap="nowrap"><a href="${srRoot}/home/displayShow?show=${cur_result['showid']}">${cur_result['show_name']}</a> % if int(cur_result['paused']): <span class="pause">[paused]</span> % endif @@ -138,9 +133,9 @@ <td> % if cur_result['description']: - <img alt='' src='${sbRoot}/images/info32.png' height='16' width='16' class='plotInfo' id="plot_info_${'%s_%s_%s' % (str(cur_result['showid']), str(cur_result['season']), str(cur_result['episode']))}" /> + <img alt='' src='${srRoot}/images/info32.png' height='16' width='16' class='plotInfo' id="plot_info_${'%s_%s_%s' % (str(cur_result['showid']), str(cur_result['season']), str(cur_result['episode']))}" /> % else: - <img alt="" src="${sbRoot}/images/info32.png" width="16" height="16" class="plotInfoNone" /> + <img alt="" src="${srRoot}/images/info32.png" width="16" height="16" class="plotInfoNone" /> % endif ${cur_result['name']} </td> @@ -155,13 +150,13 @@ <td align="center" style="vertical-align: middle;"> % if 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="[imdb]" height="16" width="16" src="${sbRoot}/images/imdb.png" /> + <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="[imdb]" height="16" width="16" src="${srRoot}/images/imdb.png" /> % endif - <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> + <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="${srRoot}/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']}x${cur_result['season']}x${cur_result['episode']}" class="forceUpdate epSearch"><img alt="[search]" height="16" width="16" src="${sbRoot}/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a> + <a href="${srRoot}/home/searchEpisode?show=${cur_result['showid']}&season=${cur_result['season']}&episode=${cur_result['episode']}" title="Manual Search" id="forceUpdate-${cur_result['showid']}x${cur_result['season']}x${cur_result['episode']}" class="forceUpdate epSearch"><img alt="[search]" height="16" width="16" src="${srRoot}/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a> </td> </tr> % endfor @@ -290,7 +285,7 @@ <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <th ${('class="nobg"', 'rowspan="2"')[banner == layout]} valign="top"> - <a href="${sbRoot}/home/displayShow?show=${cur_result['showid']}"><img alt="" class="${('posterThumb', 'bannerThumb')[layout == 'banner']}" src="${sbRoot}/showPoster/?show=${cur_result['showid']}&which=${(layout, 'poster_thumb')[layout == 'poster']}" /></a> + <a href="${srRoot}/home/displayShow?show=${cur_result['showid']}"><img alt="" class="${('posterThumb', 'bannerThumb')[layout == 'banner']}" src="${srRoot}/showPoster/?show=${cur_result['showid']}&which=${(layout, 'poster_thumb')[layout == 'poster']}" /></a> </th> % if 'banner' == layout: </tr> @@ -299,7 +294,7 @@ <td class="next_episode"> <div class="clearfix"> <span class="tvshowTitle"> - <a href="${sbRoot}/home/displayShow?show=${cur_result['showid']}">${cur_result['show_name']} + <a href="${srRoot}/home/displayShow?show=${cur_result['showid']}">${cur_result['show_name']} % if int(cur_result['paused']): <span class="pause">[paused]</span> % endif @@ -307,10 +302,10 @@ <span class="tvshowTitleIcons"> % if 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="[imdb]" height="16" width="16" src="${sbRoot}/images/imdb.png" /> + <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="[imdb]" height="16" width="16" src="${srRoot}/images/imdb.png" /> % endif - <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']}"><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> + <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']}"><img alt="${sickbeard.indexerApi(cur_indexer).name}" height="16" width="16" src="${srRoot}/images/${sickbeard.indexerApi(cur_indexer).config['icon']}" /></a> + <span><a href="${srRoot}/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="${srRoot}/images/search16.png" id="forceUpdateImage-${cur_result['showid']}" /></a></span> </span> </div> @@ -318,7 +313,7 @@ <div class="clearfix"> - <span class="title">Airs: </span><span class="${fuzzydate}">${sbdatetime.sbdatetime.sbfdatetime(cur_result['localtime']).decode(sickbeard.SYS_ENCODING)}</span>${('', '<span> on %s</span>' % str(cur_result['network']))[bool(cur_result['network'])]} + <span class="title">Airs: </span><span class="airdate">${sbdatetime.sbdatetime.sbfdatetime(cur_result['localtime']).decode(sickbeard.SYS_ENCODING)}</span>${('', '<span> on %s</span>' % str(cur_result['network']))[bool(cur_result['network'])]} </div> <div class="clearfix"> @@ -332,10 +327,10 @@ <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> + <img class="ep_summaryTrigger" src="${srRoot}/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="" /> + <img class="ep_summaryTriggerNone" src="${srRoot}/images/plus.png" height="16" width="16" alt="" /> % endif </div> </td> @@ -358,7 +353,7 @@ <br> <br> <div class="calendarWrapper"> -<input type="hidden" id="sbRoot" value="${sbRoot}" /> +<input type="hidden" id="srRoot" value="${srRoot}" /> % for day in dates: <% tbl_day += 1 %> <table class="sickbeardTable tablesorter calendarTable ${'cal-%s' % (('even', 'odd')[bool(tbl_day % 2)])}" cellspacing="0" border="0" cellpadding="0"> @@ -388,7 +383,7 @@ <tr> <td class="calendarShow"> <div class="poster"> - <a title="${cur_result['show_name']}" href="${sbRoot}/home/displayShow?show=${cur_result['showid']}"><img alt="" src="${sbRoot}/showPoster/?show=${cur_result['showid']}&which=poster_thumb" /></a> + <a title="${cur_result['show_name']}" href="${srRoot}/home/displayShow?show=${cur_result['showid']}"><img alt="" src="${srRoot}/showPoster/?show=${cur_result['showid']}&which=poster_thumb" /></a> </div> <div class="text"> <span class="airtime"> diff --git a/gui/slick/views/config_anime.mako b/gui/slick/views/config_anime.mako index 2c2b0db61b11982e6836b72ccde2d98ce78a666f..172fd34b3ee6c14325eff3596cf38d8e58c7cb4c 100644 --- a/gui/slick/views/config_anime.mako +++ b/gui/slick/views/config_anime.mako @@ -5,8 +5,8 @@ %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/configAnime.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/configAnime.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> </%block> <%block name="content"> <div id="content960"> @@ -25,7 +25,7 @@ <div id="core-component-group1" class="tab-pane active component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/anidb24.png" alt="AniDB" title="AniDB" width="24" height="24" /> + <img class="notifier-icon" src="${srRoot}/images/anidb24.png" alt="AniDB" title="AniDB" width="24" height="24" /> <h3><a href="${anon_url('http://anidb.info')}" onclick="window.open(this.href, '_blank'); return false;">AniDB</a></h3> <p>AniDB is non-profit database of anime information that is freely open to the public</p> </div> diff --git a/gui/slick/views/config_backuprestore.mako b/gui/slick/views/config_backuprestore.mako index 1813c2d6af58fa510d452891c47f7a41ff379bea..3f7cffa618816a038f5ae67b93dff2a0c0dd97d6 100644 --- a/gui/slick/views/config_backuprestore.mako +++ b/gui/slick/views/config_backuprestore.mako @@ -11,8 +11,8 @@ from sickbeard.metadata.generic import GenericMetadata %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/configBackupRestore.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/new/config_backuprestore.js"></script> +<script type="text/javascript" src="${srRoot}/js/configBackupRestore.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/config_backuprestore.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: @@ -26,7 +26,7 @@ <% indexer = sickbeard.INDEXER_DEFAULT %> % endif -<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> <div id="config"> <div id="config-content"> diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako index 2ac46d862ca57dcc39f675d07220f5497674571a..22ae8d9ff2a4d14cc2ddeaa48054a02f7c43a4a0 100644 --- a/gui/slick/views/config_general.mako +++ b/gui/slick/views/config_general.mako @@ -12,10 +12,10 @@ from sickbeard.helpers import anon_url %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/new/config_general.js"></script> +<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/config_general.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: @@ -399,7 +399,10 @@ <span class="component-desc"> <input type="text" name="api_key" id="api_key" value="${sickbeard.API_KEY}" class="form-control input-sm input300" readonly="readonly" /> <input class="btn btn-inline" type="button" id="generate_new_apikey" value="Generate"> - <div class="clear-left"><p>used to give 3rd party programs limited access to SickRage</p></div> + <div class="clear-left"> + <p>used to give 3rd party programs limited access to SickRage</p> + <p>you can try all the features of the API <a href="${srRoot}/apibuilder/">here</a></p> + </div> </span> </label> </div> @@ -614,13 +617,13 @@ <span class="component-desc"> % if not sickbeard.SKIP_REMOVED_FILES: <select name="ep_default_deleted_status" id="ep_default_deleted_status" class="form-control input-sm"> - % for defStatus in [ARCHIVED, IGNORED]: + % for defStatus in [SKIPPED, IGNORED]: <option value="${defStatus}" ${('', 'selected="selected"')[sickbeard.EP_DEFAULT_DELETED_STATUS == defStatus]}>${statusStrings[defStatus]}</option> % endfor </select> % else: <select name="ep_default_deleted_status" id="ep_default_deleted_status" class="form-control input-sm" disabled="disabled"> - % for defStatus in [ARCHIVED, IGNORED]: + % for defStatus in [SKIPPED, IGNORED]: <option value="${defStatus}" ${('', 'selected="selected"')[sickbeard.EP_DEFAULT_DELETED_STATUS == defStatus]}>${statusStrings[defStatus]}</option> % endfor </select> diff --git a/gui/slick/views/config_notifications.mako b/gui/slick/views/config_notifications.mako index f3e88e477ca0b5df6e599be1415abdf7d6471096..c2771c1a975210b701381bc5b86faa38ff312f03 100644 --- a/gui/slick/views/config_notifications.mako +++ b/gui/slick/views/config_notifications.mako @@ -8,9 +8,9 @@ %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/configNotifications.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/new/config_notifications.js"></script> +<script type="text/javascript" src="${srRoot}/js/configNotifications.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/config_notifications.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: @@ -33,7 +33,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/kodi.png" alt="" title="KODI" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/kodi.png" alt="" title="KODI" /> <h3><a href="${anon_url('http://kodi.tv/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">KODI</a></h3> <p>A free and open source cross-platform media center and home entertainment system software with a 10-foot user interface designed for the living-room TV.</p> </div> @@ -158,7 +158,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/plex.png" alt="" title="Plex Media Server" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/plex.png" alt="" title="Plex Media Server" /> <h3><a href="${anon_url('http://www.plexapp.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Plex Media Server</a></h3> <p>Experience your media on a visually stunning, easy to use interface on your Mac connected to your TV. Your media library has never looked this good!</p> <p class="plexinfo hide">For sending notifications to Plex Home Theater (PHT) clients, use the KODI notifier with port <b>3005</b>.</p> @@ -247,7 +247,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/plex.png" alt="" title="Plex Media Client" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/plex.png" alt="" title="Plex Media Client" /> <h3><a href="${anon_url('http://www.plexapp.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Plex Media Client</a></h3> </div> <fieldset class="component-group-list"> @@ -334,7 +334,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/emby.png" alt="" title="Emby" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/emby.png" alt="" title="Emby" /> <h3><a href="${anon_url('http://emby.media/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Emby</a></h3> <p>A home media server built using other popular open source technologies.</p> </div> @@ -376,7 +376,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/nmj.png" alt="" title="Networked Media Jukebox" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/nmj.png" alt="" title="Networked Media Jukebox" /> <h3><a href="${anon_url('http://www.popcornhour.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">NMJ</a></h3> <p>The Networked Media Jukebox, or NMJ, is the official media jukebox interface made available for the Popcorn Hour 200-series.</p> </div> @@ -442,7 +442,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/nmj.png" alt="" title="Networked Media Jukebox v2"/> + <img class="notifier-icon" src="${srRoot}/images/notifiers/nmj.png" alt="" title="Networked Media Jukebox v2"/> <h3><a href="${anon_url('http://www.popcornhour.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">NMJv2</a></h3> <p>The Networked Media Jukebox, or NMJv2, is the official media jukebox interface made available for the Popcorn Hour 300 & 400-series.</p> </div> @@ -530,7 +530,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/synoindex.png" alt="" title="Synology" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/synoindex.png" alt="" title="Synology" /> <h3><a href="${anon_url('http://synology.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Synology</a></h3> <p>The Synology DiskStation NAS.</p> <p>Synology Indexer is the daemon running on the Synology NAS to build its media database.</p> @@ -561,7 +561,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/synologynotifier.png" alt="" title="Synology Indexer" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/synologynotifier.png" alt="" title="Synology Indexer" /> <h3><a href="${anon_url('http://synology.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Synology Notifier</a></h3> <p>Synology Notifier is the notification system of Synology DSM</p> </div> @@ -616,7 +616,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/pytivo.png" alt="" title="pyTivo" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/pytivo.png" alt="" title="pyTivo" /> <h3><a href="${anon_url('http://pytivo.sourceforge.net/wiki/index.php/PyTivo')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">pyTivo</a></h3> <p>pyTivo is both an HMO and GoBack server. This notifier will load the completed downloads to your Tivo.</p> </div> @@ -678,7 +678,7 @@ <div id="tabs-2"> <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/growl.png" alt="" title="Growl" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/growl.png" alt="" title="Growl" /> <h3><a href="${anon_url('http://growl.info/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Growl</a></h3> <p>A cross-platform unobtrusive global notification system.</p> </div> @@ -756,7 +756,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/prowl.png" alt="Prowl" title="Prowl" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/prowl.png" alt="Prowl" title="Prowl" /> <h3><a href="${anon_url('http://www.prowlapp.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Prowl</a></h3> <p>A Growl client for iOS.</p> </div> @@ -836,7 +836,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/libnotify.png" alt="" title="Libnotify" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/libnotify.png" alt="" title="Libnotify" /> <h3><a href="${anon_url('http://library.gnome.org/devel/libnotify/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Libnotify</a></h3> <p>The standard desktop notification API for Linux/*nix systems. This notifier will only function if the pynotify module is installed (Ubuntu/Debian package <a href="apt:python-notify">python-notify</a>).</p> </div> @@ -890,7 +890,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/pushover.png" alt="" title="Pushover" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/pushover.png" alt="" title="Pushover" /> <h3><a href="${anon_url('https://pushover.net/apps/clone/sickrage')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Pushover</a></h3> <p>Pushover makes it easy to send real-time notifications to your Android and iOS devices.</p> </div> @@ -1007,7 +1007,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/boxcar.png" alt="" title="Boxcar" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/boxcar.png" alt="" title="Boxcar" /> <h3><a href="${anon_url('http://boxcar.io/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Boxcar</a></h3> <p>Universal push notification for iOS. Read your messages where and when you want them! A subscription will be sent if needed.</p> </div> @@ -1070,7 +1070,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/boxcar2.png" alt="" title="Boxcar2"/> + <img class="notifier-icon" src="${srRoot}/images/notifiers/boxcar2.png" alt="" title="Boxcar2"/> <h3><a href="${anon_url('https://new.boxcar.io/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Boxcar2</a></h3> <p>Read your messages where and when you want them!</p> </div> @@ -1133,7 +1133,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/nma.png" alt="" title="NMA"/> + <img class="notifier-icon" src="${srRoot}/images/notifiers/nma.png" alt="" title="NMA"/> <h3><a href="${anon_url('http://nma.usk.bz')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Notify My Android</a></h3> <p>Notify My Android is a Prowl-like Android App and API that offers an easy way to send notifications from your application directly to your Android device.</p> </div> @@ -1212,7 +1212,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/pushalot.png" alt="" title="Pushalot" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/pushalot.png" alt="" title="Pushalot" /> <h3><a href="${anon_url('https://pushalot.com')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Pushalot</a></h3> <p>Pushalot is a platform for receiving custom push notifications to connected devices running Windows Phone or Windows 8.</p> </div> @@ -1275,7 +1275,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/pushbullet.png" alt="" title="Pushbullet" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/pushbullet.png" alt="" title="Pushbullet" /> <h3><a href="${anon_url('https://www.pushbullet.com')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Pushbullet</a></h3> <p>Pushbullet is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.</p> </div> @@ -1349,7 +1349,7 @@ </div><!-- /pushbullet component-group //--> <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/freemobile.png" alt="" title="Free Mobile" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/freemobile.png" alt="" title="Free Mobile" /> <h3><a href="${anon_url('http://mobile.free.fr/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Free Mobile</a></h3> <p>Free Mobile is a famous French cellular network provider.<br> It provides to their customer a free SMS API.</p> </div> @@ -1425,7 +1425,7 @@ <div id="tabs-3"> <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/twitter.png" alt="" title="Twitter"/> + <img class="notifier-icon" src="${srRoot}/images/notifiers/twitter.png" alt="" title="Twitter"/> <h3><a href="${anon_url('http://www.twitter.com/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Twitter</a></h3> <p>A social networking and microblogging service, enabling its users to send and read other users' messages called tweets.</p> </div> @@ -1527,7 +1527,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/trakt.png" alt="" title="Trakt"/> + <img class="notifier-icon" src="${srRoot}/images/notifiers/trakt.png" alt="" title="Trakt"/> <h3><a href="${anon_url('http://trakt.tv/')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Trakt</a></h3> <p>trakt helps keep a record of what TV shows and movies you are watching. Based on your favorites, trakt recommends additional shows and movies you'll enjoy!</p> </div> @@ -1688,7 +1688,7 @@ <div class="component-group"> <div class="component-group-desc"> - <img class="notifier-icon" src="${sbRoot}/images/notifiers/email.png" alt="" title="Email" /> + <img class="notifier-icon" src="${srRoot}/images/notifiers/email.png" alt="" title="Email" /> <h3><a href="${anon_url('http://en.wikipedia.org/wiki/Comparison_of_webmail_providers')}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Email</a></h3> <p>Allows configuration of email notifications on a per show basis.</p> </div> diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako index fd2240da6fa8c1a677744d3c66fe263db489b916..66ba675fa6351ed0fb14f24e9cececa0b802482f 100644 --- a/gui/slick/views/config_postProcessing.mako +++ b/gui/slick/views/config_postProcessing.mako @@ -11,12 +11,9 @@ %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/configPostProcessing.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script> -<script type="text/javascript"> - $('#config-components').tabs(); - $('#tv_download_dir').fileBrowser({ title: 'Select TV Download Directory' }); -</script> +<script type="text/javascript" src="${srRoot}/js/configPostProcessing.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/home.js"></script> </%block> <%block name="content"> <div id="content960"> @@ -300,7 +297,7 @@ </span> <span class="component-desc"> <input type="text" name="naming_pattern" id="naming_pattern" value="${sickbeard.NAMING_PATTERN}" class="form-control input-sm input350" /> - <img src="${sbRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_key" title="Toggle Naming Legend" class="legend" class="legend" /> + <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_key" title="Toggle Naming Legend" class="legend" class="legend" /> </span> </label> <label class="nocheck"> @@ -410,17 +407,17 @@ <td>720p_BluRay</td> </tr> <tr class="even"> - <td class="align-right"><i class="icon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td> <td>%RN</td> <td>Show.Name.S02E03.HDTV.XviD-RLSGROUP</td> </tr> <tr> - <td class="align-right"><i class="icon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td> <td>%RG</td> <td>RLSGROUP</td> </tr> <tr class="even"> - <td class="align-right"><i class="icon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td> <td>%RT</td> <td>PROPER</td> </tr> @@ -507,7 +504,7 @@ </span> <span class="component-desc"> <input type="text" name="naming_abd_pattern" id="naming_abd_pattern" value="${sickbeard.NAMING_ABD_PATTERN}" class="form-control input-sm input350" /> - <img src="${sbRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_abd_key" title="Toggle ABD Naming Legend" class="legend" /> + <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_abd_key" title="Toggle ABD Naming Legend" class="legend" /> </span> </label> </div> @@ -618,17 +615,17 @@ <td>09</td> </tr> <tr> - <td class="align-right"><i class="icon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td> <td>%RN</td> <td>Show.Name.2010.03.09.HDTV.XviD-RLSGROUP</td> </tr> <tr class="even"> - <td class="align-right"><i class="icon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td> <td>%RG</td> <td>RLSGROUP</td> </tr> <tr> - <td class="align-right"><i class="icon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td> <td>%RT</td> <td>PROPER</td> </tr> @@ -684,7 +681,7 @@ </span> <span class="component-desc"> <input type="text" name="naming_sports_pattern" id="naming_sports_pattern" value="${sickbeard.NAMING_SPORTS_PATTERN}" class="form-control input-sm input350" /> - <img src="${sbRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_sports_key" title="Toggle Sports Naming Legend" class="legend" /> + <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_sports_key" title="Toggle Sports Naming Legend" class="legend" /> </span> </label> </div> @@ -795,17 +792,17 @@ <td>09</td> </tr> <tr> - <td class="align-right"><i class="icon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td> <td>%RN</td> <td>Show.Name.9th.Mar.2011.HDTV.XviD-RLSGROUP</td> </tr> <tr class="even"> - <td class="align-right"><i class="icon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td> <td>%RG</td> <td>RLSGROUP</td> </tr> <tr> - <td class="align-right"><i class="icon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td> <td>%RT</td> <td>PROPER</td> </tr> @@ -862,7 +859,7 @@ </span> <span class="component-desc"> <input type="text" name="naming_anime_pattern" id="naming_anime_pattern" value="${sickbeard.NAMING_ANIME_PATTERN}" class="form-control input-sm input350" /> - <img src="${sbRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_anime_key" title="Toggle Anime Naming Legend" class="legend" /> + <img src="${srRoot}/images/legend16.png" width="16" height="16" alt="[Toggle Key]" id="show_naming_anime_key" title="Toggle Anime Naming Legend" class="legend" /> </span> </label> </div> @@ -968,17 +965,17 @@ <td>720p_BluRay</td> </tr> <tr class="even"> - <td class="align-right"><i class="icon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="Multi-EP style is ignored"></i> <b>Release Name:</b></td> <td>%RN</td> <td>Show.Name.S02E03.HDTV.XviD-RLSGROUP</td> </tr> <tr> - <td class="align-right"><i class="icon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="'SiCKRAGE' is used in place of RLSGROUP if it could not be properly detected"></i> <b>Release Group:</b></td> <td>%RG</td> <td>RLSGROUP</td> </tr> <tr class="even"> - <td class="align-right"><i class="icon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td> + <td class="align-right"><i class="glyphicon glyphicon-info-sign" title="If episode is proper/repack add 'proper' to name."></i> <b>Release Type:</b></td> <td>%RT</td> <td>PROPER</td> </tr> diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako index 09ed191ad52e1cc9cbfcaac45c865a42fee832c6..365951b34703c320827b0b3f98ae46a4aeb695f0 100644 --- a/gui/slick/views/config_providers.mako +++ b/gui/slick/views/config_providers.mako @@ -7,8 +7,8 @@ %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/configProviders.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/configProviders.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> <script type="text/javascript"> $(document).ready(function(){ % if sickbeard.USE_NZBS: @@ -57,7 +57,7 @@ $('#config-components').tabs(); <p>At least one provider is required but two are recommended.</p> % if not sickbeard.USE_NZBS or not sickbeard.USE_TORRENTS: - <blockquote style="margin: 20px 0;">NZB/Torrent providers can be toggled in <b><a href="${sbRoot}/config/search">Search Settings</a></b></blockquote> + <blockquote style="margin: 20px 0;">NZB/Torrent providers can be toggled in <b><a href="${srRoot}/config/search">Search Settings</a></b></blockquote> % else: <br/> % endif @@ -81,7 +81,7 @@ $('#config-components').tabs(); %> <li class="ui-state-default ${('nzb-provider', 'torrent-provider')[bool(curProvider.providerType == "torrent")]}" id="${curName}"> <input type="checkbox" id="enable_${curName}" class="provider_enabler" ${('', 'checked="checked"')[curProvider.isEnabled() == True]}/> - <a href="${anon_url(curProvider.url)}" class="imgLink" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><img src="${sbRoot}/images/providers/${curProvider.imageName()}" alt="${curProvider.name}" title="${curProvider.name}" width="16" height="16" style="vertical-align:middle;"/></a> + <a href="${anon_url(curProvider.url)}" class="imgLink" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><img src="${srRoot}/images/providers/${curProvider.imageName()}" alt="${curProvider.name}" title="${curProvider.name}" width="16" height="16" style="vertical-align:middle;"/></a> <span style="vertical-align:middle;">${curProvider.name}</span> ${('*', '')[bool(curProvider.supportsBacklog)]} <span class="ui-icon ui-icon-arrowthick-2-n-s pull-right" style="vertical-align:middle;"></span> diff --git a/gui/slick/views/config_search.mako b/gui/slick/views/config_search.mako index 814d374eff34705e6297cd2cbd4ecfa11de0dbcd..8e74093c3c99014ca985b861de20a13ebf9d9f1d 100644 --- a/gui/slick/views/config_search.mako +++ b/gui/slick/views/config_search.mako @@ -4,15 +4,9 @@ from sickbeard import clients %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/configSearch.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/config.js?${sbPID}"></script> -<script type="text/javascript" charset="utf-8"> - $('#config-components').tabs(); - $('#nzb_dir').fileBrowser({ title: 'Select .nzb black hole/watch location' }); - $('#torrent_dir').fileBrowser({ title: 'Select .torrent black hole/watch location' }); - $('#torrent_path').fileBrowser({ title: 'Select .torrent download location' }); - $('#tv_download_dir').fileBrowser({ title: 'Select TV download location' }); -</script> +<script type="text/javascript" src="${srRoot}/js/configSearch.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/config_search.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: @@ -38,7 +32,7 @@ <div class="component-group-desc"> <h3>Episode Search</h3> - <p>How to manage searching with <a href="${sbRoot}/config/providers">providers</a>.</p> + <p>How to manage searching with <a href="${srRoot}/config/providers">providers</a>.</p> </div> <fieldset class="component-group-list"> diff --git a/gui/slick/views/config_subtitles.mako b/gui/slick/views/config_subtitles.mako index 93104adf0d2cb523dd105543cf93ca385de3e071..3adac686d3b262e37a0799629cbcdfc7f69c0a23 100644 --- a/gui/slick/views/config_subtitles.mako +++ b/gui/slick/views/config_subtitles.mako @@ -4,24 +4,26 @@ import sickbeard from sickbeard.helpers import anon_url %> +<%block name="metas"> +## <meta data-var="subtitles.subtitleLanguageFilter" data-content="${','.join("{id: " + lang.opensubtitles + ", name: " + lang.name + "}" for lang in subtitles.subtitleLanguageFilter())}"> +## <meta data-var="prePopulate" data-content="${','.join("{id: " + subtitles.fromietf(lang).opensubtitles + ", name: " + subtitles.fromietf(lang).name + "}" for lang in subtitles.wantedLanguages()) if subtitles.wantedLanguages() else ''}"> +</%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/configSubtitles.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/config.js"></script> -<script type="text/javascript" src="${sbRoot}/js/lib/jquery.tokeninput.js"></script> -<script type="text/javascript"> - $(document).ready(function() { - $("#subtitles_languages").tokenInput( - [${",\r\n".join("{id: \"" + lang.opensubtitles + "\", name: \"" + lang.name + "\"}" for lang in subtitles.subtitleLanguageFilter())}], - { - method: "POST", - hintText: "Write to search a language and select it", - preventDuplicates: true, - prePopulate: [${",\r\n".join("{id: \"" + subtitles.fromietf(lang).opensubtitles + "\", name: \"" + subtitles.fromietf(lang).name + "\"}" for lang in subtitles.wantedLanguages()) if subtitles.wantedLanguages() else ''}] - } - ); +<script type="text/javascript" src="${srRoot}/js/configSubtitles.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/config.js"></script> +<script type="text/javascript" src="${srRoot}/js/lib/jquery.tokeninput.js"></script> +## <script type="text/javascript" src="${srRoot}/js/new/config_subtitles.js"></script> +<script> +$(document).ready(function() { + $("#subtitles_languages").tokenInput([${','.join("{\"id\": \"" + lang.opensubtitles + "\", name: \"" + lang.name + "\"}" for lang in subtitles.subtitleLanguageFilter())}], { + method: "POST", + hintText: "Write to search a language and select it", + preventDuplicates: true, + prePopulate: [${','.join("{\"id\": \"" + subtitles.fromietf(lang).opensubtitles + "\", name: \"" + subtitles.fromietf(lang).name + "\"}" for lang in subtitles.wantedLanguages()) if subtitles.wantedLanguages() else ''}] }); - $('#config-components').tabs(); - $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' }); +}); +$('#config-components').tabs(); +$('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' }); </script> </%block> <%block name="content"> @@ -160,7 +162,7 @@ <li class="ui-state-default" id="${curService['name']}"> <input type="checkbox" id="enable_${curService['name']}" class="service_enabler" ${('', 'checked="checked"')[curService['enabled'] == True]}/> <a href="${anon_url(curService['url'])}" class="imgLink" target="_new"> - <img src="${sbRoot}/images/subtitles/${curService['image']}" alt="${curService['url']}" title="${curService['url']}" width="16" height="16" style="vertical-align:middle;"/> + <img src="${srRoot}/images/subtitles/${curService['image']}" alt="${curService['url']}" title="${curService['url']}" width="16" height="16" style="vertical-align:middle;"/> </a> <span style="vertical-align:middle;">${curService['name'].capitalize()}</span> <span class="ui-icon ui-icon-arrowthick-2-n-s pull-right" style="vertical-align:middle;"></span> diff --git a/gui/slick/views/displayShow.mako b/gui/slick/views/displayShow.mako index c80df153f9f7da47ff1250464a58fa6c0188cea0..b1914a82307c2e9b22b04462189397a350ead244 100644 --- a/gui/slick/views/displayShow.mako +++ b/gui/slick/views/displayShow.mako @@ -11,70 +11,23 @@ from sickbeard.common import Quality, qualityPresets, statusStrings, Overview from sickbeard.helpers import anon_url - - fuzzydate = 'airdate' %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/lib/jquery.bookmarkscroll.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/displayShow.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/sceneExceptionsTooltip.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/ratingTooltip.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/ajaxEpSearch.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/ajaxEpSubtitles.js?${sbPID}"></script> -<script type="text/javascript" charset="utf-8"> -$(document).ready(function(){ - % if sickbeard.FUZZY_DATING: - fuzzyMoment({ - containerClass : '.${fuzzydate}', - dateHasTime : false, - dateFormat : '${sickbeard.DATE_PRESET}', - timeFormat : '${sickbeard.TIME_PRESET}', - trimZero : ${("false", "true")[bool(sickbeard.TRIM_ZERO)]} - }); - % endif - $('.addQTip').each(function () { - $(this).css({'cursor':'help', 'text-shadow':'0px 0px 0.5px #666'}); - $(this).qtip({ - show: {solo:true}, - position: {viewport:$(window), my:'left center', adjust:{ y: -10, x: 2 }}, - style: {tip:{corner:true, method:'polygon'}, classes:'qtip-rounded qtip-shadow ui-tooltip-sb'} - }); - }); - $.fn.generateStars = function() { - return this.each(function(i,e){$(e).html($('<span/>').width($(e).text()*12));}); - }; - - $('.imdbstars').generateStars(); - - $("${('#showTable', '#animeTable')[bool(show.is_anime)]}").tablesorter({ - widgets: ['saveSort', 'stickyHeaders', 'columnSelector'], - widgetOptions : { - columnSelector_saveColumns: true, - columnSelector_layout : '<br/><label><input type="checkbox">{name}</label>', - columnSelector_mediaquery: false, - columnSelector_cssChecked : 'checked' - }, - }); - - $('#popover').popover({ - placement: 'bottom', - html: true, // required if content has HTML - content: '<div id="popover-target"></div>' - }) - // bootstrap popover event triggered when the popover opens - .on('shown.bs.popover', function () { - $.tablesorter.columnSelector.attachTo( $("${('#showTable', '#animeTable')[bool(show.is_anime)]}"), '#popover-target'); - }); -}); -</script> +<script type="text/javascript" src="${srRoot}/js/lib/jquery.bookmarkscroll.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/displayShow.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/sceneExceptionsTooltip.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/ratingTooltip.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/ajaxEpSearch.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/ajaxEpSubtitles.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/displayShow.js"></script> </%block> <%block name="content"> <%namespace file="/inc_defs.mako" import="renderQualityPill"/> -<input type="hidden" id="sbRoot" value="${sbRoot}" /> +<input type="hidden" id="srRoot" value="${srRoot}" /> <div class="pull-left form-inline"> Change Show: - <div class="navShow"><img id="prevShow" src="${sbRoot}/images/prev.png" alt="<<" title="Prev Show" /></div> + <div class="navShow"><img id="prevShow" src="${srRoot}/images/prev.png" alt="<<" title="Prev Show" /></div> <select id="pickShow" class="form-control form-control-inline input-sm"> % for curShowList in sortedShowLists: <% curShowType = curShowList[0] %> @@ -91,7 +44,7 @@ $(document).ready(function(){ % endif % endfor </select> - <div class="navShow"><img id="nextShow" src="${sbRoot}/images/next.png" alt=">>" title="Next Show" /></div> + <div class="navShow"><img id="nextShow" src="${srRoot}/images/next.png" alt=">>" title="Next Show" /></div> </div> <div class="clearfix"></div> @@ -113,7 +66,7 @@ $(document).ready(function(){ <span class="h2footer displayspecials pull-right"> % if season_special: Display Specials: - <a class="inner" href="${sbRoot}/toggleDisplayShowSpecials/?show=${show.indexerid}">${('Show', 'Hide')[bool(sickbeard.DISPLAY_SHOW_SPECIALS)]}</a> + <a class="inner" href="${srRoot}/toggleDisplayShowSpecials/?show=${show.indexerid}">${('Show', 'Hide')[bool(sickbeard.DISPLAY_SHOW_SPECIALS)]}</a> % endif </span> @@ -155,7 +108,7 @@ $(document).ready(function(){ <div id="container"> <div id="posterCol"> - <a href="${sbRoot}/showPoster/?show=${show.indexerid}&which=poster" rel="dialog" title="View Poster for ${show.name}"><img src="${sbRoot}/showPoster/?show=${show.indexerid}&which=poster_thumb" class="tvshowImg" alt=""/></a> + <a href="${srRoot}/showPoster/?show=${show.indexerid}&which=poster" rel="dialog" title="View Poster for ${show.name}"><img src="${srRoot}/showPoster/?show=${show.indexerid}&which=poster_thumb" class="tvshowImg" alt=""/></a> </div> <div id="showCol"> @@ -172,17 +125,17 @@ $(document).ready(function(){ % else: % if 'country_codes' in show.imdb_info: % for country in show.imdb_info['country_codes'].split('|'): - <img src="${sbRoot}/images/blank.png" class="country-flag flag-${country}" width="16" height="11" style="margin-left: 3px; vertical-align:middle;" /> + <img src="${srRoot}/images/blank.png" class="country-flag flag-${country}" width="16" height="11" style="margin-left: 3px; vertical-align:middle;" /> % endfor % endif % if 'year' in show.imdb_info: <span>(${show.imdb_info['year']}) - ${show.imdb_info['runtimes']} minutes - </span> % endif - <a href="${anon_url('http://www.imdb.com/title/', _show.imdbid)}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;" title="http://www.imdb.com/title/${show.imdbid}"><img alt="[imdb]" height="16" width="16" src="${sbRoot}/images/imdb.png" style="margin-top: -1px; vertical-align:middle;"/></a> + <a href="${anon_url('http://www.imdb.com/title/', _show.imdbid)}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;" title="http://www.imdb.com/title/${show.imdbid}"><img alt="[imdb]" height="16" width="16" src="${srRoot}/images/imdb.png" style="margin-top: -1px; vertical-align:middle;"/></a> % endif - <a href="${anon_url(sickbeard.indexerApi(_show.indexer).config['show_url'], _show.indexerid)}" onclick="window.open(this.href, '_blank'); return false;" title="${sickbeard.indexerApi(show.indexer).config["show_url"] + str(show.indexerid)}"><img alt="${sickbeard.indexerApi(show.indexer).name}" height="16" width="16" src="${sbRoot}/images/${sickbeard.indexerApi(show.indexer).config["icon"]}" style="margin-top: -1px; vertical-align:middle;"/></a> + <a href="${anon_url(sickbeard.indexerApi(_show.indexer).config['show_url'], _show.indexerid)}" onclick="window.open(this.href, '_blank'); return false;" title="${sickbeard.indexerApi(show.indexer).config["show_url"] + str(show.indexerid)}"><img alt="${sickbeard.indexerApi(show.indexer).name}" height="16" width="16" src="${srRoot}/images/${sickbeard.indexerApi(show.indexer).config["icon"]}" style="margin-top: -1px; vertical-align:middle;"/></a> % if xem_numbering or xem_absolute_numbering: - <a href="${anon_url('http://thexem.de/search?q=', _show.name)}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;" title="http://thexem.de/search?q-${show.name}"><img alt="[xem]" height="16" width="16" src="${sbRoot}/images/xem.png" style="margin-top: -1px; vertical-align:middle;"/></a> + <a href="${anon_url('http://thexem.de/search?q=', _show.name)}" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;" title="http://thexem.de/search?q-${show.name}"><img alt="[xem]" height="16" width="16" src="${srRoot}/images/xem.png" style="margin-top: -1px; vertical-align:middle;"/></a> % endif </div> @@ -257,19 +210,19 @@ $(document).ready(function(){ <table style="width:180px; float: right; vertical-align: middle; height: 100%;"> <% info_flag = subtitles.fromietf(show.lang).opensubtitles if show.lang else '' %> - <tr><td class="showLegend">Info Language:</td><td><img src="${sbRoot}/images/subtitles/flags/${info_flag}.png" width="16" height="11" alt="${show.lang}" title="${show.lang}" onError="this.onerror=null;this.src='${sbRoot}/images/flags/unknown.png';"/></td></tr> + <tr><td class="showLegend">Info Language:</td><td><img src="${srRoot}/images/subtitles/flags/${info_flag}.png" width="16" height="11" alt="${show.lang}" title="${show.lang}" onError="this.onerror=null;this.src='${srRoot}/images/flags/unknown.png';"/></td></tr> % if sickbeard.USE_SUBTITLES: - <tr><td class="showLegend">Subtitles: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.subtitles)]}" alt="${("N", "Y")[bool(show.subtitles)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">Subtitles: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.subtitles)]}" alt="${("N", "Y")[bool(show.subtitles)]}" width="16" height="16" /></td></tr> % endif - <tr><td class="showLegend">Flat Folders: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.flatten_folders or sickbeard.NAMING_FORCE_FOLDERS)]}" alt=="${("N", "Y")[bool(show.flatten_folders or sickbeard.NAMING_FORCE_FOLDERS)]}" width="16" height="16" /></td></tr> - <tr><td class="showLegend">Paused: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.paused)]}" alt="${("N", "Y")[bool(show.paused)]}" width="16" height="16" /></td></tr> - <tr><td class="showLegend">Air-by-Date: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.air_by_date)]}" alt="${("N", "Y")[bool(show.air_by_date)]}" width="16" height="16" /></td></tr> - <tr><td class="showLegend">Sports: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.is_sports)]}" alt="${("N", "Y")[bool(show.is_sports)]}" width="16" height="16" /></td></tr> - <tr><td class="showLegend">Anime: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.is_anime)]}" alt="${("N", "Y")[bool(show.is_anime)]}" width="16" height="16" /></td></tr> - <tr><td class="showLegend">DVD Order: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.dvdorder)]}" alt="${("N", "Y")[bool(show.dvdorder)]}" width="16" height="16" /></td></tr> - <tr><td class="showLegend">Scene Numbering: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.scene)]}" alt="${("N", "Y")[bool(show.scene)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">Flat Folders: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.flatten_folders or sickbeard.NAMING_FORCE_FOLDERS)]}" alt=="${("N", "Y")[bool(show.flatten_folders or sickbeard.NAMING_FORCE_FOLDERS)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">Paused: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.paused)]}" alt="${("N", "Y")[bool(show.paused)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">Air-by-Date: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.air_by_date)]}" alt="${("N", "Y")[bool(show.air_by_date)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">Sports: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.is_sports)]}" alt="${("N", "Y")[bool(show.is_sports)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">Anime: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.is_anime)]}" alt="${("N", "Y")[bool(show.is_anime)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">DVD Order: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.dvdorder)]}" alt="${("N", "Y")[bool(show.dvdorder)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">Scene Numbering: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.scene)]}" alt="${("N", "Y")[bool(show.scene)]}" width="16" height="16" /></td></tr> % if anyQualities and bestQualities: - <tr><td class="showLegend">Archive First Match: </td><td><img src="${sbRoot}/images/${("no16.png", "yes16.png")[bool(show.archive_firstmatch)]}" alt="${("N", "Y")[bool(show.archive_firstmatch)]}" width="16" height="16" /></td></tr> + <tr><td class="showLegend">Archive First Match: </td><td><img src="${srRoot}/images/${("no16.png", "yes16.png")[bool(show.archive_firstmatch)]}" alt="${("N", "Y")[bool(show.archive_firstmatch)]}" width="16" height="16" /></td></tr> % endif </table> </div> @@ -286,7 +239,7 @@ $(document).ready(function(){ <% availableStatus.remove(FAILED) %> % endif % for curStatus in availableStatus + sorted(Quality.DOWNLOADED) + sorted(Quality.ARCHIVED): - % if curStatus != DOWNLOADED: + % if curStatus not in [DOWNLOADED, ARCHIVED]: <option value="${curStatus}">${statusStrings[curStatus]}</option> % endif % endfor @@ -387,7 +340,6 @@ $(document).ready(function(){ % if sickbeard.DISPLAY_ALL_SEASONS == False: <button id="showseason-${epResult['season']}" type="button" class="btn btn-xs pull-right" data-toggle="collapse" data-target="#collapseSeason-${epResult['season']}">Show Episodes</button> <script type="text/javascript"> - <!-- $(function() { $('#collapseSeason-${epResult['season']}').on('hide.bs.collapse', function () { $('#showseason-${epResult['season']}').text('Show Episodes'); @@ -396,7 +348,6 @@ $(document).ready(function(){ $('#showseason-${epResult['season']}').text('Hide Episodes'); }) }); - //--> </script> % endif </th> @@ -476,8 +427,8 @@ $(document).ready(function(){ <input type="checkbox" class="epCheck" id="${str(epResult["season"])+'x'+str(epResult["episode"])}" name="${str(epResult["season"]) +"x"+str(epResult["episode"])}" /> % endif </td> - <td align="center"><img src="${sbRoot}/images/${("nfo-no.gif", "nfo.gif")[epResult["hasnfo"]]}" alt="${("N", "Y")[epResult["hasnfo"]]}" width="23" height="11" /></td> - <td align="center"><img src="${sbRoot}/images/${("tbn-no.gif", "tbn.gif")[epResult["hastbn"]]}" alt="${("N", "Y")[epResult["hastbn"]]}" width="23" height="11" /></td> + <td align="center"><img src="${srRoot}/images/${("nfo-no.gif", "nfo.gif")[epResult["hasnfo"]]}" alt="${("N", "Y")[epResult["hasnfo"]]}" width="23" height="11" /></td> + <td align="center"><img src="${srRoot}/images/${("tbn-no.gif", "tbn.gif")[epResult["hastbn"]]}" alt="${("N", "Y")[epResult["hastbn"]]}" width="23" height="11" /></td> <td align="center"> <% if epLoc and show._location and epLoc.lower().startswith(show._location.lower()): @@ -517,9 +468,9 @@ $(document).ready(function(){ </td> <td class="col-name"> % if epResult["description"] != "" and epResult["description"] != None: - <img src="${sbRoot}/images/info32.png" width="16" height="16" class="plotInfo" alt="" id="plot_info_${str(show.indexerid)}_${str(epResult["season"])}_${str(epResult["episode"])}" /> + <img src="${srRoot}/images/info32.png" width="16" height="16" class="plotInfo" alt="" id="plot_info_${str(show.indexerid)}_${str(epResult["season"])}_${str(epResult["episode"])}" /> % else: - <img src="${sbRoot}/images/info32.png" width="16" height="16" class="plotInfoNone" alt="" /> + <img src="${srRoot}/images/info32.png" width="16" height="16" class="plotInfoNone" alt="" /> % endif ${epResult["name"]} </td> @@ -540,8 +491,15 @@ $(document).ready(function(){ ${file_size} % endif </td> + <% date = sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(epResult['airdate'], show.airs, show.network)) %> <td class="col-airdate"> - <span class="${fuzzydate}">${(sbdatetime.sbdatetime.sbfdate(sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(epResult['airdate'], show.airs, show.network))), 'never')[int(epResult['airdate']) == 1]}</span> + % if int(epResult['airdate']) != 1: + <time datetime="${date.isoformat('T')}" class="date">${date}</time> + % else: + Never + % endif + <span class="sort_data">${date.isoformat('T')}</span> + </td> <td> % if sickbeard.DOWNLOAD_URL and epResult['location']: @@ -558,7 +516,7 @@ $(document).ready(function(){ <td class="col-subtitles" align="center"> % for sub_lang in [subtitles.fromietf(x) for x in epResult["subtitles"].split(',') if epResult["subtitles"]]: <% flag = sub_lang.opensubtitles %> - <img src="${sbRoot}/images/subtitles/flags/${flag}.png" width="16" height="11" alt="${sub_lang.name}" onError="this.onerror=null;this.src='${sbRoot}/images/flags/unknown.png';" /> + <img src="${srRoot}/images/subtitles/flags/${flag}.png" width="16" height="11" alt="${sub_lang.name}" onError="this.onerror=null;this.src='${srRoot}/images/flags/unknown.png';" /> % endfor </td> <% curStatus, curQuality = Quality.splitCompositeStatus(int(epResult["status"])) %> @@ -570,13 +528,13 @@ $(document).ready(function(){ <td class="col-search"> % if int(epResult["season"]) != 0: % if ( int(epResult["status"]) in Quality.SNATCHED + Quality.DOWNLOADED ) and sickbeard.USE_FAILED_DOWNLOADS: - <a class="epRetry" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="retryEpisode?show=${show.indexerid}&season=${epResult["season"]}&episode=${epResult["episode"]}"><img src="${sbRoot}/images/search16.png" height="16" alt="retry" title="Retry Download" /></a> + <a class="epRetry" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="retryEpisode?show=${show.indexerid}&season=${epResult["season"]}&episode=${epResult["episode"]}"><img src="${srRoot}/images/search16.png" height="16" alt="retry" title="Retry Download" /></a> % else: - <a class="epSearch" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="searchEpisode?show=${show.indexerid}&season=${epResult["season"]}&episode=${epResult["episode"]}"><img src="${sbRoot}/images/search16.png" width="16" height="16" alt="search" title="Manual Search" /></a> + <a class="epSearch" id="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" name="${str(show.indexerid)}x${str(epResult["season"])}x${str(epResult["episode"])}" href="searchEpisode?show=${show.indexerid}&season=${epResult["season"]}&episode=${epResult["episode"]}"><img src="${srRoot}/images/search16.png" width="16" height="16" alt="search" title="Manual Search" /></a> % endif % endif % if sickbeard.USE_SUBTITLES and show.subtitles and epResult["location"] and frozenset(subtitles.wantedLanguages()).difference(epResult["subtitles"].split(',')): - <a class="epSubtitlesSearch" href="searchEpisodeSubtitles?show=${show.indexerid}&season=${epResult["season"]}&episode=${epResult["episode"]}"><img src="${sbRoot}/images/closed_captioning.png" height="16" alt="search subtitles" title="Search Subtitles" /></a> + <a class="epSubtitlesSearch" href="searchEpisodeSubtitles?show=${show.indexerid}&season=${epResult["season"]}&episode=${epResult["episode"]}"><img src="${srRoot}/images/closed_captioning.png" height="16" alt="search subtitles" title="Search Subtitles" /></a> % endif </td> </tr> diff --git a/gui/slick/views/editShow.mako b/gui/slick/views/editShow.mako index 09e724a965f9adfffbdb714c17add6da110a52e5..411e84642ae9fefb25f3eeda8bcc5a272b0f0ea2 100644 --- a/gui/slick/views/editShow.mako +++ b/gui/slick/views/editShow.mako @@ -12,11 +12,11 @@ <meta data-var="show.is_anime" data-content="${show.is_anime}"> </%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/qualityChooser.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/new/editShow.js"></script> +<script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/editShow.js"></script> % if show.is_anime: - <script type="text/javascript" src="${sbRoot}/js/blackwhite.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/blackwhite.js?${sbPID}"></script> % endif </%block> <%block name="content"> @@ -68,7 +68,7 @@ This will <b>affect the episode show search</b> on nzb and torrent provider.<br <b>Default Episode Status:</b><br /> (this will set the status for future episodes)<br /> <select name="defaultEpStatus" id="defaultEpStatusSelect" class="form-control form-control-inline input-sm"> - % for curStatus in [WANTED, SKIPPED, ARCHIVED, IGNORED]: + % for curStatus in [WANTED, SKIPPED, IGNORED]: <option value="${curStatus}" ${('', 'selected="selected"')[curStatus == show.default_ep_status]}>${statusStrings[curStatus]}</option> % endfor </select><br /> diff --git a/gui/slick/views/errorlogs.mako b/gui/slick/views/errorlogs.mako index 70b3f02b8eb41a70c5498aa8fc7a4f8754ffd634..3a397330a690d1a07dbad22e4a9304afeff4e7f7 100644 --- a/gui/slick/views/errorlogs.mako +++ b/gui/slick/views/errorlogs.mako @@ -5,9 +5,7 @@ from sickbeard.logger import reverseNames %> <%block name="scripts"> -<script type="text/javascript" charset="utf-8"> -window.setInterval( "location.reload(true)", 600000); // Refresh every 10 minutes -</script> +<script type="text/javascript" src="${srRoot}/js/new/errorlogs.js"></script> </%block> <%block name="content"> <h1 class="header">${title}</h1> diff --git a/gui/slick/views/history.mako b/gui/slick/views/history.mako index 3a603206118cb526ab7a1a7985f490a2549814c4..3092a237eb903ffda1fafd432389ab3368bbea1e 100644 --- a/gui/slick/views/history.mako +++ b/gui/slick/views/history.mako @@ -17,8 +17,6 @@ layout = sickbeard.HISTORY_LAYOUT history_limit = sickbeard.HISTORY_LIMIT - - fuzzydate = 'airdate' %> <%block name="css"> <style type="text/css"> @@ -28,11 +26,9 @@ <%block name="metas"> <meta data-var="sickbeard.FUZZY_DATING" data-content="${sickbeard.FUZZY_DATING}"> <meta data-var="layout" data-content="${layout}"> -<meta data-var="fuzzydate" data-content="${fuzzydate}"> </%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/lib/jquery.timeago.js"></script> -<script type="text/javascript" src="${sbRoot}/js/new/history.js"></script> +<script type="text/javascript" src="${srRoot}/js/new/history.js"></script> </%block> <%block name="content"> <%namespace file="/inc_defs.mako" import="renderQualityPill"/> @@ -54,8 +50,8 @@ <span> 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" ${('', 'selected="selected"')[sickbeard.HISTORY_LAYOUT == 'compact']}>Compact</option> - <option value="${sbRoot}/setHistoryLayout/?layout=detailed" ${('', 'selected="selected"')[sickbeard.HISTORY_LAYOUT == 'detailed']}>Detailed</option> + <option value="${srRoot}/setHistoryLayout/?layout=compact" ${('', 'selected="selected"')[sickbeard.HISTORY_LAYOUT == 'compact']}>Compact</option> + <option value="${srRoot}/setHistoryLayout/?layout=detailed" ${('', 'selected="selected"')[sickbeard.HISTORY_LAYOUT == 'detailed']}>Detailed</option> </select> </span> </div> @@ -83,12 +79,15 @@ % for hItem in historyResults: <% curStatus, curQuality = Quality.splitCompositeStatus(int(hItem["action"])) %> <tr> - <% curdatetime = datetime.datetime.strptime(str(hItem["date"]), History.date_format) %> - <td align="center"><div class="${fuzzydate}">${sbdatetime.sbdatetime.sbfdatetime(curdatetime, show_seconds=True)}</div><span class="sort_data">${time.mktime(curdatetime.timetuple())}</span></td> - <td class="tvShow" width="35%"><a href="${sbRoot}/home/displayShow?show=${hItem["show_id"]}#season-${hItem["season"]}">${hItem["show_name"]} - ${"S%02i" % int(hItem["season"])}${"E%02i" % int(hItem["episode"])} ${('', '<span class="quality Proper">Proper</span>')["proper" in hItem["resource"].lower() or "repack" in hItem["resource"].lower()]}</a></td> + <td align="center"> + <% airDate = sbdatetime.sbdatetime.sbfdatetime(datetime.datetime.strptime(str(hItem["date"]), History.date_format), show_seconds=True) %> + <% isoDate = datetime.datetime.strptime(str(hItem["date"]), History.date_format).isoformat('T') %> + <time datetime="${isoDate}" class="date">${airDate}</time> + </td> + <td class="tvShow" width="35%"><a href="${srRoot}/home/displayShow?show=${hItem["show_id"]}#season-${hItem["season"]}">${hItem["show_name"]} - ${"S%02i" % int(hItem["season"])}${"E%02i" % int(hItem["episode"])} ${('', '<span class="quality Proper">Proper</span>')["proper" in hItem["resource"].lower() or "repack" in hItem["resource"].lower()]}</a></td> <td align="center" ${('', 'class="subtitles_column"')[curStatus == SUBTITLED]}> % if curStatus == SUBTITLED: - <img width="16" height="11" style="vertical-align:middle;" src="${sbRoot}/images/subtitles/flags/${hItem['resource']}.png" onError="this.onerror=null;this.src='${sbRoot}/images/flags/unknown.png';"> + <img width="16" height="11" style="vertical-align:middle;" src="${srRoot}/images/subtitles/flags/${hItem['resource']}.png" onError="this.onerror=null;this.src='${srRoot}/images/flags/unknown.png';"> % endif <span style="cursor: help; vertical-align:middle;" title="${os.path.basename(hItem['resource'])}">${statusStrings[curStatus]}</span> </td> @@ -102,12 +101,12 @@ % if curStatus in [SNATCHED, FAILED]: <% provider = providers.getProviderClass(generic.GenericProvider.makeID(hItem["provider"])) %> % if provider != None: - <img src="${sbRoot}/images/providers/${provider.imageName()}" width="16" height="16" style="vertical-align:middle;" /> <span style="vertical-align:middle;">${provider.name}</span> + <img src="${srRoot}/images/providers/${provider.imageName()}" width="16" height="16" style="vertical-align:middle;" /> <span style="vertical-align:middle;">${provider.name}</span> % else: - <img src="${sbRoot}/images/providers/missing.png" width="16" height="16" style="vertical-align:middle;" title="missing provider"/> <span style="vertical-align:middle;">Missing Provider</span> + <img src="${srRoot}/images/providers/missing.png" width="16" height="16" style="vertical-align:middle;" title="missing provider"/> <span style="vertical-align:middle;">Missing Provider</span> % endif % else: - <img src="${sbRoot}/images/subtitles/${hItem['provider']}.png" width="16" height="16" style="vertical-align:middle;" /> <span style="vertical-align:middle;">${hItem["provider"].capitalize()}</span> + <img src="${srRoot}/images/subtitles/${hItem['provider']}.png" width="16" height="16" style="vertical-align:middle;" /> <span style="vertical-align:middle;">${hItem["provider"].capitalize()}</span> % endif % endif % endif @@ -143,10 +142,13 @@ <tbody> % for hItem in compactResults: <tr> - <% curdatetime = datetime.datetime.strptime(str(hItem["actions"][0]["time"]), History.date_format) %> - <td align="center"><div class="${fuzzydate}">${sbdatetime.sbdatetime.sbfdatetime(curdatetime, show_seconds=True)}</div><span class="sort_data">${time.mktime(curdatetime.timetuple())}</span></td> + <td align="center"> + <% airDate = sbdatetime.sbdatetime.sbfdatetime(datetime.datetime.strptime(str(hItem["actions"][0]["time"]), History.date_format), show_seconds=True) %> + <% isoDate = datetime.datetime.strptime(str(hItem["actions"][0]["time"]), History.date_format).isoformat('T') %> + <time datetime="${isoDate}" class="date">${airDate}</time> + </td> <td class="tvShow" width="25%"> - <span><a href="${sbRoot}/home/displayShow?show=${hItem["show_id"]}#season-${hItem["season"]}">${hItem["show_name"]} - ${"S%02i" % int(hItem["season"])}${"E%02i" % int(hItem["episode"])}${('', ' <span class="quality Proper">Proper</span>')['proper' in hItem["resource"].lower() or 'repack' in hItem["resource"].lower()]}</a></span> + <span><a href="${srRoot}/home/displayShow?show=${hItem["show_id"]}#season-${hItem["season"]}">${hItem["show_name"]} - ${"S%02i" % int(hItem["season"])}${"E%02i" % int(hItem["episode"])}${('', ' <span class="quality Proper">Proper</span>')['proper' in hItem["resource"].lower() or 'repack' in hItem["resource"].lower()]}</a></span> </td> <td align="center" provider="${str(sorted(hItem["actions"])[0]["provider"])}"> % for action in sorted(hItem["actions"]): @@ -154,9 +156,9 @@ % if curStatus in [SNATCHED, FAILED]: <% provider = providers.getProviderClass(generic.GenericProvider.makeID(action["provider"])) %> % if provider != None: - <img src="${sbRoot}/images/providers/${provider.imageName()}" width="16" height="16" style="vertical-align:middle;" alt="${provider.name}" style="cursor: help;" title="${provider.name}: ${os.path.basename(action["resource"])}"/> + <img src="${srRoot}/images/providers/${provider.imageName()}" width="16" height="16" style="vertical-align:middle;" alt="${provider.name}" style="cursor: help;" title="${provider.name}: ${os.path.basename(action["resource"])}"/> % else: - <img src="${sbRoot}/images/providers/missing.png" width="16" height="16" style="vertical-align:middle;" alt="missing provider" title="missing provider"/> + <img src="${srRoot}/images/providers/missing.png" width="16" height="16" style="vertical-align:middle;" alt="missing provider" title="missing provider"/> % endif % endif % endfor @@ -178,9 +180,9 @@ % for action in sorted(hItem["actions"]): <% curStatus, curQuality = Quality.splitCompositeStatus(int(action["action"])) %> % if curStatus == SUBTITLED: - <img src="${sbRoot}/images/subtitles/${action['provider']}.png" width="16" height="16" style="vertical-align:middle;" alt="${action["provider"]}" title="${action["provider"].capitalize()}: ${os.path.basename(action["resource"])}"/> + <img src="${srRoot}/images/subtitles/${action['provider']}.png" width="16" height="16" style="vertical-align:middle;" alt="${action["provider"]}" title="${action["provider"].capitalize()}: ${os.path.basename(action["resource"])}"/> <span style="vertical-align:middle;"> / </span> - <img width="16" height="11" style="vertical-align:middle;" src="${sbRoot}/images/subtitles/flags/${action['resource']}.png" onError="this.onerror=null;this.src='${sbRoot}/images/flags/unknown.png';" style="vertical-align: middle !important;"> + <img width="16" height="11" style="vertical-align:middle;" src="${srRoot}/images/subtitles/flags/${action['resource']}.png" onError="this.onerror=null;this.src='${srRoot}/images/flags/unknown.png';" style="vertical-align: middle !important;"> % endif % endfor diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako index b6d954ca0505e3420c88ed5a5d774acc4ed08c1a..726cf77eace291acaf9a71ed07b5db75a0ff7191 100644 --- a/gui/slick/views/home.mako +++ b/gui/slick/views/home.mako @@ -11,10 +11,9 @@ myDB = db.DBConnection() today = str(datetime.date.today().toordinal()) layout = sickbeard.HOME_LAYOUT - fuzzydate = 'airdate' status_quality = '(' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ')' - status_download = '(' + ','.join([str(x) for x in Quality.DOWNLOADED + [ARCHIVED]]) + ')' + status_download = '(' + ','.join([str(x) for x in Quality.DOWNLOADED + Quality.ARCHIVED]) + ')' sql_statement = 'SELECT showid, ' @@ -52,11 +51,9 @@ <meta data-var="sickbeard.TRIM_ZERO" data-content="${sickbeard.TRIM_ZERO}"> <meta data-var="max_download_count" data-content="${max_download_count}"> <meta data-var="layout" data-content="${layout}"> -<meta data-var="fuzzydate" data-content="${fuzzydate}"> </%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/lib/jquery.timeago.js"></script> -<script type="text/javascript" src="${sbRoot}/js/new/home.js"></script> +<script type="text/javascript" src="${srRoot}/js/new/home.js"></script> </%block> <%block name="content"> <%namespace file="/inc_defs.mako" import="renderQualityPill"/> @@ -72,10 +69,10 @@ % endif <span> Layout: <select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;"> - <option value="${sbRoot}/setHomeLayout/?layout=poster" ${('', 'selected="selected"')[layout == 'poster']}>Poster</option> - <option value="${sbRoot}/setHomeLayout/?layout=small" ${('', 'selected="selected"')[layout == 'small']}>Small Poster</option> - <option value="${sbRoot}/setHomeLayout/?layout=banner" ${('', 'selected="selected"')[layout == 'banner']}>Banner</option> - <option value="${sbRoot}/setHomeLayout/?layout=simple" ${('', 'selected="selected"')[layout == 'simple']}>Simple</option> + <option value="${srRoot}/setHomeLayout/?layout=poster" ${('', 'selected="selected"')[layout == 'poster']}>Poster</option> + <option value="${srRoot}/setHomeLayout/?layout=small" ${('', 'selected="selected"')[layout == 'small']}>Small Poster</option> + <option value="${srRoot}/setHomeLayout/?layout=banner" ${('', 'selected="selected"')[layout == 'banner']}>Banner</option> + <option value="${srRoot}/setHomeLayout/?layout=simple" ${('', 'selected="selected"')[layout == 'simple']}>Simple</option> </select> % if layout != 'poster': Search: @@ -88,17 +85,17 @@ <span> Sort By: <select id="postersort" class="form-control form-control-inline input-sm"> - <option value="name" data-sort="${sbRoot}/setPosterSortBy/?sort=name" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'name']}>Name</option> - <option value="date" data-sort="${sbRoot}/setPosterSortBy/?sort=date" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'date']}>Next Episode</option> - <option value="network" data-sort="${sbRoot}/setPosterSortBy/?sort=network" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'network']}>Network</option> - <option value="progress" data-sort="${sbRoot}/setPosterSortBy/?sort=progress" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'progress']}>Progress</option> + <option value="name" data-sort="${srRoot}/setPosterSortBy/?sort=name" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'name']}>Name</option> + <option value="date" data-sort="${srRoot}/setPosterSortBy/?sort=date" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'date']}>Next Episode</option> + <option value="network" data-sort="${srRoot}/setPosterSortBy/?sort=network" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'network']}>Network</option> + <option value="progress" data-sort="${srRoot}/setPosterSortBy/?sort=progress" ${('', 'selected="selected"')[sickbeard.POSTER_SORTBY == 'progress']}>Progress</option> </select> </span> <span> Sort Order: <select id="postersortdirection" class="form-control form-control-inline input-sm"> - <option value="true" data-sort="${sbRoot}/setPosterSortDir/?direction=1" ${('', 'selected="selected"')[sickbeard.POSTER_SORTDIR == 1]}>Asc</option> - <option value="false" data-sort="${sbRoot}/setPosterSortDir/?direction=0" ${('', 'selected="selected"')[sickbeard.POSTER_SORTDIR == 0]}>Desc</option> + <option value="true" data-sort="${srRoot}/setPosterSortDir/?direction=1" ${('', 'selected="selected"')[sickbeard.POSTER_SORTDIR == 1]}>Asc</option> + <option value="false" data-sort="${srRoot}/setPosterSortDir/?direction=0" ${('', 'selected="selected"')[sickbeard.POSTER_SORTDIR == 0]}>Desc</option> </select> </span> @@ -118,7 +115,7 @@ % for curLoadingShow in sickbeard.showQueueScheduler.action.loadingShowList: % if curLoadingShow.show == None: <div class="show" data-name="0" data-date="010101" data-network="0" data-progress="101"> - <img alt="" title="${curLoadingShow.show_name}" class="show-image" style="border-bottom: 1px solid #111;" src="${sbRoot}/images/poster.png" /> + <img alt="" title="${curLoadingShow.show_name}" class="show-image" style="border-bottom: 1px solid #111;" src="${srRoot}/images/poster.png" /> <div class="show-details"> <div class="show-add">Loading... (${curLoadingShow.show_name})</div> </div> @@ -192,7 +189,7 @@ %> <div class="show" id="show${curShow.indexerid}" data-name="${curShow.name}" data-date="${data_date}" data-network="${curShow.network}" data-progress="${progressbar_percent}"> <div class="show-image"> - <a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}"><img alt="" class="show-image" src="${sbRoot}/showPoster/?show=${curShow.indexerid}&which=poster_thumb" /></a> + <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}"><img alt="" class="show-image" src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=poster_thumb" /></a> </div> <div class="progressbar hidden-print" style="position:relative;" data-show-id="${curShow.indexerid}" data-progress-percentage="${progressbar_percent}"></div> @@ -204,7 +201,6 @@ <div class="show-date"> % if cur_airs_next: <% ldatetime = sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(cur_airs_next, curShow.airs, curShow.network)) %> - <span class="${fuzzydate}"> <% try: out = str(sbdatetime.sbdatetime.sbfdate(ldatetime)) @@ -213,7 +209,6 @@ pass %> ${out} - </span> % else: <% output_html = '?' @@ -237,9 +232,9 @@ <td class="show-table"> % if layout != 'simple': % if curShow.network: - <span title="${curShow.network}"><img class="show-network-image" src="${sbRoot}/showPoster/?show=${curShow.indexerid}&which=network" alt="${curShow.network}" title="${curShow.network}" /></span> + <span title="${curShow.network}"><img class="show-network-image" src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=network" alt="${curShow.network}" title="${curShow.network}" /></span> % else: - <span title="No Network"><img class="show-network-image" src="${sbRoot}/images/network/nonetwork.png" alt="No Network" title="No Network" /></span> + <span title="No Network"><img class="show-network-image" src="${srRoot}/images/network/nonetwork.png" alt="No Network" title="No Network" /></span> % endif % else: <span title="${curShow.network}">${curShow.network}</span> @@ -278,7 +273,7 @@ <tfoot class="hidden-print"> <tr> - <th rowspan="1" colspan="1" align="center"><a href="${sbRoot}/home/addShows/">Add ${('Show', 'Anime')[curListType == 'Anime']}</a></th> + <th rowspan="1" colspan="1" align="center"><a href="${srRoot}/home/addShows/">Add ${('Show', 'Anime')[curListType == 'Anime']}</a></th> <th> </th> <th> </th> <th> </th> @@ -372,9 +367,7 @@ <% temp_sbfdate_next = sbdatetime.sbdatetime.sbfdate(ldatetime) %> <% temp_timegm_next = calendar.timegm(ldatetime.timetuple()) %> <td align="center" class="nowrap"> - <div class="${fuzzydate}"> - <time datetime="${ldatetime.isoformat('T')}" class="date">${temp_sbfdate_next}</time> - </div> + <time datetime="${ldatetime.isoformat('T')}" class="date">${temp_sbfdate_next}</time> <span class="sort_data">${temp_timegm_next}</span> </td> % except ValueError: @@ -390,9 +383,7 @@ <% temp_sbfdate_prev = sbdatetime.sbdatetime.sbfdate(pdatetime) %> <% temp_timegm_prev = calendar.timegm(pdatetime.timetuple()) %> <td align="center" class="nowrap"> - <div class="${fuzzydate}"> - <time datetime="${pdatetime.isoformat('T')}" class="date">${temp_sbfdate_prev}</time> - </div> + <time datetime="${pdatetime.isoformat('T')}" class="date">${temp_sbfdate_prev}</time> <span class="sort_data">${temp_timegm_prev}</span> </td> % except ValueError: @@ -405,31 +396,31 @@ % if layout == 'small': <td class="tvShow"> <div class="imgsmallposter ${layout}"> - <a href="${sbRoot}/showPoster/?show=${curShow.indexerid}&which=${layout}" rel="dialog" title="${curShow.name}"> - <img src="${sbRoot}/showPoster/?show=${curShow.indexerid}&which=poster_thumb" class="${layout}" alt="${curShow.indexerid}"/> + <a href="${srRoot}/showPoster/?show=${curShow.indexerid}&which=${layout}" rel="dialog" title="${curShow.name}"> + <img src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=poster_thumb" class="${layout}" alt="${curShow.indexerid}"/> </a> - <a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}" style="vertical-align: middle;">${curShow.name}</a> + <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}" style="vertical-align: middle;">${curShow.name}</a> </div> </td> % elif layout == 'banner': <td> <span style="display: none;">${curShow.name}</span> <div class="imgbanner ${layout}"> - <a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}"> - <img src="${sbRoot}/showPoster/?show=${curShow.indexerid}&which=banner" class="${layout}" alt="${curShow.indexerid}" title="${curShow.name}"/> + <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}"> + <img src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=banner" class="${layout}" alt="${curShow.indexerid}" title="${curShow.name}"/> </div> </td> % elif layout == 'simple': - <td class="tvShow"><a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td> + <td class="tvShow"><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td> % endif % if layout != 'simple': <td align="center"> % if curShow.network: - <span title="${curShow.network}" class="hidden-print"><img id="network" width="54" height="27" src="${sbRoot}/showPoster/?show=${curShow.indexerid}&which=network" alt="${curShow.network}" title="${curShow.network}" /></span> + <span title="${curShow.network}" class="hidden-print"><img id="network" width="54" height="27" src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=network" alt="${curShow.network}" title="${curShow.network}" /></span> <span class="visible-print-inline">${curShow.network}</span> % else: - <span title="No Network" class="hidden-print"><img id="network" width="54" height="27" src="${sbRoot}/images/network/nonetwork.png" alt="No Network" title="No Network" /></span> + <span title="No Network" class="hidden-print"><img id="network" width="54" height="27" src="${srRoot}/images/network/nonetwork.png" alt="No Network" title="No Network" /></span> <span class="visible-print-inline">No Network</span> % endif </td> @@ -453,7 +444,7 @@ <td align="center"> <% paused = int(curShow.paused) == 0 and curShow.status == 'Continuing' %> - <img src="${sbRoot}/images/${('no16.png', 'yes16.png')[bool(paused)]}" alt="${('No', 'Yes')[bool(paused)]}" width="16" height="16" /> + <img src="${srRoot}/images/${('no16.png', 'yes16.png')[bool(paused)]}" alt="${('No', 'Yes')[bool(paused)]}" width="16" height="16" /> </td> <td align="center"> diff --git a/gui/slick/views/home_addExistingShow.mako b/gui/slick/views/home_addExistingShow.mako index 1865363775befa5e872183ff2089ebc0b5ab50b5..2733d59359cd001346ea859ba215f89e3b23b948 100644 --- a/gui/slick/views/home_addExistingShow.mako +++ b/gui/slick/views/home_addExistingShow.mako @@ -2,19 +2,15 @@ <%! import sickbeard %> +<%block name="metas"> +<meta data-var="sickbeard.ROOT_DIRS" data-content="${sickbeard.ROOT_DIRS}"> +</%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/qualityChooser.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/addExistingShow.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/addShowOptions.js?${sbPID}"></script> -<script type="text/javascript" charset="utf-8"> -$(document).ready(function(){ - $( "#tabs" ).tabs({ - collapsible: true, - selected: '${('0', '-1')[bool(sickbeard.ROOT_DIRS)]}' - }); -}); -</script> +<script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/addExistingShow.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/addShowOptions.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/home_addExistingShow.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: @@ -29,7 +25,7 @@ $(document).ready(function(){ <div id="core-component-group1" class="tab-pane active component-group"> - <form id="addShowForm" method="post" action="${sbRoot}/home/addShows/addNewShow" accept-charset="utf-8"> + <form id="addShowForm" method="post" action="${srRoot}/home/addShows/addNewShow" accept-charset="utf-8"> <div id="tabs"> <ul> diff --git a/gui/slick/views/home_addShows.mako b/gui/slick/views/home_addShows.mako index 19fce35681ab61eb6bf88f310fed97a9c8cbd5f0..c06e1e2b4316674af9272148f64edb6a7eb96d1c 100644 --- a/gui/slick/views/home_addShows.mako +++ b/gui/slick/views/home_addShows.mako @@ -12,7 +12,7 @@ % endif <div id="addShowPortal"> - <a href="${sbRoot}/home/addShows/newShow/" id="btnNewShow" class="btn btn-large"> + <a href="${srRoot}/home/addShows/newShow/" id="btnNewShow" class="btn btn-large"> <div class="button"><div class="icon-addnewshow"></div></div> <div class="buttontext"> <h3>Add New Show</h3> @@ -22,7 +22,7 @@ <br/><br/> % if sickbeard.USE_TRAKT == True: - <a href="${sbRoot}/home/addShows/trendingShows/" id="btnNewShow" class="btn btn-large"> + <a href="${srRoot}/home/addShows/trendingShows/" id="btnNewShow" class="btn btn-large"> <div class="button"><div class="icon-addtrendingshow"></div></div> <div class="buttontext"> <h3>Add Trending Show</h3> @@ -32,7 +32,7 @@ <br/><br/> - <a href="${sbRoot}/home/addShows/recommendedShows/" id="btnNewShow" class="btn btn-large"> + <a href="${srRoot}/home/addShows/recommendedShows/" id="btnNewShow" class="btn btn-large"> <div class="button"><div class="icon-addrecommendedshow"></div></div> <div class="buttontext"> <h3>Add Recommended Shows</h3> @@ -43,7 +43,7 @@ <br/><br/> % endif - <a href="${sbRoot}/home/addShows/popularShows/" id="btnNewShow" class="btn btn-large"> + <a href="${srRoot}/home/addShows/popularShows/" id="btnNewShow" class="btn btn-large"> <div class="button"><div class="icon-addtrendingshow"></div></div> <div class="buttontext"> <h3>View Popular Shows</h3> @@ -53,7 +53,7 @@ <br/><br/> - <a href="${sbRoot}/home/addShows/existingShows/" id="btnExistingShow" class="btn btn-large"> + <a href="${srRoot}/home/addShows/existingShows/" id="btnExistingShow" class="btn btn-large"> <div class="button"><div class="icon-addexistingshow"></div></div> <div class="buttontext"> <h3>Add Existing Shows</h3> diff --git a/gui/slick/views/home_newShow.mako b/gui/slick/views/home_newShow.mako index 75f827b2898d70ecaa7017be07fe5920962671b9..4b982f2f590c16d012380db0dfd3c22991772049 100644 --- a/gui/slick/views/home_newShow.mako +++ b/gui/slick/views/home_newShow.mako @@ -4,13 +4,13 @@ from sickbeard.helpers import anon_url %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/formwizard.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/qualityChooser.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/newShow.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/addShowOptions.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/blackwhite.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/formwizard.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/newShow.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/addShowOptions.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/blackwhite.js?${sbPID}"></script> </%block> <%block name="content"> % if not header is UNDEFINED: @@ -30,7 +30,7 @@ <div id="displayText">aoeu</div> <br /> - <form id="addShowForm" method="post" action="${sbRoot}/home/addShows/addNewShow" accept-charset="utf-8"> + <form id="addShowForm" method="post" action="${srRoot}/home/addShows/addNewShow" accept-charset="utf-8"> <fieldset class="sectionwrap"> <legend class="legendStep">Find a show on theTVDB</legend> diff --git a/gui/slick/views/home_popularShows.mako b/gui/slick/views/home_popularShows.mako index 81128fa81f018e69cb349a53f62922be50e6176a..17fdc4498d61ac1fa1e1bf79393216d1150637c7 100644 --- a/gui/slick/views/home_popularShows.mako +++ b/gui/slick/views/home_popularShows.mako @@ -18,7 +18,7 @@ % for cur_result in popular_shows: <div class="popularShow"> <div class="left"> - <img class="coverImage" src="${sbRoot}/cache/${cur_result['image_path']}" /> + <img class="coverImage" src="${srRoot}/cache/${cur_result['image_path']}" /> </div> <div class="right"> <h3>${cur_result['name']}</h3> @@ -30,7 +30,7 @@ <p>${cur_result['outline']}<span class="year"> - Released ${cur_result['year']}<span></p> <span class="imdb_url"><a href="${anon_url(cur_result['imdb_url'])}">View on IMDB</a></span> | % if cur_result['imdb_tt'] not in imdb_tt: - <span class="imdb_sickrage_search"><a href="${sbRoot}/home/addShows/newShow/?search_string=${cur_result['name']}"> + <span class="imdb_sickrage_search"><a href="${srRoot}/home/addShows/newShow/?search_string=${cur_result['name']}"> Add Show</a></span> % else: <span> Already added </span> diff --git a/gui/slick/views/home_postprocess.mako b/gui/slick/views/home_postprocess.mako index 68faecceac061befbf41dcded1c7406c6faac44f..795c3d3cddafa387d8b9a14801068b37554ec5cb 100644 --- a/gui/slick/views/home_postprocess.mako +++ b/gui/slick/views/home_postprocess.mako @@ -3,9 +3,7 @@ import sickbeard %> <%block name="scripts"> -<script type="text/javascript"> - $('#episodeDir').fileBrowser({ title: 'Select Unprocessed Episode Folder', key: 'postprocessPath' }); -</script> +<script type="text/javascript" src="${srRoot}/js/new/home_postprocess.js"></script> </%block> <%block name="content"> <div id="content800"> diff --git a/gui/slick/views/home_recommendedShows.mako b/gui/slick/views/home_recommendedShows.mako index 89688574820db62705db25f8adb9bde7bb283800..a7f6c97517c2c789dda6974db02699b4644bd9de 100644 --- a/gui/slick/views/home_recommendedShows.mako +++ b/gui/slick/views/home_recommendedShows.mako @@ -2,74 +2,14 @@ <%! import sickbeard %> +<%block name="metas"> +<meta data-var="sickbeard.SORT_ARTICLE" data-content="${sickbeard.SORT_ARTICLE}"> +</%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/recommendedShows.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script> -<script type="text/javascript" charset="utf-8"> -$(document).ready(function(){ - $( "#tabs" ).tabs({ - collapsible: true, - selected: ${('0', '-1')[bool(sickbeard.ROOT_DIRS)]} - }); - - // initialise combos for dirty page refreshes - $('#showsort').val('original'); - $('#showsortdirection').val('asc'); - - var $container = [$('#container')]; - $.each($container, function (j) { - this.isotope({ - itemSelector: '.trakt_show', - sortBy: 'original-order', - layoutMode: 'fitRows', - getSortData: { - name: function( itemElem ) { - var name = $( itemElem ).attr('data-name') || ''; -% if not sickbeard.SORT_ARTICLE: - name = name.replace(/^(The|A|An)\s/i, ''); -% endif - return name.toLowerCase(); - }, - rating: '[data-rating] parseInt', - votes: '[data-votes] parseInt', - } - }); - }); - - $('#showsort').on( 'change', function() { - var sortCriteria; - switch (this.value) { - case 'original': - sortCriteria = 'original-order' - break; - case 'rating': - /* randomise, else the rating_votes can already - * have sorted leaving this with nothing to do. - */ - $('#container').isotope({sortBy: 'random'}); - sortCriteria = 'rating'; - break; - case 'rating_votes': - sortCriteria = ['rating', 'votes']; - break; - case 'votes': - sortCriteria = 'votes'; - break; - default: - sortCriteria = 'name' - break; - } - $('#container').isotope({sortBy: sortCriteria}); - }); - - $('#showsortdirection').on( 'change', function() { - $('#container').isotope({sortAscending: ('asc' == this.value)}); - }); -}); - -window.setInterval('location.reload(true)', 600000); // Refresh every 10 minutes -</script> +<script type="text/javascript" src="${srRoot}/js/recommendedShows.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/home_recommendedShows.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: diff --git a/gui/slick/views/home_trendingShows.mako b/gui/slick/views/home_trendingShows.mako index da97bd52feed048ebae3069fb19829d283e941d2..55c8dd0d253e2ba1d5291d8c14c9b6b8ea8c2f1d 100644 --- a/gui/slick/views/home_trendingShows.mako +++ b/gui/slick/views/home_trendingShows.mako @@ -12,10 +12,10 @@ <meta data-var="sickbeard.SORT_ARTICLE" data-content="${sickbeard.SORT_ARTICLE}"> </%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/addTrendingShow.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/rootDirs.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/new/home_trendingShows.js"></script> +<script type="text/javascript" src="${srRoot}/js/addTrendingShow.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/home_trendingShows.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: diff --git a/gui/slick/views/inc_addShowOptions.mako b/gui/slick/views/inc_addShowOptions.mako index 512a4b0acc018ff3a9c71a2c19e161f2016c3624..bfeb9b4653c54aa20618f28e1b5cbf3f9b737f90 100644 --- a/gui/slick/views/inc_addShowOptions.mako +++ b/gui/slick/views/inc_addShowOptions.mako @@ -21,7 +21,7 @@ <span class="component-title">Status for previously aired episodes</span> <span class="component-desc"> <select name="defaultStatus" id="statusSelect" class="form-control form-control-inline input-sm"> - % for curStatus in [SKIPPED, WANTED, ARCHIVED, IGNORED]: + % for curStatus in [SKIPPED, WANTED, IGNORED]: <option value="${curStatus}" ${('', 'selected="selected"')[sickbeard.STATUS_DEFAULT == curStatus]}>${statusStrings[curStatus]}</option> % endfor </select> @@ -33,7 +33,7 @@ <span class="component-title">Status for all future episodes</span> <span class="component-desc"> <select name="defaultStatusAfter" id="statusSelectAfter" class="form-control form-control-inline input-sm"> - % for curStatus in [SKIPPED, WANTED, ARCHIVED, IGNORED]: + % for curStatus in [SKIPPED, WANTED, IGNORED]: <option value="${curStatus}" ${('', 'selected="selected"')[sickbeard.STATUS_DEFAULT_AFTER == curStatus]}>${statusStrings[curStatus]}</option> % endfor </select> @@ -72,6 +72,16 @@ </label> </div> + <div class="field-pair alt"> + <label for="archive" class="clearfix"> + <span class="component-title">Archive first match</span> + <span class="component-desc"> + <input type="checkbox" name="archive" id="archive" ${('', 'checked="checked"')[bool(sickbeard.ARCHIVE_DEFAULT)]} /> + <p>Archive episodes after downloading first match?</p> + </span> + </label> + </div> + <% qualities = Quality.splitQuality(sickbeard.QUALITY_DEFAULT) %> <% anyQualities = qualities[0] %> <% bestQualities = qualities[1] %> diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index e7d3bc29b2b41634c14b67689ed04ab0043f6b18..4b2ee1e66b42489a2820581012f728c110f52b38 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -16,7 +16,7 @@ has_resource_module = False %> <% - sbRoot = sickbeard.WEB_ROOT + srRoot = sickbeard.WEB_ROOT %> <!DOCTYPE html> <html> @@ -40,38 +40,38 @@ <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> <meta name="msapplication-TileColor" content="#FFFFFF"> - <meta name="msapplication-TileImage" content="${sbRoot}/images/ico/favicon-144.png"> - <meta name="msapplication-config" content="${sbRoot}/css/browserconfig.xml"> + <meta name="msapplication-TileImage" content="${srRoot}/images/ico/favicon-144.png"> + <meta name="msapplication-config" content="${srRoot}/css/browserconfig.xml"> <meta data-var="sickbeard.FUZZY_DATING" data-content="${sickbeard.FUZZY_DATING}"> <%block name="metas" /> - <link rel="shortcut icon" href="${sbRoot}/images/ico/favicon.ico"> - <link rel="icon" sizes="16x16 32x32 64x64" href="${sbRoot}/images/ico/favicon.ico"> - <link rel="icon" type="image/png" sizes="196x196" href="${sbRoot}/images/ico/favicon-196.png"> - <link rel="icon" type="image/png" sizes="160x160" href="${sbRoot}/images/ico/favicon-160.png"> - <link rel="icon" type="image/png" sizes="96x96" href="${sbRoot}/images/ico/favicon-96.png"> - <link rel="icon" type="image/png" sizes="64x64" href="${sbRoot}/images/ico/favicon-64.png"> - <link rel="icon" type="image/png" sizes="32x32" href="${sbRoot}/images/ico/favicon-32.png"> - <link rel="icon" type="image/png" sizes="16x16" href="${sbRoot}/images/ico/favicon-16.png"> - <link rel="apple-touch-icon" sizes="152x152" href="${sbRoot}/images/ico/favicon-152.png"> - <link rel="apple-touch-icon" sizes="144x144" href="${sbRoot}/images/ico/favicon-144.png"> - <link rel="apple-touch-icon" sizes="120x120" href="${sbRoot}/images/ico/favicon-120.png"> - <link rel="apple-touch-icon" sizes="114x114" href="${sbRoot}/images/ico/favicon-114.png"> - <link rel="apple-touch-icon" sizes="76x76" href="${sbRoot}/images/ico/favicon-76.png"> - <link rel="apple-touch-icon" sizes="72x72" href="${sbRoot}/images/ico/favicon-72.png"> - <link rel="apple-touch-icon" href="${sbRoot}/images/ico/favicon-57.png"> + <link rel="shortcut icon" href="${srRoot}/images/ico/favicon.ico"> + <link rel="icon" sizes="16x16 32x32 64x64" href="${srRoot}/images/ico/favicon.ico"> + <link rel="icon" type="image/png" sizes="196x196" href="${srRoot}/images/ico/favicon-196.png"> + <link rel="icon" type="image/png" sizes="160x160" href="${srRoot}/images/ico/favicon-160.png"> + <link rel="icon" type="image/png" sizes="96x96" href="${srRoot}/images/ico/favicon-96.png"> + <link rel="icon" type="image/png" sizes="64x64" href="${srRoot}/images/ico/favicon-64.png"> + <link rel="icon" type="image/png" sizes="32x32" href="${srRoot}/images/ico/favicon-32.png"> + <link rel="icon" type="image/png" sizes="16x16" href="${srRoot}/images/ico/favicon-16.png"> + <link rel="apple-touch-icon" sizes="152x152" href="${srRoot}/images/ico/favicon-152.png"> + <link rel="apple-touch-icon" sizes="144x144" href="${srRoot}/images/ico/favicon-144.png"> + <link rel="apple-touch-icon" sizes="120x120" href="${srRoot}/images/ico/favicon-120.png"> + <link rel="apple-touch-icon" sizes="114x114" href="${srRoot}/images/ico/favicon-114.png"> + <link rel="apple-touch-icon" sizes="76x76" href="${srRoot}/images/ico/favicon-76.png"> + <link rel="apple-touch-icon" sizes="72x72" href="${srRoot}/images/ico/favicon-72.png"> + <link rel="apple-touch-icon" href="${srRoot}/images/ico/favicon-57.png"> - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/lib/bootstrap.min.css?${sbPID}"/> - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/browser.css?${sbPID}" /> - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/lib/jquery-ui-1.10.4.custom.min.css?${sbPID}" /> - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/lib/jquery.qtip-2.2.1.min.css?${sbPID}"/> - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/style.css?${sbPID}"/> - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/${sickbeard.THEME_NAME}.css?${sbPID}" /> - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/print.css?${sbPID}" /> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/bootstrap.min.css?${sbPID}"/> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/browser.css?${sbPID}" /> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/jquery-ui-1.10.4.custom.min.css?${sbPID}" /> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/jquery.qtip-2.2.1.min.css?${sbPID}"/> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/style.css?${sbPID}"/> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/${sickbeard.THEME_NAME}.css?${sbPID}" /> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/print.css?${sbPID}" /> % if sbLogin: - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/lib/pnotify.custom.min.css?${sbPID}" /> - <link rel="stylesheet" type="text/css" href="${sbRoot}/css/country-flags.css?${sbPID}"/> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/pnotify.custom.min.css?${sbPID}" /> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/country-flags.css?${sbPID}"/> % endif <%block name="css" /> </head> @@ -86,93 +86,93 @@ <span class="icon-bar"></span> <span class="icon-bar"></span> </button> - <a class="navbar-brand" href="${sbRoot}/home/" title="SickRage"><img alt="SickRage" src="${sbRoot}/images/sickrage.png" style="height: 50px;" class="img-responsive pull-left" /></a> + <a class="navbar-brand" href="${srRoot}/home/" title="SickRage"><img alt="SickRage" src="${srRoot}/images/sickrage.png" style="height: 50px;" class="img-responsive pull-left" /></a> </div> % if sbLogin: <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav navbar-right"> <li id="NAVnews" ${('', 'class="active"')[topmenu == 'news']}> - <a href="${sbRoot}/news/">News</a> + <a href="${srRoot}/news/">News</a> </li> <li id="NAVirc" ${('', 'class="active"')[topmenu == 'irc']}> - <a href="${sbRoot}/IRC/">IRC</a> + <a href="${srRoot}/IRC/">IRC</a> </li> <li id="NAVhome" ${('', 'class="active"')[topmenu == 'home']}> - <a href="${sbRoot}/home/">Shows</a> + <a href="${srRoot}/home/">Shows</a> </li> <li id="NAVcomingEpisodes" ${('', 'class="active"')[topmenu == 'comingEpisodes']}> - <a href="${sbRoot}/comingEpisodes/">Coming Episodes</a> + <a href="${srRoot}/comingEpisodes/">Coming Episodes</a> </li> <li id="NAVhistory" ${('', 'class="active"')[topmenu == 'history']}> - <a href="${sbRoot}/history/">History</a> + <a href="${srRoot}/history/">History</a> </li> <li id="NAVmanage" class="dropdown ${('', 'active')[topmenu == 'manage']}"> - <a href="${sbRoot}/manage/" class="dropdown-toggle" data-toggle="dropdown">Manage <b class="caret"></b></a> + <a href="${srRoot}/manage/" class="dropdown-toggle" data-toggle="dropdown">Manage <b class="caret"></b></a> <ul class="dropdown-menu"> - <li><a href="${sbRoot}/manage/"><i class="menu-icon-manage"></i> Mass Update</a></li> - <li><a href="${sbRoot}/manage/backlogOverview/"><i class="menu-icon-backlog-view"></i> Backlog Overview</a></li> - <li><a href="${sbRoot}/manage/manageSearches/"><i class="menu-icon-manage-searches"></i> Manage Searches</a></li> - <li><a href="${sbRoot}/manage/episodeStatuses/"><i class="menu-icon-backlog"></i> Episode Status Management</a></li> + <li><a href="${srRoot}/manage/"><i class="menu-icon-manage"></i> Mass Update</a></li> + <li><a href="${srRoot}/manage/backlogOverview/"><i class="menu-icon-backlog-view"></i> Backlog Overview</a></li> + <li><a href="${srRoot}/manage/manageSearches/"><i class="menu-icon-manage-searches"></i> Manage Searches</a></li> + <li><a href="${srRoot}/manage/episodeStatuses/"><i class="menu-icon-backlog"></i> Episode Status Management</a></li> % if sickbeard.USE_PLEX and sickbeard.PLEX_SERVER_HOST != "": - <li><a href="${sbRoot}/home/updatePLEX/"><i class="menu-icon-backlog-view"></i> Update PLEX</a></li> + <li><a href="${srRoot}/home/updatePLEX/"><i class="menu-icon-backlog-view"></i> Update PLEX</a></li> % endif % if sickbeard.USE_KODI and sickbeard.KODI_HOST != "": - <li><a href="${sbRoot}/home/updateKODI/"><i class="menu-icon-kodi"></i> Update KODI</a></li> + <li><a href="${srRoot}/home/updateKODI/"><i class="menu-icon-kodi"></i> Update KODI</a></li> % endif % if sickbeard.USE_EMBY and sickbeard.EMBY_HOST != "" and sickbeard.EMBY_APIKEY != "": - <li><a href="${sbRoot}/home/updateEMBY/"><i class="menu-icon-backlog-view"></i> Update Emby</a></li> + <li><a href="${srRoot}/home/updateEMBY/"><i class="menu-icon-backlog-view"></i> Update Emby</a></li> % endif % if sickbeard.USE_TORRENTS and sickbeard.TORRENT_METHOD != 'blackhole' and (sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'https' or not sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'http:'): - <li><a href="${sbRoot}/manage/manageTorrents/"><i class="menu-icon-bittorrent"></i> Manage Torrents</a></li> + <li><a href="${srRoot}/manage/manageTorrents/"><i class="menu-icon-bittorrent"></i> Manage Torrents</a></li> % endif % if sickbeard.USE_FAILED_DOWNLOADS: - <li><a href="${sbRoot}/manage/failedDownloads/"><i class="menu-icon-failed-download"></i> Failed Downloads</a></li> + <li><a href="${srRoot}/manage/failedDownloads/"><i class="menu-icon-failed-download"></i> Failed Downloads</a></li> % endif % if sickbeard.USE_SUBTITLES: - <li><a href="${sbRoot}/manage/subtitleMissed/"><i class="menu-icon-backlog"></i> Missed Subtitle Management</a></li> + <li><a href="${srRoot}/manage/subtitleMissed/"><i class="menu-icon-backlog"></i> Missed Subtitle Management</a></li> % endif </ul> </li> <li id="NAVerrorlogs" class="dropdown" ${('', 'class="active"')[topmenu == 'errorlogs']}> - <a href="${sbRoot}/errorlogs/" class="dropdown-toggle" data-toggle="dropdown">${logPageTitle} <b class="caret"></b></a> + <a href="${srRoot}/errorlogs/" class="dropdown-toggle" data-toggle="dropdown">${logPageTitle} <b class="caret"></b></a> <ul class="dropdown-menu"> - <li><a href="${sbRoot}/errorlogs/"><i class="menu-icon-viewlog-errors"></i> View Log (Errors)</a></li> - <li><a href="${sbRoot}/errorlogs/viewlog/"><i class="menu-icon-viewlog"></i> View Log</a></li> + <li><a href="${srRoot}/errorlogs/"><i class="menu-icon-viewlog-errors"></i> View Log (Errors)</a></li> + <li><a href="${srRoot}/errorlogs/viewlog/"><i class="menu-icon-viewlog"></i> View Log</a></li> </ul> </li> <li id="NAVconfig" class="dropdown" ${('', 'class="active"')[topmenu == 'config']}> - <a href="${sbRoot}/config/" class="dropdown-toggle" data-toggle="dropdown"><img src="${sbRoot}/images/menu/system18.png" class="navbaricon hidden-xs" /><b class="caret hidden-xs"></b><span class="visible-xs">Config <b class="caret"></b></span></a> + <a href="${srRoot}/config/" class="dropdown-toggle" data-toggle="dropdown"><img src="${srRoot}/images/menu/system18.png" class="navbaricon hidden-xs" /><b class="caret hidden-xs"></b><span class="visible-xs">Config <b class="caret"></b></span></a> <ul class="dropdown-menu"> - <li><a href="${sbRoot}/config/"><i class="menu-icon-help"></i> Help & Info</a></li> - <li><a href="${sbRoot}/config/general/"><i class="menu-icon-config"></i> General</a></li> - <li><a href="${sbRoot}/config/backuprestore/"><i class="menu-icon-config"></i> Backup & Restore</a></li> - <li><a href="${sbRoot}/config/search/"><i class="menu-icon-config"></i> Search Settings</a></li> - <li><a href="${sbRoot}/config/providers/"><i class="menu-icon-config"></i> Search Providers</a></li> - <li><a href="${sbRoot}/config/subtitles/"><i class="menu-icon-config"></i> Subtitles Settings</a></li> - <li><a href="${sbRoot}/config/postProcessing/"><i class="menu-icon-config"></i> Post Processing</a></li> - <li><a href="${sbRoot}/config/notifications/"><i class="menu-icon-config"></i> Notifications</a></li> - <li><a href="${sbRoot}/config/anime/"><i class="menu-icon-config"></i> Anime</a></li> + <li><a href="${srRoot}/config/"><i class="menu-icon-help"></i> Help & Info</a></li> + <li><a href="${srRoot}/config/general/"><i class="menu-icon-config"></i> General</a></li> + <li><a href="${srRoot}/config/backuprestore/"><i class="menu-icon-config"></i> Backup & Restore</a></li> + <li><a href="${srRoot}/config/search/"><i class="menu-icon-config"></i> Search Settings</a></li> + <li><a href="${srRoot}/config/providers/"><i class="menu-icon-config"></i> Search Providers</a></li> + <li><a href="${srRoot}/config/subtitles/"><i class="menu-icon-config"></i> Subtitles Settings</a></li> + <li><a href="${srRoot}/config/postProcessing/"><i class="menu-icon-config"></i> Post Processing</a></li> + <li><a href="${srRoot}/config/notifications/"><i class="menu-icon-config"></i> Notifications</a></li> + <li><a href="${srRoot}/config/anime/"><i class="menu-icon-config"></i> Anime</a></li> </ul> </li> <li class="dropdown"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown"><img src="${sbRoot}/images/menu/system18-2.png" class="navbaricon hidden-xs" /><b class="caret hidden-xs"></b><span class="visible-xs">System <b class="caret"></b></span></a> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"><img src="${srRoot}/images/menu/system18-2.png" class="navbaricon hidden-xs" /><b class="caret hidden-xs"></b><span class="visible-xs">System <b class="caret"></b></span></a> <ul class="dropdown-menu"> - <li><a href="${sbRoot}/home/updateCheck?pid=${sbPID}"><i class="menu-icon-update"></i> Check For Updates</a></li> - <li><a href="${sbRoot}/changes"><i class="menu-icon-help"></i> Changelog</a></li> - <li><a href="${sbRoot}/home/restart/?pid=${sbPID}" class="confirm restart"><i class="menu-icon-restart"></i> Restart</a></li> - <li><a href="${sbRoot}/home/shutdown/?pid=${sbPID}" class="confirm shutdown"><i class="menu-icon-shutdown"></i> Shutdown</a></li> - <li><a href="${sbRoot}/logout" class="confirm logout"><i class="menu-icon-shutdown"></i> Logout</a></li> - <li><a href="${sbRoot}/home/status/"><i class="menu-icon-help"></i> Server Status</a></li> + <li><a href="${srRoot}/home/updateCheck?pid=${sbPID}"><i class="menu-icon-update"></i> Check For Updates</a></li> + <li><a href="${srRoot}/changes"><i class="menu-icon-help"></i> Changelog</a></li> + <li><a href="${srRoot}/home/restart/?pid=${sbPID}" class="confirm restart"><i class="menu-icon-restart"></i> Restart</a></li> + <li><a href="${srRoot}/home/shutdown/?pid=${sbPID}" class="confirm shutdown"><i class="menu-icon-shutdown"></i> Shutdown</a></li> + <li><a href="${srRoot}/logout" class="confirm logout"><i class="menu-icon-shutdown"></i> Logout</a></li> + <li><a href="${srRoot}/home/status/"><i class="menu-icon-help"></i> Server Status</a></li> </ul> </li> - <li id="donate"><a href="https://github.com/SiCKRAGETV/SickRage/wiki/Donations" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href); return false;"><img src="${sbRoot}/images/donate.jpg" alt="[donate]" class="navbaricon hidden-xs" /></a></li> + <li id="donate"><a href="https://github.com/SiCKRAGETV/SickRage/wiki/Donations" rel="noreferrer" onclick="window.open('${sickbeard.ANON_REDIRECT}' + this.href); return false;"><img src="${srRoot}/images/donate.jpg" alt="[donate]" class="navbaricon hidden-xs" /></a></li> </ul> % endif </div><!-- /.navbar-collapse --> @@ -193,11 +193,11 @@ inner_first = True %> % for cur_link in menuItem['path']: - ${("· ", "")[bool(inner_first)]}<a class="inner" href="${sbRoot}/${menuItem['path'][cur_link]}">${cur_link}</a> + ${("· ", "")[bool(inner_first)]}<a class="inner" href="${srRoot}/${menuItem['path'][cur_link]}">${cur_link}</a> <% inner_first = False %> % endfor % else: - <a href="${sbRoot}/${menuItem['path']}" class="btn${('', (' confirm ' + menuItem.get('class', '')))['confirm' in menuItem]}">${('', '<span class="pull-left ' + icon_class + '"></span> ')[bool(icon_class)]}${menuItem['title']}</a> + <a href="${srRoot}/${menuItem['path']}" class="btn${('', (' confirm ' + menuItem.get('class', '')))['confirm' in menuItem]}">${('', '<span class="pull-left ' + icon_class + '"></span> ')[bool(icon_class)]}${menuItem['title']}</a> <% first = False %> % endif % endif @@ -230,7 +230,7 @@ myDB = db.DBConnection() today = str(datetime.date.today().toordinal()) status_quality = '(%s)' % ','.join([str(quality) for quality in Quality.SNATCHED + Quality.SNATCHED_PROPER]) - status_download = '(%s)' % ','.join([str(quality) for quality in Quality.DOWNLOADED + [ARCHIVED]]) + status_download = '(%s)' % ','.join([str(quality) for quality in Quality.DOWNLOADED + Quality.ARCHIVED]) sql_statement = 'SELECT ' \ + '(SELECT COUNT(*) FROM tv_episodes WHERE season > 0 AND episode > 0 AND airdate > 1 AND status IN %s) AS ep_snatched, ' % status_quality \ @@ -255,7 +255,7 @@ ep_percentage = '' if ep_total == 0 else '(<span class="footerhighlight">%s%%</span>)' % re.sub(r'(\d+)(\.\d)\d+', r'\1\2', str((float(ep_downloaded)/float(ep_total))*100)) try: - localRoot = sbRoot + localRoot = srRoot except NotFound: localRoot = '' @@ -285,46 +285,38 @@ </div> </div> </footer> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/bootstrap.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/bootstrap-hover-dropdown.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery-ui-1.10.4.custom.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.cookie.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.qtip-2.2.1.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/pnotify.custom.min.js"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.form-3.35.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.ui.touch-punch-0.2.2.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.confirm.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/script.js?${sbPID}"></script> - - % if sickbeard.FUZZY_DATING: - <script type="text/javascript" src="${sbRoot}/js/moment/moment.min.js?${sbPID}"></script> - <script type="text/javascript" src="${sbRoot}/js/fuzzyMoment.js?${sbPID}"></script> - % endif + <script type="text/javascript" src="${srRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/bootstrap.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/bootstrap-hover-dropdown.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery-ui-1.10.4.custom.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookie.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.qtip-2.2.1.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/pnotify.custom.min.js"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.form-3.35.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.ui.touch-punch-0.2.2.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.confirm.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.timeago.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/script.js?${sbPID}"></script> <script type="text/javascript"> - sbRoot = '${sbRoot}'; // needed for browser.js & ajaxNotifications.js + srRoot = '${srRoot}'; // needed for browser.js & ajaxNotifications.js //HTML for scrolltopcontrol, which is auto wrapped in DIV w/ ID="topcontrol" - top_image_html = '<img src="${sbRoot}/images/top.gif" width="31" height="11" alt="Jump to top" />'; + top_image_html = '<img src="${srRoot}/images/top.gif" width="31" height="11" alt="Jump to top" />'; themeSpinner = '${('', '-dark')[sickbeard.THEME_NAME == 'dark']}'; anonURL = '${sickbeard.ANON_REDIRECT}'; </script> - <script type="text/javascript" src="${sbRoot}/js/lib/jquery.scrolltopcontrol-1.1.js"></script> - <script type="text/javascript" src="${sbRoot}/js/browser.js"></script> - <script type="text/javascript" src="${sbRoot}/js/ajaxNotifications.js"></script> - <script type="text/javascript" src="${sbRoot}/js/confirmations.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/lib/jquery.scrolltopcontrol-1.1.js"></script> + <script type="text/javascript" src="${srRoot}/js/browser.js"></script> + <script type="text/javascript" src="${srRoot}/js/ajaxNotifications.js"></script> + <script type="text/javascript" src="${srRoot}/js/confirmations.js?${sbPID}"></script> % endif - <script type="text/javascript"> - $(document).ready(function() { - $('.dropdown-toggle').dropdownHover(); - }); - </script> <%block name="scripts" /> </body> </html> diff --git a/gui/slick/views/manage.mako b/gui/slick/views/manage.mako index 8d9c213dc7fd902331e7d50e4952981981f4931a..9aab23d0ad7d4e3284e6dbf40701319fdf7f8a04 100644 --- a/gui/slick/views/manage.mako +++ b/gui/slick/views/manage.mako @@ -5,9 +5,9 @@ from sickbeard.common import statusStrings %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/lib/bootbox.min.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/new/manage.js"></script> -<script type="text/javascript" src="${sbRoot}/js/massUpdate.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/lib/bootbox.min.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/manage.js"></script> +<script type="text/javascript" src="${srRoot}/js/massUpdate.js?${sbPID}"></script> </%block> <%block name="content"> <%namespace file="/inc_defs.mako" import="renderQualityPill"/> @@ -101,14 +101,14 @@ <% curRemove = "<input type=\"checkbox\" class=\"removeCheck\" id=\"remove-"+str(curShow.indexerid)+"\" "+curRemove_disabled+"/>" %> <tr> <td align="center"><input type="checkbox" class="editCheck" id="edit-${curShow.indexerid}" /></td> - <td class="tvShow"><a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td> + <td class="tvShow"><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td> <td align="center">${renderQualityPill(curShow.quality, showTitle=True)}</td> - <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_sports) == 1]} width="16" height="16" /></td> - <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_scene) == 1]} width="16" height="16" /></td> - <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_anime) == 1]} width="16" height="16" /></td> - <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.flatten_folders) == 1]} width="16" height="16" /></td> - <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.paused) == 1]} width="16" height="16" /></td> - <td align="center"><img src="${sbRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.subtitles) == 1]} width="16" height="16" /></td> + <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_sports) == 1]} width="16" height="16" /></td> + <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_scene) == 1]} width="16" height="16" /></td> + <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.is_anime) == 1]} width="16" height="16" /></td> + <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.flatten_folders) == 1]} width="16" height="16" /></td> + <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.paused) == 1]} width="16" height="16" /></td> + <td align="center"><img src="${srRoot}/images/${('no16.png" alt="N"', 'yes16.png" alt="Y"')[int(curShow.subtitles) == 1]} width="16" height="16" /></td> <td align="center">${statusStrings[curShow.default_ep_status]}</td> <td align="center">${curShow.status}</td> <td align="center">${curUpdate}</td> diff --git a/gui/slick/views/manage_backlogOverview.mako b/gui/slick/views/manage_backlogOverview.mako index 4065b16b61d4dbf01f1b4d1316307896dddb007b..5bdf25c59b91a37b0b53b1a5974de9b845b7dec7 100644 --- a/gui/slick/views/manage_backlogOverview.mako +++ b/gui/slick/views/manage_backlogOverview.mako @@ -5,30 +5,9 @@ from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED from sickbeard.common import Overview, Quality, qualityPresets, qualityPresetStrings from sickbeard import sbdatetime, network_timezones - - fuzzydate = 'airdate' %> <%block name="scripts"> <script type="text/javascript"> -$(document).ready(function(){ - $('#pickShow').change(function(){ - var id = $(this).val(); - if (id) { - $('html,body').animate({scrollTop: $('#show-' + id).offset().top -25},'slow'); - } - }); - - % if sickbeard.FUZZY_DATING: - fuzzyMoment({ - containerClass : '.${fuzzydate}', - dateHasTime : false, - dateFormat : '${sickbeard.DATE_PRESET}', - timeFormat : '${sickbeard.TIME_PRESET}', - trimZero : ${('False', 'True')[bool(sickbeard.TRIM_ZERO)]} - }); - % endif - -}); </script> </%block> <%block name="content"> @@ -72,11 +51,11 @@ Jump to Show % endif <tr class="seasonheader" id="show-${curShow.indexerid}"> <td colspan="3" class="align-left"> - <br/><h2><a href="${sbRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></h2> + <br/><h2><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></h2> <div class="pull-right"> <span class="listing-key wanted">Wanted: <b>${showCounts[curShow.indexerid][Overview.WANTED]}</b></span> <span class="listing-key qual">Low Quality: <b>${showCounts[curShow.indexerid][Overview.QUAL]}</b></span> - <a class="btn btn-inline forceBacklog" href="${sbRoot}/manage/backlogShow?indexer_id=${curShow.indexerid}"><i class="icon-play-circle icon-white"></i> Force Backlog</a> + <a class="btn btn-inline forceBacklog" href="${srRoot}/manage/backlogShow?indexer_id=${curShow.indexerid}"><i class="icon-play-circle icon-white"></i> Force Backlog</a> </div> </td> </tr> @@ -98,9 +77,17 @@ Jump to Show <tr class="seasonstyle ${Overview.overviewStrings[showCats[curShow.indexerid][whichStr]]}"> <td class="tableleft" align="center">${whichStr}</td> <td class="tableright" align="center" class="nowrap"> - <div class="${fuzzydate}">${curResult["name"]}</div> + ${curResult["name"]} + </td> + <% date = sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(curResult['airdate'], curShow.airs, curShow.network)) %> + <td> + % if int(curResult['airdate']) != 1: + <time datetime="${date.isoformat('T')}" class="date">${date}</time> + % else: + Never + % endif + <span class="sort_data">${date.isoformat('T')}</span> </td> - <td><div>${(sbdatetime.sbdatetime.sbfdate(sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(curResult['airdate'], curShow.airs, curShow.network))), 'never')[int(curResult['airdate']) == 1]}</div></td> </tr> % endfor % endfor diff --git a/gui/slick/views/manage_episodeStatuses.mako b/gui/slick/views/manage_episodeStatuses.mako index 1192b07fa98384b33e7d29d2431089eb5e61b5f7..1b4ffec630943ef4e413f81a6a9b0cdf8d6d6a90 100644 --- a/gui/slick/views/manage_episodeStatuses.mako +++ b/gui/slick/views/manage_episodeStatuses.mako @@ -5,7 +5,7 @@ %> <%block name="scripts"> % if whichStatus or (whichStatus and ep_counts): -<script type="text/javascript" src="${sbRoot}/js/manageEpisodeStatuses.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/manageEpisodeStatuses.js?${sbPID}"></script> % endif: </%block> <%block name="content"> @@ -23,9 +23,9 @@ <br /> % endif -<form action="${sbRoot}/manage/episodeStatuses" method="get"> +<form action="${srRoot}/manage/episodeStatuses" method="get"> Manage episodes with status <select name="whichStatus" class="form-control form-control-inline input-sm"> -% for curStatus in [common.SKIPPED, common.SNATCHED, common.WANTED, common.ARCHIVED, common.IGNORED] + common.Quality.ARCHIVED: +% for curStatus in [common.SKIPPED, common.SNATCHED, common.WANTED, common.IGNORED] + common.Quality.ARCHIVED: <option value="${curStatus}">${common.statusStrings[curStatus]}</option> % endfor </select> @@ -34,7 +34,7 @@ Manage episodes with status <select name="whichStatus" class="form-control form- % else: -<form action="${sbRoot}/manage/changeEpisodeStatuses" method="post"> +<form action="${srRoot}/manage/changeEpisodeStatuses" method="post"> <input type="hidden" id="oldStatus" name="oldStatus" value="${whichStatus}" /> <h2>Shows containing ${common.statusStrings[int(whichStatus)]} episodes</h2> @@ -56,7 +56,7 @@ Set checked shows/episodes to <select name="newStatus" class="form-control form- if int(whichStatus) in statusList: statusList.remove(int(whichStatus)) - if int(whichStatus) in [common.SNATCHED, common.SNATCHED_PROPER, common.SNATCHED_BEST] + common.Quality.DOWNLOADED and sickbeard.USE_FAILED_DOWNLOADS: + if int(whichStatus) in [common.SNATCHED, common.SNATCHED_PROPER, common.SNATCHED_BEST] + common.Quality.ARCHIVED + common.Quality.DOWNLOADED and sickbeard.USE_FAILED_DOWNLOADS: statusList.append(common.FAILED) %> @@ -78,7 +78,7 @@ Set checked shows/episodes to <select name="newStatus" class="form-control form- % for cur_indexer_id in sorted_show_ids: <tr id="${cur_indexer_id}"> <th><input type="checkbox" class="allCheck" id="allCheck-${cur_indexer_id}" name="${cur_indexer_id}-all"checked="checked" /></th> - <th colspan="2" style="width: 100%; text-align: left;"><a class="whitelink" href="${sbRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th> + <th colspan="2" style="width: 100%; text-align: left;"><a class="whitelink" href="${srRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th> </tr> % endfor </table> diff --git a/gui/slick/views/manage_failedDownloads.mako b/gui/slick/views/manage_failedDownloads.mako index b7149ccf7a1a0a8974699503adc4e3120b7b491d..759c930705ea555b1cea87f69385b94d9ded88f0 100644 --- a/gui/slick/views/manage_failedDownloads.mako +++ b/gui/slick/views/manage_failedDownloads.mako @@ -10,20 +10,8 @@ from sickbeard.common import Quality, qualityPresets, qualityPresetStrings, statusStrings, Overview %> <%block name="scripts"> -<script type="text/javascript"> -$(document).ready(function(){ - $("#failedTable:has(tbody tr)").tablesorter({ - widgets: ['zebra'], - sortList: [[0,0]], - headers: { 3: { sorter: false } } - }); - $('#limit').change(function(){ - url = '${sbRoot}/manage/failedDownloads/?limit='+$(this).val() - window.location.href = url - }); -}); -</script> -<script type="text/javascript" src="${sbRoot}/js/failedDownloads.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/manage_failedDownloads.js"></script> +<script type="text/javascript" src="${srRoot}/js/failedDownloads.js?${sbPID}"></script> </%block> <%block name="content"> % if not header is UNDEFINED: @@ -72,9 +60,9 @@ $(document).ready(function(){ <td align="center"> <% provider = providers.getProviderClass(generic.GenericProvider.makeID(hItem["provider"])) %> % if provider != None: - <img src="${sbRoot}/images/providers/${provider.imageName()}" width="16" height="16" alt="${provider.name}" title="${provider.name}"/> + <img src="${srRoot}/images/providers/${provider.imageName()}" width="16" height="16" alt="${provider.name}" title="${provider.name}"/> % else: - <img src="${sbRoot}/images/providers/missing.png" width="16" height="16" alt="missing provider" title="missing provider"/> + <img src="${srRoot}/images/providers/missing.png" width="16" height="16" alt="missing provider" title="missing provider"/> % endif </td> <td align="center">${curRemove}</td> diff --git a/gui/slick/views/manage_manageSearches.mako b/gui/slick/views/manage_manageSearches.mako index 647ed15f3d919edd30968447c470438fd513ecd2..78e3d36a79c87df0950a90d509cb00f96fd4554c 100644 --- a/gui/slick/views/manage_manageSearches.mako +++ b/gui/slick/views/manage_manageSearches.mako @@ -6,7 +6,7 @@ from sickbeard.common import Quality, qualityPresets, statusStrings, qualityPresetStrings, cpu_presets %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> </%block> <%block name="content"> <div id="content800"> @@ -18,8 +18,8 @@ <div id="summary2" class="align-left"> <h3>Backlog Search:</h3> -<a class="btn" href="${sbRoot}/manage/manageSearches/forceBacklog"><i class="icon-exclamation-sign"></i> Force</a> -<a class="btn" href="${sbRoot}/manage/manageSearches/pauseBacklog?paused=${('1', '0')[bool(backlogPaused)]}"><i class="icon-${('paused', 'play')[bool(backlogPaused)]}"></i> ${('pause', 'Unpause')[bool(backlogPaused)]}</a> +<a class="btn" href="${srRoot}/manage/manageSearches/forceBacklog"><i class="icon-exclamation-sign"></i> Force</a> +<a class="btn" href="${srRoot}/manage/manageSearches/pauseBacklog?paused=${('1', '0')[bool(backlogPaused)]}"><i class="icon-${('paused', 'play')[bool(backlogPaused)]}"></i> ${('pause', 'Unpause')[bool(backlogPaused)]}</a> % if not backlogRunning: Not in progress<br /> % else: @@ -29,12 +29,12 @@ <br /> <h3>Daily Search:</h3> -<a class="btn" href="${sbRoot}/manage/manageSearches/forceSearch"><i class="icon-exclamation-sign"></i> Force</a> +<a class="btn" href="${srRoot}/manage/manageSearches/forceSearch"><i class="icon-exclamation-sign"></i> Force</a> ${('Not in progress', 'In Progress')[dailySearchStatus]}<br /> <br /> <h3>Find Propers Search:</h3> -<a class="btn ${('disabled', '')[bool(sickbeard.DOWNLOAD_PROPERS)]}" href="${sbRoot}/manage/manageSearches/forceFindPropers"><i class="icon-exclamation-sign"></i> Force</a> +<a class="btn ${('disabled', '')[bool(sickbeard.DOWNLOAD_PROPERS)]}" href="${srRoot}/manage/manageSearches/forceFindPropers"><i class="icon-exclamation-sign"></i> Force</a> % if not sickbeard.DOWNLOAD_PROPERS: Propers search disabled <br /> % elif not findPropersStatus: diff --git a/gui/slick/views/manage_massEdit.mako b/gui/slick/views/manage_massEdit.mako index 19f5c0fa7beff0a38307a645ce71b6266acb567b..352311f17b40e9feb86730ff9214cbbc89f087d1 100644 --- a/gui/slick/views/manage_massEdit.mako +++ b/gui/slick/views/manage_massEdit.mako @@ -16,11 +16,9 @@ anyQualities, bestQualities = common.Quality.splitQuality(initial_quality) %> -<script type="text/javascript" src="${sbRoot}/js/qualityChooser.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/massEdit.js?${sbPID}"></script> -<script type="text/javascript" charset="utf-8"> - $('#location').fileBrowser({ title: 'Select Show Location' }); -</script> +<script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/massEdit.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/manage_massEdit.js"></script> </%block> <%block name="content"> <% @@ -133,7 +131,7 @@ <div class="selectChoices"> <select id="edit_default_ep_status" name="default_ep_status" class="form-control form-control-inline input-sm"> <option value="keep">< keep ></option> - % for curStatus in [WANTED, SKIPPED, ARCHIVED, IGNORED]: + % for curStatus in [WANTED, SKIPPED, IGNORED]: <option value="${curStatus}" ${('', 'selected="selected"')[curStatus == default_ep_status_value]}>${statusStrings[curStatus]}</option> % endfor </select> diff --git a/gui/slick/views/manage_subtitleMissed.mako b/gui/slick/views/manage_subtitleMissed.mako index 8a43b58d897f1b68c72e7341f09572bab9c2ae71..c5367207098f4366a1d6bbe99bf04f4630ef0eaf 100644 --- a/gui/slick/views/manage_subtitleMissed.mako +++ b/gui/slick/views/manage_subtitleMissed.mako @@ -6,7 +6,7 @@ from sickbeard import common %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/manageSubtitleMissed.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/manageSubtitleMissed.js?${sbPID}"></script> </%block> <%block name="content"> <div id="content960"> @@ -25,7 +25,7 @@ <br /> % endif -<form action="${sbRoot}/manage/subtitleMissed" method="get"> +<form action="${srRoot}/manage/subtitleMissed" method="get"> Manage episodes without <select name="whichSubs" class="form-control form-control-inline input-sm"> <option value="all">All</option> <% sub_langs = [subtitles.fromietf(x) for x in subtitles.wantedLanguages()] %> @@ -40,7 +40,7 @@ subtitles % else: <input type="hidden" id="selectSubLang" name="selectSubLang" value="${whichSubs}" /> -<form action="${sbRoot}/manage/downloadSubtitleMissed" method="post"> +<form action="${srRoot}/manage/downloadSubtitleMissed" method="post"> <h2>Episodes without ${subsLanguage} subtitles.</h2> <br /> Download missed subtitles for selected episodes <input class="btn btn-inline" type="submit" value="Go" /> @@ -53,7 +53,7 @@ Download missed subtitles for selected episodes <input class="btn btn-inline" ty % for cur_indexer_id in sorted_show_ids: <tr id="${cur_indexer_id}"> <th><input type="checkbox" class="allCheck" id="allCheck-${cur_indexer_id}" name="${cur_indexer_id}-all"checked="checked" /></th> - <th colspan="3" style="width: 100%; text-align: left;"><a class="whitelink" href="${sbRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th> + <th colspan="3" style="width: 100%; text-align: left;"><a class="whitelink" href="${srRoot}/home/displayShow?show=${cur_indexer_id}">${show_names[cur_indexer_id]}</a> (${ep_counts[cur_indexer_id]}) <input type="button" class="pull-right get_more_eps btn" id="${cur_indexer_id}" value="Expand" /></th> </tr> % endfor </table> diff --git a/gui/slick/views/manage_torrents.mako b/gui/slick/views/manage_torrents.mako index 4754c8cf968321f7a2d22eba1e38565c58364c6b..b4a95fa31035ab0fb650a1c0bb7e792101646e31 100644 --- a/gui/slick/views/manage_torrents.mako +++ b/gui/slick/views/manage_torrents.mako @@ -1,6 +1,6 @@ <%inherit file="/layouts/main.mako"/> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/plotTooltip.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> </%block> <%block name="content"> % if not header is UNDEFINED: diff --git a/gui/slick/views/restart.mako b/gui/slick/views/restart.mako index d43038c53e48e2110727e0ef27c27c8858fb2d2c..67510c016e01f8d415b6389602de236b20886b7c 100644 --- a/gui/slick/views/restart.mako +++ b/gui/slick/views/restart.mako @@ -15,15 +15,15 @@ themeSpinner = sickbeard.THEME_NAME %> <script type="text/javascript" charset="utf-8"> -sbRoot = "${sbRoot}"; +srRoot = "${srRoot}"; sbHttpPort = "${curSBHttpPort}"; sbHttpsEnabled = "${curSBHttpsEnabled}"; sbHandleReverseProxy = "${curSBHandleReverseProxy}"; sbHost = "${curSBHost}"; sbDefaultPage = "${sbDefaultPage}"; </script> -<script type="text/javascript" src="${sbRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/restart.js?${sbPID}&${sbDefaultPage}"></script> +<script type="text/javascript" src="${srRoot}/js/lib/jquery-1.11.2.min.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/restart.js?${sbPID}&${sbDefaultPage}"></script> </%block> <%block name="css"> <style> @@ -52,20 +52,20 @@ sbDefaultPage = "${sbDefaultPage}"; <br /> <div id="shut_down_message"> Waiting for SickRage to shut down: -<img src="${sbRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="shut_down_loading" /> -<img src="${sbRoot}/images/yes16.png" height="16" width="16" id="shut_down_success" style="display: none;" /> +<img src="${srRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="shut_down_loading" /> +<img src="${srRoot}/images/yes16.png" height="16" width="16" id="shut_down_success" style="display: none;" /> </div> <div id="restart_message" style="display: none;"> Waiting for SickRage to start again: -<img src="${sbRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="restart_loading" /> -<img src="${sbRoot}/images/yes16.png" height="16" width="16" id="restart_success" style="display: none;" /> -<img src="${sbRoot}/images/no16.png" height="16" width="16" id="restart_failure" style="display: none;" /> +<img src="${srRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="restart_loading" /> +<img src="${srRoot}/images/yes16.png" height="16" width="16" id="restart_success" style="display: none;" /> +<img src="${srRoot}/images/no16.png" height="16" width="16" id="restart_failure" style="display: none;" /> </div> <div id="refresh_message" style="display: none;"> Loading the default page: -<img src="${sbRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="refresh_loading" /> +<img src="${srRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="refresh_loading" /> </div> <div id="restart_fail_message" style="display: none;"> diff --git a/gui/slick/views/status.mako b/gui/slick/views/status.mako index 818f76144004df2ee6b465b4b6ec47ee367f40fe..443ae18bedf53b4362fd5020007a92ca57f46775 100644 --- a/gui/slick/views/status.mako +++ b/gui/slick/views/status.mako @@ -6,17 +6,7 @@ from sickrage.helper.common import dateTimeFormat %> <%block name="scripts"> -<script type="text/javascript"> - $(document).ready(function() { - $("#schedulerStatusTable").tablesorter({ - widgets: ['saveSort', 'zebra'] - }); - $("#queueStatusTable").tablesorter({ - widgets: ['saveSort', 'zebra'], - sortList: [[3,0], [4,0], [2,1]] - }); - }); -</script> +<script type="text/javascript" src="${srRoot}/js/new/status.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: diff --git a/gui/slick/views/testRename.mako b/gui/slick/views/testRename.mako index 08539495e69789a1f686d4bb661bee4cf417023d..f7410d50049bb48c8330fefecf96f3d14c3c7d73 100644 --- a/gui/slick/views/testRename.mako +++ b/gui/slick/views/testRename.mako @@ -9,7 +9,7 @@ import re %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/testRename.js"></script> +<script type="text/javascript" src="${srRoot}/js/testRename.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: diff --git a/gui/slick/views/trendingShows.mako b/gui/slick/views/trendingShows.mako index 55c227204d4f1fa8380637d4804fe8b8b0a320ed..54e196ab23ad9ef147188b124987e5d6145a7ae1 100644 --- a/gui/slick/views/trendingShows.mako +++ b/gui/slick/views/trendingShows.mako @@ -12,7 +12,7 @@ <meta data-var="sickbeard.SORT_ARTICLE" data-content="${sickbeard.SORT_ARTICLE}"> </%block> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/new/trendingShows.js"></script> +<script type="text/javascript" src="${srRoot}/js/new/trendingShows.js"></script> </%block> <%block name="content"> <div id="container"> @@ -35,12 +35,12 @@ </div> <div class="clearfix"> - <p>${int(cur_show['show']['rating']*10)}% <img src="${sbRoot}/images/heart.png"></p> + <p>${int(cur_show['show']['rating']*10)}% <img src="${srRoot}/images/heart.png"></p> <i>${cur_show['show']['votes']} votes</i> <div class="traktShowTitleIcons"> - <a href="${sbRoot}/home/addShows/addTraktShow?indexer_id=${cur_show['show']['ids']['tvdb']}&showName=${cur_show['show']['title']}" class="btn btn-xs">Add Show</a> + <a href="${srRoot}/home/addShows/addTraktShow?indexer_id=${cur_show['show']['ids']['tvdb']}&showName=${cur_show['show']['title']}" class="btn btn-xs">Add Show</a> % if blacklist: - <a href="${sbRoot}/home/addShows/addShowToBlacklist?indexer_id=${cur_show['show']['ids']['tvdb'] or cur_show['show']['ids']['tvrage']}" class="btn btn-xs">Remove Show</a> + <a href="${srRoot}/home/addShows/addShowToBlacklist?indexer_id=${cur_show['show']['ids']['tvdb'] or cur_show['show']['ids']['tvrage']}" class="btn btn-xs">Remove Show</a> % endif </div> </div> diff --git a/gui/slick/views/viewlogs.mako b/gui/slick/views/viewlogs.mako index 7037ddcf8b5a17daba7f8b65d0c0205e70f0e34b..c6c809cd8efcd6c9c8450b8f9f4c3dc97c03d6fa 100644 --- a/gui/slick/views/viewlogs.mako +++ b/gui/slick/views/viewlogs.mako @@ -5,7 +5,7 @@ from sickbeard.logger import reverseNames %> <%block name="scripts"> -<script type="text/javascript" src="${sbRoot}/js/new/viewlogs.js"></script> +<script type="text/javascript" src="${srRoot}/js/new/viewlogs.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: diff --git a/lib/lockfile/__init__.py b/lib/lockfile/__init__.py index d905af961b9e3f41045512dc512f6d46e5a3d0ad..04b23503cfd8b8c1373490a695881dd8370d6e0d 100644 --- a/lib/lockfile/__init__.py +++ b/lib/lockfile/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """ lockfile.py - Platform-independent advisory file locks. @@ -68,7 +70,7 @@ if not hasattr(threading.Thread, "get_name"): __all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', - 'LinkLockFile', 'MkdirLockFile', 'SQLiteLockFile', + 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', 'LockBase', 'locked'] class Error(Exception): @@ -154,14 +156,58 @@ class NotMyLock(UnlockError): """ pass -class LockBase: +class _SharedBase(object): + def __init__(self, path): + self.path = path + + def acquire(self, timeout=None): + """ + Acquire the lock. + + * If timeout is omitted (or None), wait forever trying to lock the + file. + + * If timeout > 0, try to acquire the lock for that many seconds. If + the lock period expires and the file is still locked, raise + LockTimeout. + + * If timeout <= 0, raise AlreadyLocked immediately if the file is + already locked. + """ + raise NotImplemented("implement in subclass") + + def release(self): + """ + Release the lock. + + If the file is not locked, raise NotLocked. + """ + raise NotImplemented("implement in subclass") + + def __enter__(self): + """ + Context manager support. + """ + self.acquire() + return self + + def __exit__(self, *_exc): + """ + Context manager support. + """ + self.release() + + def __repr__(self): + return "<%s: %r>" % (self.__class__.__name__, self.path) + +class LockBase(_SharedBase): """Base class for platform-specific lock classes.""" def __init__(self, path, threaded=True, timeout=None): """ >>> lock = LockBase('somefile') >>> lock = LockBase('somefile', threaded=False) """ - self.path = path + super(LockBase, self).__init__(path) self.lock_file = os.path.abspath(path) + ".lock" self.hostname = socket.gethostname() self.pid = os.getpid() @@ -189,30 +235,6 @@ class LockBase: hash(self.path))) self.timeout = timeout - def acquire(self, timeout=None): - """ - Acquire the lock. - - * If timeout is omitted (or None), wait forever trying to lock the - file. - - * If timeout > 0, try to acquire the lock for that many seconds. If - the lock period expires and the file is still locked, raise - LockTimeout. - - * If timeout <= 0, raise AlreadyLocked immediately if the file is - already locked. - """ - raise NotImplemented("implement in subclass") - - def release(self): - """ - Release the lock. - - If the file is not locked, raise NotLocked. - """ - raise NotImplemented("implement in subclass") - def is_locked(self): """ Tell whether or not the file is locked. @@ -231,19 +253,6 @@ class LockBase: """ raise NotImplemented("implement in subclass") - def __enter__(self): - """ - Context manager support. - """ - self.acquire() - return self - - def __exit__(self, *_exc): - """ - Context manager support. - """ - self.release() - def __repr__(self): return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, self.path) diff --git a/lib/lockfile/linklockfile.py b/lib/lockfile/linklockfile.py index 770350f2ee8860844a3b41a84f8b7a97202d830b..ab5e1f21e18a36fb47d6599ef47c48709e34439e 100644 --- a/lib/lockfile/linklockfile.py +++ b/lib/lockfile/linklockfile.py @@ -5,7 +5,6 @@ import os from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, AlreadyLocked) -import errno class LinkLockFile(LockBase): """Lock access to a file using atomic property of link(2). @@ -20,7 +19,7 @@ class LinkLockFile(LockBase): except IOError: raise LockFailed("failed to create %s" % self.unique_name) - timeout = timeout is not None and timeout or self.timeout + timeout = timeout if timeout is not None else self.timeout end_time = time.time() if timeout is not None and timeout > 0: end_time += timeout @@ -29,9 +28,7 @@ class LinkLockFile(LockBase): # Try and create a hard link to it. try: os.link(self.unique_name, self.lock_file) - except OSError as e: - if e.errno == errno.ENOSYS: - raise LockFailed("%s" % e.strerror) + except OSError: # Link creation failed. Maybe we've double-locked? nlinks = os.stat(self.unique_name).st_nlink if nlinks == 2: diff --git a/lib/lockfile/mkdirlockfile.py b/lib/lockfile/mkdirlockfile.py index 8d2c801f9dc3d8a1f8adbbf9fa399e1b3b0d3e7b..caf462e8408d5e67e3ee086c38b64b66be2b8bc4 100644 --- a/lib/lockfile/mkdirlockfile.py +++ b/lib/lockfile/mkdirlockfile.py @@ -24,7 +24,7 @@ class MkdirLockFile(LockBase): self.pid)) def acquire(self, timeout=None): - timeout = timeout is not None and timeout or self.timeout + timeout = timeout if timeout is not None else self.timeout end_time = time.time() if timeout is not None and timeout > 0: end_time += timeout diff --git a/lib/lockfile/pidlockfile.py b/lib/lockfile/pidlockfile.py index e92f9eadcd497fa653ec1ff72e7552e499e6fac5..c4c8a39adb940b6e0ee98cb4e6ebe661aed2f9de 100644 --- a/lib/lockfile/pidlockfile.py +++ b/lib/lockfile/pidlockfile.py @@ -70,7 +70,7 @@ class PIDLockFile(LockBase): the lock could not be acquired. """ - timeout = timeout is not None and timeout or self.timeout + timeout = timeout if timeout is not None else self.timeout end_time = time.time() if timeout is not None and timeout > 0: end_time += timeout @@ -81,8 +81,8 @@ class PIDLockFile(LockBase): except OSError as exc: if exc.errno == errno.EEXIST: # The lock creation failed. Maybe sleep a bit. - if timeout is not None and time.time() > end_time: - if timeout > 0: + if time.time() > end_time: + if timeout is not None and timeout > 0: raise LockTimeout("Timeout waiting to acquire" " lock for %s" % self.path) diff --git a/lib/lockfile/sqlitelockfile.py b/lib/lockfile/sqlitelockfile.py index 7dee4a851df16058ec18d60f3faf8e04677af9ec..734ce0308bf71193fa76ce8b7ffea1b1384c77e4 100644 --- a/lib/lockfile/sqlitelockfile.py +++ b/lib/lockfile/sqlitelockfile.py @@ -50,7 +50,7 @@ class SQLiteLockFile(LockBase): atexit.register(os.unlink, SQLiteLockFile.testdb) def acquire(self, timeout=None): - timeout = timeout is not None and timeout or self.timeout + timeout = timeout if timeout is not None else self.timeout end_time = time.time() if timeout is not None and timeout > 0: end_time += timeout diff --git a/lib/lockfile/symlinklockfile.py b/lib/lockfile/symlinklockfile.py index 57551a36485363c3bd9776e4b5baf23905292e11..b5dd71f857580b05fa6132f414c1adc9580f730c 100644 --- a/lib/lockfile/symlinklockfile.py +++ b/lib/lockfile/symlinklockfile.py @@ -21,7 +21,7 @@ class SymlinkLockFile(LockBase): # open(self.unique_name, "wb").close() #except IOError: # raise LockFailed("failed to create %s" % self.unique_name) - timeout = timeout is not None and timeout or self.timeout + timeout = timeout if timeout is not None else self.timeout end_time = time.time() if timeout is not None and timeout > 0: end_time += timeout diff --git a/lib/pkg_resources.py b/lib/pkg_resources.py index 79db00b8c28de9ba8cd82d242a6150c820cbf31c..269398d7e754e53d6729414808413571f0a4566b 100644 --- a/lib/pkg_resources.py +++ b/lib/pkg_resources.py @@ -218,8 +218,12 @@ def get_build_platform(): XXX Currently this is the same as ``distutils.util.get_platform()``, but it needs some hacks for Linux and Mac OS X. """ - from distutils.util import get_platform - plat = get_platform() + try: + from distutils.util import get_platform + plat = get_platform() + except ImportError: + import platform + plat = platform.platform() if sys.platform == "darwin" and not plat.startswith('macosx-'): try: version = _macosx_vers() diff --git a/lib/tvdb_api/tvdb_api.py b/lib/tvdb_api/tvdb_api.py index de06dd88053334f96ca93f01ab5a89c4bf00cc3d..bf0180303a1a92e991c1f9c153929a06beea91f4 100644 --- a/lib/tvdb_api/tvdb_api.py +++ b/lib/tvdb_api/tvdb_api.py @@ -566,7 +566,7 @@ class Tvdb: # get response from TVDB if self.config['cache_enabled']: - session = CacheControl(sess=self.config['session'], cache=caches.FileCache(self.config['cache_location']), cache_etags=False) + session = CacheControl(sess=self.config['session'], cache=caches.FileCache(self.config['cache_location'], use_dir_lock=True), cache_etags=False) if self.config['proxy']: log().debug("Using proxy for URL: %s" % url) session.proxies = { diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 58defa1636bac444429e7056fec168cbd75bd1c4..4124b784b1cf139484292645af7dd01af07824be 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -39,7 +39,7 @@ from sickbeard import providers from sickbeard.providers.generic import GenericProvider from sickbeard.providers import btn, newznab, womble, thepiratebay, torrentleech, kat, iptorrents, \ omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, nextgen, speedcd, nyaatorrents, animenzb, bluetigers, cpasbien, fnt, xthor, torrentbytes, \ - frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, \ + frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, torrentproject, \ scenetime, btdigg, strike, transmitthenet, tvchaosuk from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, \ naming_ep_type @@ -212,6 +212,7 @@ INDEXER_DEFAULT = None INDEXER_TIMEOUT = None SCENE_DEFAULT = False ANIME_DEFAULT = False +ARCHIVE_DEFAULT = False PROVIDER_ORDER = [] NAMING_MULTI_EP = False @@ -600,7 +601,7 @@ def initialize(consoleLogging=True): USE_FAILED_DOWNLOADS, DELETE_FAILED, ANON_REDIRECT, LOCALHOST_IP, TMDB_API_KEY, DEBUG, DEFAULT_PAGE, PROXY_SETTING, PROXY_INDEXERS, \ AUTOPOSTPROCESSER_FREQUENCY, SHOWUPDATE_HOUR, DEFAULT_AUTOPOSTPROCESSER_FREQUENCY, MIN_AUTOPOSTPROCESSER_FREQUENCY, \ ANIME_DEFAULT, NAMING_ANIME, ANIMESUPPORT, USE_ANIDB, ANIDB_USERNAME, ANIDB_PASSWORD, ANIDB_USE_MYLIST, \ - ANIME_SPLIT_HOME, SCENE_DEFAULT, DOWNLOAD_URL, BACKLOG_DAYS, GIT_ORG, GIT_REPO, GIT_USERNAME, GIT_PASSWORD, \ + ANIME_SPLIT_HOME, SCENE_DEFAULT, ARCHIVE_DEFAULT, DOWNLOAD_URL, BACKLOG_DAYS, GIT_ORG, GIT_REPO, GIT_USERNAME, GIT_PASSWORD, \ GIT_AUTOISSUES, DEVELOPER, gh, DISPLAY_ALL_SEASONS, SSL_VERIFY if __INITIALIZED__: @@ -806,6 +807,7 @@ def initialize(consoleLogging=True): INDEXER_TIMEOUT = check_setting_int(CFG, 'General', 'indexer_timeout', 20) ANIME_DEFAULT = bool(check_setting_int(CFG, 'General', 'anime_default', 0)) SCENE_DEFAULT = bool(check_setting_int(CFG, 'General', 'scene_default', 0)) + ARCHIVE_DEFAULT = bool(check_setting_int(CFG, 'General', 'archive_default', 0)) PROVIDER_ORDER = check_setting_str(CFG, 'General', 'provider_order', '').split() @@ -1668,6 +1670,7 @@ def save_config(): new_config['General']['indexer_timeout'] = int(INDEXER_TIMEOUT) new_config['General']['anime_default'] = int(ANIME_DEFAULT) new_config['General']['scene_default'] = int(SCENE_DEFAULT) + new_config['General']['archive_default'] = int(ARCHIVE_DEFAULT) new_config['General']['provider_order'] = ' '.join(PROVIDER_ORDER) new_config['General']['version_notify'] = int(VERSION_NOTIFY) new_config['General']['auto_update'] = int(AUTO_UPDATE) diff --git a/sickbeard/common.py b/sickbeard/common.py index 92703e7aa940a105c865ce9d0fcdfa1c0c90fc03..c96d6d24a7b65e2e9f0b49c80adeb7b0b37674fc 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -268,7 +268,7 @@ class Quality: if checkName([r"(pdtv|hd.?tv|dsr|tvrip).(xvid|x26[45]|h.?26[45])"], all) and not checkName([r"(720|1080)[pi]"], all) and\ not checkName([r"hr.ws.pdtv.x26[45]"], any): ret = Quality.SDTV - elif checkName([r"web.dl|webrip", r"xvid|x26[45]|h.?26[45]"], all) and not checkName([r"(720|1080)[pi]"], all): + elif checkName([r"web.?dl|webrip", r"xvid|x26[45]|h.?26[45]"], all) and not checkName([r"(720|1080)[pi]"], all): ret = Quality.SDTV elif checkName([r"(dvdrip|b[rd]rip|blue?-?ray)(.ws)?.(xvid|divx|x26[45])"], any) and not checkName([r"(720|1080)[pi]"], all): ret = Quality.SDDVD @@ -360,8 +360,8 @@ class Quality: return Quality.UNKNOWN base_filename = os.path.basename(filename) - bluray = re.search(r'blue?-?ray', base_filename, re.I) is not None - webdl = re.search(r'web-?dl', base_filename, re.I) is not None + bluray = re.search(r'b[rd]rip|blue?-?ray', base_filename, re.I) is not None + webdl = re.search(r'web.?dl|webrip', base_filename, re.I) is not None ret = Quality.UNKNOWN if height > 1000: @@ -369,7 +369,7 @@ class Quality: elif height > 680 and height < 800: ret = ((Quality.HDTV, Quality.HDBLURAY)[bluray], Quality.HDWEBDL)[webdl] elif height < 680: - ret = (Quality.SDTV, Quality.SDDVD)[re.search(r'dvd', base_filename, re.I) is not None] + ret = (Quality.SDTV, Quality.SDDVD)[re.search(r'dvd|b[rd]rip|blue?-?ray', base_filename, re.I) is not None] return ret @@ -459,19 +459,23 @@ class StatusStrings: FAILED: "Failed", SNATCHED_BEST: "Snatched (Best)"} - def __getitem__(self, name): - if name in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED: - status, quality = Quality.splitCompositeStatus(name) + def __getitem__(self, key): + key = int(key) + if key in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED: + status, quality = Quality.splitCompositeStatus(key) if quality == Quality.NONE: return self.statusStrings[status] else: return self.statusStrings[status] + " (" + Quality.qualityStrings[quality] + ")" else: - return self.statusStrings[name] if self.statusStrings.has_key(name) else '' + return self.statusStrings[key] if self.statusStrings.has_key(key) else '' - def has_key(self, name): - return name in self.statusStrings or name in Quality.DOWNLOADED or name in Quality.SNATCHED or name in Quality.SNATCHED_PROPER or name in Quality.SNATCHED_BEST + def has_key(self, key): + key = int(key) + return key in self.statusStrings or key in Quality.DOWNLOADED + Quality.ARCHIVED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + def __contains__(self, key): + return self.has_key(key) statusStrings = StatusStrings() diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 40012f5d5f0348abb1c91cfa0ea02d8c6f5b4d0d..cbe45a0bf599a6a09589e251debd60a2d767ce7d 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -27,7 +27,7 @@ from sickbeard.name_parser.parser import NameParser, InvalidNameException, Inval from sickrage.helper.common import dateTimeFormat from sickrage.helper.encoding import ek -from babelfish import language_converters +from babelfish import language_converters, Language MIN_DB_VERSION = 9 # oldest db version we support migrating from MAX_DB_VERSION = 42 @@ -241,6 +241,8 @@ class MainSanityCheck(db.DBSanityCheck): "SELECT subtitles, episode_id FROM tv_episodes WHERE subtitles != '' AND subtitles_lastsearch < ?;", [datetime.datetime(2015, 7, 15, 17, 20, 44, 326380).strftime(dateTimeFormat)]) + validLanguages = [Language.fromopensubtitles(language).opensubtitles for language in language_converters['opensubtitles'].codes if len(language) == 3] + if not sqlResults: return @@ -251,7 +253,7 @@ class MainSanityCheck(db.DBSanityCheck): (sqlResult['episode_id'], sqlResult['subtitles']), logger.DEBUG) for subcode in sqlResult['subtitles'].split(','): - if not len(subcode) is 3 or not subcode in language_converters['opensubtitles'].codes: + if not len(subcode) is 3 or not subcode in validLanguages: logger.log("Fixing subtitle codes for episode_id: %s, invalid code: %s" % (sqlResult['episode_id'], subcode), logger.DEBUG) continue diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 08a42bad346bfbc241cabe2bfc6fb3ee0544e7af..8e1738be846f2933440235f64fbaae4ad91546b2 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -117,6 +117,7 @@ def remove_extension(name): """ if name and "." in name: + # pylint: disable=W0612 base_name, sep, extension = name.rpartition('.') # @UnusedVariable if base_name and extension.lower() in ['nzb', 'torrent'] + mediaExtensions: name = base_name @@ -136,37 +137,37 @@ def remove_non_release_groups(name): # Check your database for funky release_names and add them here, to improve failed handling, archiving, and history. # select release_name from tv_episodes WHERE LENGTH(release_name); # [eSc], [SSG], [GWC] are valid release groups for non-anime - removeWordsList = {'\[rartv\]$': 'searchre', - '\[rarbg\]$': 'searchre', - '\[eztv\]$': 'searchre', - '\[ettv\]$': 'searchre', - '\[vtv\]$': 'searchre', - '\[GloDLS\]$': 'searchre', - '\[silv4\]$': 'searchre', - '\[Seedbox\]$': 'searchre', - '\[AndroidTwoU\]$': 'searchre', - '\.\[BT\]$': 'searchre', - ' \[1044\]$': 'searchre', - '\.RiPSaLoT$': 'searchre', - '\.GiuseppeTnT$': 'searchre', - '\.Renc$': 'searchre', - '-NZBGEEK$': 'searchre', - '-Siklopentan$': 'searchre', - '-RP$': 'searchre', - '-20-40$': 'searchre', - '\.\[www\.usabit\.com\]$': 'searchre', - '\[NO-RAR\] - \[ www\.torrentday\.com \]$': 'searchre', - '- \[ www\.torrentday\.com \]$': 'searchre', - '- \{ www\.SceneTime\.com \}$': 'searchre', - '^\{ www\.SceneTime\.com \} - ': 'searchre', - '^\[ www\.TorrentDay\.com \] - ': 'searchre', - '^\]\.\[ www\.tensiontorrent.com \] - ': 'searchre', - '^\]\.\[www\.tensiontorrent.com\] - ': 'searchre', - '^\[ www\.Cpasbien\.pw \] ': 'searchre', - '^\[ www\.Cpasbien\.com \] ': 'searchre', - '^\[www\.Cpasbien\.com\] ': 'searchre', - '^\[www\.Cpasbien\.pe\] ': 'searchre', - '^\[www\.frenchtorrentdb\.com\] ': 'searchre', + removeWordsList = {r'\[rartv\]$': 'searchre', + r'\[rarbg\]$': 'searchre', + r'\[eztv\]$': 'searchre', + r'\[ettv\]$': 'searchre', + r'\[vtv\]$': 'searchre', + r'\[GloDLS\]$': 'searchre', + r'\[silv4\]$': 'searchre', + r'\[Seedbox\]$': 'searchre', + r'\[AndroidTwoU\]$': 'searchre', + r'\.\[BT\]$': 'searchre', + r' \[1044\]$': 'searchre', + r'\.RiPSaLoT$': 'searchre', + r'\.GiuseppeTnT$': 'searchre', + r'\.Renc$': 'searchre', + r'-NZBGEEK$': 'searchre', + r'-Siklopentan$': 'searchre', + r'-RP$': 'searchre', + r'-20-40$': 'searchre', + r'\.\[www\.usabit\.com\]$': 'searchre', + r'^\[www\.Cpasbien\.pe\] ': 'searchre', + r'^\[www\.Cpasbien\.com\] ': 'searchre', + r'^\[ www\.Cpasbien\.pw \] ': 'searchre', + r'^\[ www\.Cpasbien\.com \] ': 'searchre', + r'- \{ www\.SceneTime\.com \}$': 'searchre', + r'^\{ www\.SceneTime\.com \} - ': 'searchre', + r'- \[ www\.torrentday\.com \]$': 'searchre', + r'^\[ www\.TorrentDay\.com \] - ': 'searchre', + r'^\[www\.frenchtorrentdb\.com\] ': 'searchre', + r'^\]\.\[www\.tensiontorrent.com\] - ': 'searchre', + r'^\]\.\[ www\.tensiontorrent.com \] - ': 'searchre', + r'\[NO-RAR\] - \[ www\.torrentday\.com \]$': 'searchre', } _name = name @@ -235,7 +236,7 @@ def isMediaFile(filename): """ # ignore samples - if re.search('(^|[\W_])(sample\d*)[\W_]', filename, re.I): + if re.search(r'(^|[\W_])(sample\d*)[\W_]', filename, re.I): return False # ignore MAC OS's retarded "resource fork" files @@ -261,7 +262,7 @@ def isRarFile(filename): :return: True if this is RAR/Part file, False if not """ - archive_regex = '(?P<file>^(?P<base>(?:(?!\.part\d+\.rar$).)*)\.(?:(?:part0*1\.)?rar)$)' + archive_regex = r'(?P<file>^(?P<base>(?:(?!\.part\d+\.rar$).)*)\.(?:(?:part0*1\.)?rar)$)' if re.search(archive_regex, filename): return True @@ -308,7 +309,7 @@ def sanitizeFileName(name): return name -def _remove_file_failed(file): +def _remove_file_failed(failed_file): """ Remove file from filesystem @@ -316,8 +317,8 @@ def _remove_file_failed(file): """ try: - ek(os.remove, file) - except: + ek(os.remove, failed_file) + except Exception: pass @@ -372,7 +373,7 @@ def searchDBForShow(regShowName, log=False): showNames = [re.sub('[. -]', ' ', regShowName)] - yearRegex = "([^()]+?)\s*(\()?(\d{4})(?(2)\))$" + yearRegex = r"([^()]+?)\s*(\()?(\d{4})(?(2)\))$" myDB = db.DBConnection() for showName in showNames: @@ -423,7 +424,8 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None): for i in sickbeard.indexerApi().indexers if not indexer else int(indexer or []): # Query Indexers for each search term and build the list of results lINDEXER_API_PARMS = sickbeard.indexerApi(i).api_params.copy() - if ui is not None: lINDEXER_API_PARMS['custom_ui'] = ui + if ui is not None: + lINDEXER_API_PARMS['custom_ui'] = ui t = sickbeard.indexerApi(i).indexer(**lINDEXER_API_PARMS) for name in showNames: @@ -431,17 +433,17 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None): try: search = t[indexer_id] if indexer_id else t[name] - except: + except Exception: continue try: seriesname = search[0]['seriesname'] - except: + except Exception: seriesname = None try: series_id = search[0]['id'] - except: + except Exception: series_id = None if not (seriesname and series_id): @@ -544,9 +546,8 @@ def link(src, dst): """ if os.name == 'nt': - import ctypes - - if ctypes.windll.kernel32.CreateHardLinkW(unicode(dst), unicode(src), 0) == 0: raise ctypes.WinError() + if ctypes.windll.kernel32.CreateHardLinkW(unicode(dst), unicode(src), 0) == 0: + raise ctypes.WinError() else: os.link(src, dst) @@ -577,10 +578,8 @@ def symlink(src, dst): """ if os.name == 'nt': - import ctypes - - if ctypes.windll.kernel32.CreateSymbolicLinkW(unicode(dst), unicode(src), 1 if os.path.isdir(src) else 0) in [0, - 1280]: raise ctypes.WinError() + if ctypes.windll.kernel32.CreateSymbolicLinkW(unicode(dst), unicode(src), 1 if os.path.isdir(src) else 0) in [0, 1280]: + raise ctypes.WinError() else: os.symlink(src, dst) @@ -598,7 +597,7 @@ def moveAndSymlinkFile(srcFile, destFile): ek(shutil.move, srcFile, destFile) fixSetGroupID(destFile) ek(symlink, destFile, srcFile) - except: + except Exception: logger.log(u"Failed to create symlink of " + srcFile + " at " + destFile + ". Copying instead", logger.ERROR) copyFile(srcFile, destFile) @@ -918,7 +917,7 @@ def sanitizeSceneName(name, anime=False): # tidy up stuff that doesn't belong in scene names name = name.replace("- ", ".").replace(" ", ".").replace("&", "and").replace('/', '.') - name = re.sub("\.\.*", ".", name) + name = re.sub(r"\.\.*", ".", name) if name.endswith('.'): name = name[:-1] @@ -971,7 +970,7 @@ def create_https_certificates(ssl_cert, ssl_key): from OpenSSL import crypto # @UnresolvedImport from certgen import createKeyPair, createCertRequest, createCertificate, TYPE_RSA, \ serial # @UnresolvedImport - except Exception as e: + except Exception: logger.log(u"pyopenssl module missing, please install for https access", logger.WARNING) return False @@ -989,7 +988,7 @@ def create_https_certificates(ssl_cert, ssl_key): try: open(ssl_key, 'w').write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) open(ssl_cert, 'w').write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) - except: + except Exception: logger.log(u"Error creating SSL key and certificate", logger.ERROR) return False @@ -1097,7 +1096,7 @@ def tryInt(s, s_default=0): try: return int(s) - except: + except Exception: return s_default @@ -1127,8 +1126,10 @@ def md5_for_file(filename, block_size=2 ** 16): def get_lan_ip(): """Returns IP of system""" - try:return [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][0] - except:return socket.gethostname() + try: + return [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][0] + except Exception: + return socket.gethostname() def check_url(url): """ @@ -1389,7 +1390,7 @@ def extractZip(archive, targetDir): return False -def backupConfigZip(fileList, archive, arcname = None): +def backupConfigZip(fileList, archive, arcname=None): """ Store the config file as a ZIP @@ -1563,7 +1564,7 @@ def _setUpSession(session, headers): # request session cache_dir = sickbeard.CACHE_DIR or _getTempDir() - session = CacheControl(sess=session, cache=caches.FileCache(os.path.join(cache_dir, 'sessions')), cache_etags=False) + session = CacheControl(sess=session, cache=caches.FileCache(os.path.join(cache_dir, 'sessions'), use_dir_lock=True), cache_etags=False) # request session clear residual referer if 'Referer' in session.headers and not 'Referer' in headers: @@ -1689,7 +1690,7 @@ def download_file(url, filename, session=None, headers={}): fp.flush() chmodAsParent(filename) - except: + except Exception: logger.log(u"Problem setting permissions or writing file to: %s" % filename, logger.WARNING) except requests.exceptions.HTTPError as e: @@ -1842,16 +1843,16 @@ def verify_freespace(src, dest, oldfile=None): try: diskfree = disk_usage(dest) - except: + except Exception: logger.log("Unable to determine free space, so I will assume there is enough.", logger.WARNING) return True neededspace = ek(os.path.getsize, src) if oldfile: - for file in oldfile: - if ek(os.path.isfile, file.location): - diskfree += ek(os.path.getsize, file.location) + for f in oldfile: + if ek(os.path.isfile, f.location): + diskfree += ek(os.path.getsize, f.location) if diskfree > neededspace: return True @@ -1879,7 +1880,7 @@ def pretty_time_delta(seconds): return time_delta -def isFileLocked(file, writeLockCheck=False): +def isFileLocked(checkfile, writeLockCheck=False): ''' Checks to see if a file is locked. Performs three checks 1. Checks if the file even exists @@ -1891,22 +1892,22 @@ def isFileLocked(file, writeLockCheck=False): :param file: the file being checked :param writeLockCheck: when true will check if the file is locked for writing (prevents move operations) ''' - if not ek(os.path.exists, file): + if not ek(os.path.exists, checkfile): return True try: - f = ek(open, file, 'r') + f = ek(open, checkfile, 'r') f.close() except IOError: return True if writeLockCheck: - lockFile = file + ".lckchk" + lockFile = checkfile + ".lckchk" if ek(os.path.exists, lockFile): ek(os.remove, lockFile) try: - ek(os.rename, file, lockFile) + ek(os.rename, checkfile, lockFile) time.sleep(1) - ek(os.rename, lockFile, file) + ek(os.rename, lockFile, checkfile) except (OSError, IOError): return True diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 8314f0467776b8d49f196ed411bdfba50e6e622b..40bc790c8b38d1e6c0509edbc6a6a6dbee330ba7 100644 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -54,7 +54,8 @@ __all__ = ['womble', 'btdigg', 'strike', 'transmitthenet', - 'tvchaosuk' + 'tvchaosuk', + 'torrentproject' ] import sickbeard diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index 2d6c03fd2459bc59655d759c98ca341217f6d68b..37fe0f583d158e0cb326bf6cceff028a88116a95 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -135,45 +135,41 @@ class NewznabProvider(generic.NZBProvider): def _get_season_search_strings(self, ep_obj): to_return = [] - cur_params = {} + params = {} if not ep_obj: return to_return - cur_params['maxage'] = (datetime.datetime.now() - datetime.datetime.combine(ep_obj.airdate, datetime.datetime.min.time())).days + 1 + params['maxage'] = (datetime.datetime.now() - datetime.datetime.combine(ep_obj.airdate, datetime.datetime.min.time())).days + 1 + params['tvdbid'] = ep_obj.show.indexerid # season if ep_obj.show.air_by_date or ep_obj.show.sports: date_str = str(ep_obj.airdate).split('-')[0] - cur_params['season'] = date_str - cur_params['q'] = date_str.replace('-', '.') + params['season'] = date_str + params['q'] = date_str.replace('-', '.') else: - cur_params['season'] = str(ep_obj.scene_season) + params['season'] = str(ep_obj.scene_season) - if 'rid' in cur_params: - cur_params.pop('rid') - cur_params.pop('attrs') + save_q = ' ' + params['q'] if 'q' in params else '' - save_q = '' - if 'q' in cur_params: - save_q = ' ' + cur_params['q'] # add new query strings for exceptions name_exceptions = list( set([ep_obj.show.name] + scene_exceptions.get_scene_exceptions(ep_obj.show.indexerid))) for cur_exception in name_exceptions: - cur_params['q'] = helpers.sanitizeSceneName(cur_exception) + save_q - to_return.append(dict(cur_params)) + params['q'] = helpers.sanitizeSceneName(cur_exception) + save_q + to_return.append(dict(params)) return to_return def _get_episode_search_strings(self, ep_obj, add_string=''): to_return = [] params = {} - if not ep_obj: return to_return params['maxage'] = (datetime.datetime.now() - datetime.datetime.combine(ep_obj.airdate, datetime.datetime.min.time())).days + 1 + params['tvdbid'] = ep_obj.show.indexerid if ep_obj.show.air_by_date or ep_obj.show.sports: date_str = str(ep_obj.airdate) @@ -183,10 +179,6 @@ class NewznabProvider(generic.NZBProvider): params['season'] = ep_obj.scene_season params['ep'] = ep_obj.scene_episode - if 'rid' in params: - params.pop('rid') - params.pop('attrs') - # add new query strings for exceptions name_exceptions = list( set([ep_obj.show.name] + scene_exceptions.get_scene_exceptions(ep_obj.show.indexerid))) @@ -367,7 +359,6 @@ class NewznabCache(tvcache.TVCache): params = {"t": "tvsearch", "cat": self.provider.catIDs + ',5060,5070', - "attrs": "rageid", "maxage": 4, } diff --git a/sickbeard/providers/torrentproject.py b/sickbeard/providers/torrentproject.py new file mode 100644 index 0000000000000000000000000000000000000000..e1a6958040f6a144074c4074ab9472039408da49 --- /dev/null +++ b/sickbeard/providers/torrentproject.py @@ -0,0 +1,175 @@ +# Author: duramato <matigonkas@outlook.com> +# URL: https://github.com/SiCKRAGETV/sickrage +# +# This file is part of SickRage. +# +# SickRage is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# SickRage is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with SickRage. If not, see <http://www.gnu.org/licenses/>. + +import datetime +import generic +import json + +from sickbeard import logger +from sickbeard import tvcache +from sickbeard import show_name_helpers +from sickbeard import db +from sickbeard.common import WANTED +from sickbeard.config import naming_ep_type +from sickbeard.helpers import sanitizeSceneName + +class TORRENTPROJECTProvider(generic.TorrentProvider): + + def __init__(self): + generic.TorrentProvider.__init__(self, "TorrentProject") + + self.supportsBacklog = True + self.public = True + + self.urls = {'api': u'https://torrentproject.se/',} + self.url = self.urls['api'] + self.minseed = None + self.minleech = None + self.cache = TORRENTPROJECTCache(self) + + def isEnabled(self): + return self.enabled + + + def imageName(self): + return 'torrentproject.png' + + + def _get_airbydate_season_range(self, season): + if season == None: + return () + year, month = map(int, season.split('-')) + min_date = datetime.date(year, month, 1) + if month == 12: + max_date = datetime.date(year, month, 31) + else: + max_date = datetime.date(year, month+1, 1) - datetime.timedelta(days=1) + return (min_date, max_date) + + + def _get_season_search_strings(self, show, season=None): + search_string = [] + + if not (show and season): + return [] + + myDB = db.DBConnection() + + if show.air_by_date: + (min_date, max_date) = self._get_airbydate_season_range(season) + sqlResults = myDB.select("SELECT DISTINCT airdate FROM tv_episodes WHERE showid = ? AND airdate >= ? AND airdate <= ? AND status = ?", [show.tvdbid, min_date.toordinal(), max_date.toordinal(), WANTED]) + else: + sqlResults = myDB.select("SELECT DISTINCT season FROM tv_episodes WHERE showid = ? AND season = ? AND status = ?", [show.tvdbid, season, WANTED]) + + for sqlEp in sqlResults: + for show_name in set(show_name_helpers.allPossibleShowNames(show)): + if show.air_by_date: + ep_string = sanitizeSceneName(show_name) +' '+ str(datetime.date.fromordinal(sqlEp["airdate"])).replace('-', '.') + search_string.append(ep_string) + else: + ep_string = sanitizeSceneName(show_name) + ' S%02d' % sqlEp["season"] + search_string.append(ep_string) + + return search_string + + + def _get_episode_search_strings(self, ep_obj, add_string=''): + + if not ep_obj: + return [] + + search_string = [] + + for show_name in set(show_name_helpers.allPossibleShowNames(ep_obj.show)): + ep_string = sanitizeSceneName(show_name) + if ep_obj.show.air_by_date: + ep_string += ' ' + str(ep_obj.airdate).replace('-', '.') + else: + ep_string += ' ' + naming_ep_type[2] % {'seasonnumber': ep_obj.season, 'episodenumber': ep_obj.episode} + + if len(add_string): + ep_string += ' %s' % add_string + + search_string.append(ep_string) + + return search_string + + + def _get_title_and_url(self, item): + title, url, size = item + if title: + title = self._clean_title_from_provider(title) + + if url: + url = str(url).replace('&', '&') + + return (title, url) + + + def _get_size(self, item): + title, url, size = item + logger.log(u'Size: %s' % size, logger.DEBUG) + + return size + + + def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None): + + logger.log("Performing Search: {0}".format(search_params)) + + searchUrl = self.urls['api'] + "?s=" + search_params + "&out=json" + + torrents = self.getURL(searchUrl, json=True) + del torrents["total_found"] + + + results = [] + for i in torrents: + name = torrents[i]["title"] + seeders = torrents[i]["seeds"] + leechers = torrents[i]["leechs"] + if seeders < self.minseed or leechers < self.minleech: + logger.log("Torrent doesn't meet minimum seeds & leechers not selecting : " + name, logger.DEBUG) + continue + hash = torrents[i]["torrent_hash"] + size = torrents[i]["torrent_size"] + + magnet = "magnet:?xt=urn:btih:" + hash + "&tr=udp://open.demonii.com:1337/announce&tr=udp://tracker.openbittorrent.com:80/announce&tr=udp://tracker.leechers-paradise.org:6969/announce&tr=http://tracker.dler.org:6969/announce&tr=http://bt.careland.com.cn:6969/announce&tr=http://tracker.tfile.me/announce&tr=http://mgtracker.org:2710/announce&tr=http://tracker1.wasabii.com.tw:6969/announce" + #logger.log(u'magnet : ' + magnet, logger.DEBUG) + results.append((name, magnet, size)) + + logger.log("URL to be parsed: " + searchUrl, logger.DEBUG) + + + return results + + +class TORRENTPROJECTCache(tvcache.TVCache): + def __init__(self, provider): + + tvcache.TVCache.__init__(self, provider) + + # set this 0 to suppress log line, since we aren't updating it anyways + self.minTime = 0 + + def _getRSSData(self): + # no rss for torrentproject afaik,& can't search with empty string + # newest results are always > 1 day since added anyways + return {'entries': {}} + +provider = TORRENTPROJECTProvider() diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py index 86da31a79a9e4dccd1fd7e6a9bd46de4bd70f1b4..3683116041b482887de6d94102875280c01e1f26 100644 --- a/sickbeard/show_queue.py +++ b/sickbeard/show_queue.py @@ -140,13 +140,13 @@ class ShowQueue(generic_queue.GenericQueue): return queueItemObj def addShow(self, indexer, indexer_id, showDir, default_status=None, quality=None, flatten_folders=None, - lang=None, subtitles=None, anime=None, scene=None, paused=None, blacklist=None, whitelist=None, default_status_after=None): + lang=None, subtitles=None, anime=None, scene=None, paused=None, blacklist=None, whitelist=None, default_status_after=None, archive=None): if lang is None: lang = sickbeard.INDEXER_DEFAULT_LANGUAGE queueItemObj = QueueItemAdd(indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang, - subtitles, anime, scene, paused, blacklist, whitelist, default_status_after) + subtitles, anime, scene, paused, blacklist, whitelist, default_status_after, archive) self.add_item(queueItemObj) @@ -218,7 +218,7 @@ class ShowQueueItem(generic_queue.QueueItem): class QueueItemAdd(ShowQueueItem): def __init__(self, indexer, indexer_id, showDir, default_status, quality, flatten_folders, lang, subtitles, anime, - scene, paused, blacklist, whitelist, default_status_after): + scene, paused, blacklist, whitelist, default_status_after, archive): self.indexer = indexer self.indexer_id = indexer_id @@ -234,6 +234,7 @@ class QueueItemAdd(ShowQueueItem): self.blacklist = blacklist self.whitelist = whitelist self.default_status_after = default_status_after + self.archive = archive self.show = None @@ -347,6 +348,7 @@ class QueueItemAdd(ShowQueueItem): self.show.flatten_folders = self.flatten_folders if self.flatten_folders != None else sickbeard.FLATTEN_FOLDERS_DEFAULT self.show.anime = self.anime if self.anime != None else sickbeard.ANIME_DEFAULT self.show.scene = self.scene if self.scene != None else sickbeard.SCENE_DEFAULT + self.show.archive_firstmatch = self.archive if self.archive != None else sickbeard.ARCHIVE_DEFAULT self.show.paused = self.paused if self.paused != None else False # set up default new/missing episode status diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index 3850a5333537fe9954fbef69fa2fa7df9482ad3c..906d766d890e9cb37654b3b4f751d1182c142004 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -84,7 +84,7 @@ def getLanguageName(language): # TODO: Filter here for non-languages in sickbeard.SUBTITLES_LANGUAGES def wantedLanguages(sqlLike = False): - wantedLanguages = [x for x in sorted(sickbeard.SUBTITLES_LANGUAGES) if x in babelfish.language_converters['opensubtitles'].codes] + wantedLanguages = [x for x in sorted(sickbeard.SUBTITLES_LANGUAGES) if x in subtitleCodeFilter()] if sqlLike: return '%' + ','.join(wantedLanguages) + '%' return wantedLanguages @@ -114,8 +114,6 @@ def subtitlesLanguages(video_path): resultList.append(language.alpha2) defaultLang = wantedLanguages() - if len(resultList) is 1 and len(defaultLang) is 1: - return defaultLang if ('pob' in defaultLang or 'pb' in defaultLang) and ('pt' not in defaultLang and 'por' not in defaultLang): resultList = [x if not x in ['por', 'pt'] else u'pob' for x in resultList] @@ -126,6 +124,9 @@ def subtitlesLanguages(video_path): def subtitleLanguageFilter(): return [babelfish.Language.fromopensubtitles(language) for language in babelfish.language_converters['opensubtitles'].codes if len(language) == 3] +def subtitleCodeFilter(): + return [babelfish.Language.fromopensubtitles(language).opensubtitles for language in babelfish.language_converters['opensubtitles'].codes if len(language) == 3] + class SubtitlesFinder(): """ The SubtitlesFinder will be executed every hour but will not necessarly search @@ -141,7 +142,7 @@ class SubtitlesFinder(): return if len(sickbeard.subtitles.getEnabledServiceList()) < 1: - logger.log(u'Not enough services selected. At least 1 service is required to search subtitles in the background', logger.ERROR) + logger.log(u'Not enough services selected. At least 1 service is required to search subtitles in the background', logger.WARNING) return logger.log(u'Checking for subtitles', logger.INFO) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 7fb995cdaaf5a699f3c04b648346ad06005f29a9..8b7248401b6d8bddaf67f00890ec31d62681b683 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -430,7 +430,8 @@ class TraktChecker(): quality=int(sickbeard.QUALITY_DEFAULT), flatten_folders=int(sickbeard.FLATTEN_FOLDERS_DEFAULT), paused=sickbeard.TRAKT_START_PAUSED, - default_status_after=status) + default_status_after=status, + archive=sickbeard.ARCHIVE_DEFAULT) else: logger.log(u"There was an error creating the show, no root directory setting found", logger.ERROR) return diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 442677c1324ff75b574f65425dbb8bff6708de0f..2b96aa233aa310e30010cb8c1780c6cb0082d54a 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -719,9 +719,7 @@ class TVShow(object): # check for status/quality changes as long as it's a new file - elif not same_file and sickbeard.helpers.isMediaFile(file) and curEp.status not in Quality.DOWNLOADED + [ - ARCHIVED, IGNORED]: - + elif not same_file and sickbeard.helpers.isMediaFile(file) and curEp.status not in Quality.DOWNLOADED + Quality.ARCHIVED + [IGNORED]: oldStatus, oldQuality = Quality.splitCompositeStatus(curEp.status) newQuality = Quality.nameQuality(file, self.is_anime) if newQuality == Quality.UNKNOWN: @@ -1260,7 +1258,7 @@ class TVShow(object): logger.log(u"Existing episode status: " + str(epStatus) + " (" + epStatus_text + ")", logger.DEBUG) # if we know we don't want it then just say no - if epStatus in (UNAIRED, SKIPPED, IGNORED, ARCHIVED) and not manualSearch: + if epStatus in Quality.ARCHIVED + [UNAIRED, SKIPPED, IGNORED] and not manualSearch: logger.log(u"Existing episode status is unaired/skipped/ignored/archived, ignoring found episode", logger.DEBUG) return False @@ -1305,9 +1303,9 @@ class TVShow(object): return Overview.UNAIRED elif epStatus in (SKIPPED, IGNORED): return Overview.SKIPPED - elif epStatus == ARCHIVED: + elif epStatus in Quality.ARCHIVED: return Overview.GOOD - elif epStatus in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.FAILED + Quality.SNATCHED_BEST + Quality.ARCHIVED: + elif epStatus in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.FAILED + Quality.SNATCHED_BEST: anyQualities, bestQualities = Quality.splitQuality(self.quality) # @UnusedVariable if bestQualities: @@ -1429,9 +1427,19 @@ class TVEpisode(object): location = property(lambda self: self._location, _set_location) - def refreshSubtitles(self): - """Look for subtitles files and refresh the subtitles property""" - self.subtitles = subtitles.subtitlesLanguages(self.location) + def getSubtitlesPath(self): + if sickbeard.SUBTITLES_DIR and ek(os.path.exists, sickbeard.SUBTITLES_DIR): + subs_new_path = sickbeard.SUBTITLES_DIR + elif sickbeard.SUBTITLES_DIR: + subs_new_path = ek(os.path.join, ek(os.path.dirname, self.location), sickbeard.SUBTITLES_DIR) + dir_exists = helpers.makeDir(subs_new_path) + if not dir_exists: + logger.log(u'Unable to create subtitles folder ' + subs_new_path, logger.ERROR) + else: + helpers.chmodAsParent(subs_new_path) + else: + subs_new_path = ek(os.path.join, ek(os.path.dirname, self.location)) + return subs_new_path def getWantedLanguages(self): languages = set() @@ -1440,6 +1448,10 @@ class TVEpisode(object): self.refreshSubtitles() return languages + def refreshSubtitles(self): + """Look for subtitles files and refresh the subtitles property""" + self.subtitles = subtitles.subtitlesLanguages(self.location) + def downloadSubtitles(self, force=False): if not ek(os.path.isfile, self.location): logger.log(u"%s: Episode file doesn't exist, can't download subtitles for S%02dE%02d" % @@ -1456,11 +1468,12 @@ class TVEpisode(object): #logging.getLogger('subliminal').setLevel(logging.DEBUG) try: - providers = sickbeard.subtitles.getEnabledServiceList() + subs_path = self.getSubtitlesPath(); languages = self.getWantedLanguages(); if not languages: logger.log(u'%s: No missing subtitles for S%02dE%02d' % (self.show.indexerid, self.season, self.episode), logger.DEBUG) return + providers = sickbeard.subtitles.getEnabledServiceList() vname = self.location video = None try: @@ -1480,25 +1493,12 @@ class TVEpisode(object): logger.log(u'%s: No subtitles found for S%02dE%02d on any provider' % (self.show.indexerid, self.season, self.episode), logger.DEBUG) return - # Select the correct subtitles path - if sickbeard.SUBTITLES_DIR and ek(os.path.exists, sickbeard.SUBTITLES_DIR): - subs_new_path = sickbeard.SUBTITLES_DIR - elif sickbeard.SUBTITLES_DIR: - subs_new_path = ek(os.path.join, ek(os.path.dirname, self.location), sickbeard.SUBTITLES_DIR) - dir_exists = helpers.makeDir(subs_new_path) - if not dir_exists: - logger.log(u'Unable to create subtitles folder ' + subs_new_path, logger.ERROR) - else: - helpers.chmodAsParent(subs_new_path) - else: - subs_new_path = ek(os.path.join, ek(os.path.dirname, self.location)) - - subliminal.save_subtitles(foundSubs, directory=subs_new_path, single=not sickbeard.SUBTITLES_MULTI) + subliminal.save_subtitles(foundSubs, directory=subs_path, single=not sickbeard.SUBTITLES_MULTI) for video, subs in foundSubs.iteritems(): for sub in subs: # Get the file name out of video.name and use the path from above - video_path = subs_new_path + "/" + video.name.rsplit("/", 1)[-1] + video_path = subs_path + "/" + video.name.rsplit("/", 1)[-1] subpath = subliminal.subtitle.get_subtitle_path(video_path, sub.language if sickbeard.SUBTITLES_MULTI else None) helpers.chmodAsParent(subpath) helpers.fixSetGroupID(subpath) @@ -1536,7 +1536,6 @@ class TVEpisode(object): return self.subtitles - def checkForMetaFiles(self): oldhasnfo = self.hasnfo @@ -1809,7 +1808,7 @@ class TVEpisode(object): # if we have a media file then it's downloaded elif sickbeard.helpers.isMediaFile(self.location): # leave propers alone, you have to either post-process them or manually change them back - if self.status not in Quality.SNATCHED_PROPER + Quality.DOWNLOADED + Quality.SNATCHED + [ARCHIVED]: + if self.status not in Quality.SNATCHED_PROPER + Quality.DOWNLOADED + Quality.SNATCHED + Quality.ARCHIVED: logger.log( u"5 Status changes from " + str(self.status) + " to " + str(Quality.statusFromName(self.location)), logger.DEBUG) diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index 8f98be9a042776185c3982e47bad6e9e22222ad8..5b867723d914f575e2b644954fa5d835b8fc6df8 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -59,6 +59,7 @@ from sickbeard.common import SNATCHED_PROPER from sickbeard.common import UNAIRED from sickbeard.common import UNKNOWN from sickbeard.common import WANTED +from sickbeard.common import ARCHIVED from sickbeard.common import statusStrings import codecs @@ -126,20 +127,17 @@ class ApiHandler(RequestHandler): _call_dispatcher = profile(_call_dispatcher, immediate=True) del kwargs["profile"] - # if debug was set call the "_call_dispatcher" - if 'debug' in kwargs: - outDict = _call_dispatcher(args, kwargs) # this way we can debug the cherry.py traceback in the browser - del kwargs["debug"] - else: # if debug was not set we wrap the "call_dispatcher" in a try block to assure a json output - try: - outDict = _call_dispatcher(args, kwargs) - except Exception, e: # real internal error oohhh nooo :( - logger.log(u"API :: " + ex(e), logger.ERROR) - errorData = {"error_msg": ex(e), - "args": args, - "kwargs": kwargs} - outDict = _responds(RESULT_FATAL, errorData, - "SickRage encountered an internal error! Please report to the Devs") + try: + outDict = _call_dispatcher(args, kwargs) + except Exception, e: # real internal error oohhh nooo :( + logger.log(u"API :: " + ex(e), logger.ERROR) + errorData = { + "error_msg": ex(e), + "args": args, + "kwargs": kwargs + } + outDict = _responds(RESULT_FATAL, errorData, + "SickRage encountered an internal error! Please report to the Devs") if 'outputType' in outDict: outputCallback = outputCallbackDict[outDict['outputType']] @@ -197,9 +195,9 @@ class ApiHandler(RequestHandler): logger.log(u"API :: " + cmd + ": curKwargs " + str(curKwargs), logger.DEBUG) if not (multiCmds and cmd in ('show.getbanner', 'show.getfanart', 'show.getnetworklogo', 'show.getposter')): # skip these cmd while chaining try: - if cmd in _functionMaper: + if cmd in function_mapper: # map function - func = _functionMaper.get(cmd) + func = function_mapper.get(cmd) # add request handler to function func.rh = self @@ -313,6 +311,7 @@ class ApiCall(ApiHandler): else: self._help[type][paramName]["allowedValues"] = "see desc" self._help[type][paramName]["defaultValue"] = paramDict[paramName]["defaultValue"] + self._help[type][paramName]["type"] = paramDict[paramName]["type"] elif paramDict: for paramName in paramDict: @@ -323,7 +322,6 @@ class ApiCall(ApiHandler): msg = "No description available" if "desc" in self._help: msg = self._help["desc"] - del self._help["desc"] return _responds(RESULT_SUCCESS, self._help, msg) def return_missing(self): @@ -366,18 +364,21 @@ class ApiCall(ApiHandler): except AttributeError: self._missing = [] self._requiredParams = {key: {"allowedValues": allowedValues, - "defaultValue": orgDefault}} + "defaultValue": orgDefault, + "type": type}} if missing and key not in self._missing: self._missing.append(key) else: try: self._optionalParams[key] = {"allowedValues": allowedValues, - "defaultValue": orgDefault} + "defaultValue": orgDefault, + "type": type} except AttributeError: self._optionalParams = {} self._optionalParams[key] = {"allowedValues": allowedValues, - "defaultValue": orgDefault} + "defaultValue": orgDefault, + "type": type} if default: default = self._check_param_type(default, key, type) @@ -639,13 +640,13 @@ class CMD_Help(ApiCall): def __init__(self, args, kwargs): # required # optional - self.subject, args = self.check_params(args, kwargs, "subject", "help", False, "string", _functionMaper.keys()) + self.subject, args = self.check_params(args, kwargs, "subject", "help", False, "string", function_mapper.keys()) ApiCall.__init__(self, args, kwargs) def run(self): """ Get help about a given command """ - if self.subject in _functionMaper: - out = _responds(RESULT_SUCCESS, _functionMaper.get(self.subject)((), {"help": 1}).run()) + if self.subject in function_mapper: + out = _responds(RESULT_SUCCESS, function_mapper.get(self.subject)((), {"help": 1}).run()) else: out = _responds(RESULT_FAILURE, msg="No such cmd") return out @@ -905,7 +906,7 @@ class CMD_EpisodeSetStatus(ApiCall): continue # allow the user to force setting the status for an already downloaded episode - if epObj.status in Quality.DOWNLOADED and not self.force: + if epObj.status in Quality.DOWNLOADED + Quality.ARCHIVED and not self.force: ep_results.append(_epResult(RESULT_FAILURE, epObj, "Refusing to change status because it is already marked as DOWNLOADED")) failure = True continue @@ -1314,7 +1315,7 @@ class CMD_SickBeard(ApiCall): def run(self): """ dGet miscellaneous information about SickRage """ data = {"sr_version": sickbeard.BRANCH, "api_version": self.version, - "api_commands": sorted(_functionMaper.keys())} + "api_commands": sorted(function_mapper.keys())} return _responds(RESULT_SUCCESS, data) @@ -2039,6 +2040,7 @@ class CMD_ShowAddNew(ApiCall): "anime": {"desc": "True to mark the show as an anime, False otherwise"}, "scene": {"desc": "True if episodes search should be made by scene numbering, False otherwise"}, "future_status": {"desc": "The status of future episodes"}, + "archive_firstmatch": {"desc": "True if episodes should be archived when first match is downloaded, False otherwise"}, } } @@ -2069,6 +2071,9 @@ class CMD_ShowAddNew(ApiCall): self.future_status, args = self.check_params(args, kwargs, "future_status", None, False, "string", ["wanted", "skipped", "ignored"]) + self.archive_firstmatch, args = self.check_params(args, kwargs, "archive_firstmatch", + int(sickbeard.ARCHIVE_DEFAULT), False, "bool", []) + # super, missing, help ApiCall.__init__(self, args, kwargs) @@ -2181,7 +2186,7 @@ class CMD_ShowAddNew(ApiCall): sickbeard.showQueueScheduler.action.addShow(int(indexer), int(self.indexerid), showPath, newStatus, newQuality, int(self.flatten_folders), self.lang, self.subtitles, self.anime, - self.scene, default_status_after=default_ep_status_after) # @UndefinedVariable + self.scene, default_status_after=default_ep_status_after, archive=self.archive_firstmatch) # @UndefinedVariable return _responds(RESULT_SUCCESS, {"name": indexerName}, indexerName + " has been queued to be added") @@ -2656,14 +2661,14 @@ class CMD_ShowStats(ApiCall): episode_status_counts_total = {} episode_status_counts_total["total"] = 0 for status in statusStrings.statusStrings.keys(): - if status in [UNKNOWN, DOWNLOADED, SNATCHED, SNATCHED_PROPER]: + if status in [UNKNOWN, DOWNLOADED, SNATCHED, SNATCHED_PROPER, ARCHIVED]: continue episode_status_counts_total[status] = 0 # add all the downloaded qualities episode_qualities_counts_download = {} episode_qualities_counts_download["total"] = 0 - for statusCode in Quality.DOWNLOADED: + for statusCode in Quality.DOWNLOADED + Quality.ARCHIVED: status, quality = Quality.splitCompositeStatus(statusCode) if quality in [Quality.NONE]: continue @@ -2687,7 +2692,7 @@ class CMD_ShowStats(ApiCall): episode_status_counts_total["total"] += 1 - if status in Quality.DOWNLOADED: + if status in Quality.DOWNLOADED + Quality.ARCHIVED: episode_qualities_counts_download["total"] += 1 episode_qualities_counts_download[int(row["status"])] += 1 elif status in Quality.SNATCHED + Quality.SNATCHED_PROPER: @@ -2853,7 +2858,7 @@ class CMD_ShowsStats(ApiCall): stats["ep_snatched"] = myDB.select("SELECT COUNT(*) FROM tv_episodes WHERE status IN (" + ",".join( [str(show) for show in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ") AND season != 0 and episode != 0 AND airdate <= " + today + "")[0][0] stats["ep_total"] = myDB.select("SELECT COUNT(*) FROM tv_episodes WHERE season != 0 AND episode != 0 AND (airdate != 1 OR status IN (" + ",".join( - [str(show) for show in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.ARCHIVED]) + ")) AND airdate <= " + today + " AND status != " + str(IGNORED) + "")[0][0] + [str(show) for show in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.ARCHIVED]) + ")) AND airdate <= " + today + " AND status != " + str(IGNORED) + "")[0][0] return _responds(RESULT_SUCCESS, stats) @@ -2862,7 +2867,7 @@ class CMD_ShowsStats(ApiCall): # WARNING: never define a param name that contains a "." (dot) # this is reserved for cmd namespaces used while cmd chaining -_functionMaper = { +function_mapper = { "help": CMD_Help, "future": CMD_ComingEpisodes, "episode": CMD_Episode, diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 2805537dc992c2a2620ee0ab2550ea6d5cd992e4..40de74d7935709e7514fb4e0ed859148dd780de4 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -36,13 +36,14 @@ from sickbeard import subtitles from sickbeard import network_timezones from sickbeard.providers import newznab, rsstorrent from sickbeard.common import Quality, Overview, statusStrings, qualityPresetStrings, cpu_presets -from sickbeard.common import SNATCHED, UNAIRED, IGNORED, ARCHIVED, WANTED, FAILED, SKIPPED +from sickbeard.common import SNATCHED, UNAIRED, IGNORED, WANTED, FAILED, SKIPPED from sickbeard.common import SD, HD720p, HD1080p from sickbeard.blackandwhitelist import BlackAndWhiteList, short_group_names from sickbeard.browser import foldersAtPath from sickbeard.scene_numbering import get_scene_numbering, set_scene_numbering, get_scene_numbering_for_show, \ get_xem_numbering_for_show, get_scene_absolute_numbering_for_show, get_xem_absolute_numbering_for_show, \ get_scene_absolute_numbering +from sickbeard.webapi import function_mapper from imdbPopular import imdb_popular @@ -114,7 +115,7 @@ class PageTemplate(MakoTemplate): super(PageTemplate, self).__init__(*args, **kwargs) - self.arguments['sbRoot'] = sickbeard.WEB_ROOT + self.arguments['srRoot'] = sickbeard.WEB_ROOT self.arguments['sbHttpPort'] = sickbeard.WEB_PORT self.arguments['sbHttpsPort'] = sickbeard.WEB_PORT self.arguments['sbHttpsEnabled'] = sickbeard.ENABLE_HTTPS @@ -351,36 +352,36 @@ class WebRoot(WebHandler): return "User-agent: *\nDisallow: /" def apibuilder(self): - t = PageTemplate(rh=self, file="apiBuilder.mako") - def titler(x): return (helpers.remove_article(x), x)[not x or sickbeard.SORT_ARTICLE] - sortedShowList = sorted(sickbeard.showList, lambda x, y: cmp(titler(x.name), titler(y.name))) - - myDB = db.DBConnection(row_type="dict") + myDB = db.DBConnection(row_type='dict') + shows = sorted(sickbeard.showList, lambda x, y: cmp(titler(x.name), titler(y.name))) + episodes = {} - seasonSQLResults = {} - episodeSQLResults = {} + results = myDB.select( + 'SELECT episode, season, showid ' + 'FROM tv_episodes ' + 'ORDER BY season ASC, episode ASC' + ) - for curShow in sortedShowList: - seasonSQLResults[curShow.indexerid] = myDB.select( - "SELECT DISTINCT season FROM tv_episodes WHERE showid = ? ORDER BY season DESC", [curShow.indexerid]) + for result in results: + if result['showid'] not in episodes: + episodes[result['showid']] = {} - for curShow in sortedShowList: - episodeSQLResults[curShow.indexerid] = myDB.select( - "SELECT DISTINCT season,episode FROM tv_episodes WHERE showid = ? ORDER BY season DESC, episode DESC", - [curShow.indexerid]) + if result['season'] not in episodes[result['showid']]: + episodes[result['showid']][result['season']] = [] - seasonSQLResults = seasonSQLResults - episodeSQLResults = episodeSQLResults + episodes[result['showid']][result['season']].append(result['episode']) if len(sickbeard.API_KEY) == 32: apikey = sickbeard.API_KEY else: - apikey = "api key not generated" + apikey = 'API Key not generated' - return t.render(title="Api Builder", header="Api Builder", sortedShowList=sortedShowList, seasonSQLResults=seasonSQLResults, episodeSQLResults=episodeSQLResults, apikey=apikey) + t = PageTemplate(rh=self, file='apiBuilder.mako') + return t.render(title='API Builder', header='API Builder', shows=shows, episodes=episodes, apikey=apikey, + commands=function_mapper) def showPoster(self, show=None, which=None): media = None @@ -1691,13 +1692,13 @@ class Home(WebRoot): logger.ERROR) continue - if int(status) == FAILED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.DOWNLOADED: + if int(status) == FAILED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.DOWNLOADED + Quality.ARCHIVED: logger.log( u"Refusing to change status of " + curEp + " to FAILED because it's not SNATCHED/DOWNLOADED", logger.ERROR) continue - if epObj.status in Quality.DOWNLOADED and int(status) == WANTED: + if epObj.status in Quality.DOWNLOADED + Quality.ARCHIVED and int(status) == WANTED: logger.log(u"Removing release_name for episode as you want to set a downloaded episode back to wanted, so obviously you want it replaced") epObj.release_name = "" @@ -1714,7 +1715,7 @@ class Home(WebRoot): if int(status) in [WANTED, FAILED]: logger.log(u"Add episodes, showid: indexerid " + str(showObj.indexerid) + ", Title " + str(showObj.name) + " to Watchlist", logger.DEBUG) upd = "add" - elif int(status) in [ARCHIVED, IGNORED, SKIPPED ] + Quality.DOWNLOADED: + elif int(status) in [IGNORED, SKIPPED] + Quality.DOWNLOADED + Quality.ARCHIVED: logger.log(u"Remove episodes, showid: indexerid " + str(showObj.indexerid) + ", Title " + str(showObj.name) + " from Watchlist", logger.DEBUG) upd = "remove" @@ -2108,7 +2109,7 @@ class HomeNews(Home): news = 'Could not load news from the repo. [Click here for news.md](http://sickragetv.github.io/sickrage-news/news.md)' t = PageTemplate(rh=self, file="markdown.mako") - data = markdown2.markdown(news if news else "The was a problem connecting to github, please refresh and try again") + data = markdown2.markdown(news if news else "The was a problem connecting to github, please refresh and try again", extras=['header-ids']) return t.render(title="News", header="News", topmenu="news", data=data, submenu=self.HomeMenu()) @@ -2126,7 +2127,7 @@ class HomeChangeLog(Home): changes = 'Could not load changes from the repo. [Click here for CHANGES.md](http://sickragetv.github.io/sickrage-news/CHANGES.md)' t = PageTemplate(rh=self, file="markdown.mako") - data = markdown2.markdown(changes if changes else "The was a problem connecting to github, please refresh and try again") + data = markdown2.markdown(changes if changes else "The was a problem connecting to github, please refresh and try again", extras=['header-ids']) return t.render(title="Changelog", header="Changelog", topmenu="system", data=data, submenu=self.HomeMenu()) @@ -2527,7 +2528,8 @@ class HomeAddShows(Home): subtitles=sickbeard.SUBTITLES_DEFAULT, anime=sickbeard.ANIME_DEFAULT, scene=sickbeard.SCENE_DEFAULT, - default_status_after=sickbeard.STATUS_DEFAULT_AFTER) + default_status_after=sickbeard.STATUS_DEFAULT_AFTER, + archive=sickbeard.ARCHIVE_DEFAULT) ui.notifications.message('Show added', 'Adding the specified show into ' + show_dir) else: @@ -2540,7 +2542,7 @@ class HomeAddShows(Home): def addNewShow(self, whichSeries=None, indexerLang=None, rootDir=None, defaultStatus=None, anyQualities=None, bestQualities=None, flatten_folders=None, subtitles=None, fullShowPath=None, other_shows=None, skipShow=None, providedIndexer=None, anime=None, - scene=None, blacklist=None, whitelist=None, defaultStatusAfter=None): + scene=None, blacklist=None, whitelist=None, defaultStatusAfter=None, archive=None): """ Receive tvdb id, dir, and other options and create a show from them. If extra show dirs are provided then it forwards back to newShow, if not it goes to /home. @@ -2628,6 +2630,7 @@ class HomeAddShows(Home): anime = config.checkbox_to_value(anime) flatten_folders = config.checkbox_to_value(flatten_folders) subtitles = config.checkbox_to_value(subtitles) + archive = config.checkbox_to_value(archive) if whitelist: whitelist = short_group_names(whitelist) @@ -2647,7 +2650,7 @@ class HomeAddShows(Home): # add the show sickbeard.showQueueScheduler.action.addShow(indexer, indexer_id, show_dir, int(defaultStatus), newQuality, flatten_folders, indexerLang, subtitles, anime, - scene, None, blacklist, whitelist, int(defaultStatusAfter)) + scene, None, blacklist, whitelist, int(defaultStatusAfter), archive) ui.notifications.message('Show added', 'Adding the specified show into ' + show_dir) return finishAddShow() @@ -2721,7 +2724,8 @@ class HomeAddShows(Home): subtitles=sickbeard.SUBTITLES_DEFAULT, anime=sickbeard.ANIME_DEFAULT, scene=sickbeard.SCENE_DEFAULT, - default_status_after=sickbeard.STATUS_DEFAULT_AFTER) + default_status_after=sickbeard.STATUS_DEFAULT_AFTER, + archive=sickbeard.ARCHIVE_DEFAULT) num_added += 1 if num_added: @@ -3497,7 +3501,7 @@ class History(WebRoot): self.history = HistoryTool() def index(self, limit=None): - + if limit is None: if sickbeard.HISTORY_LIMIT: limit = int(sickbeard.HISTORY_LIMIT) @@ -3505,9 +3509,9 @@ class History(WebRoot): limit = 100 else: limit = int(limit) - + sickbeard.HISTORY_LIMIT = limit - + sickbeard.save_config() compact = [] @@ -3611,7 +3615,7 @@ class ConfigGeneral(Config): sickbeard.ROOT_DIRS = rootDirString def saveAddShowDefaults(self, defaultStatus, anyQualities, bestQualities, defaultFlattenFolders, subtitles=False, - anime=False, scene=False, defaultStatusAfter=WANTED): + anime=False, scene=False, defaultStatusAfter=WANTED, archive=False): if anyQualities: anyQualities = anyQualities.split(',') @@ -3634,6 +3638,7 @@ class ConfigGeneral(Config): sickbeard.ANIME_DEFAULT = config.checkbox_to_value(anime) sickbeard.SCENE_DEFAULT = config.checkbox_to_value(scene) + sickbeard.ARCHIVE_DEFAULT = config.checkbox_to_value(archive) sickbeard.save_config()