2017-06-29 05:53:25 +00:00
var basePath = '' ;
var indexers = [ ] ;
var configuredIndexers = [ ] ;
var unconfiguredIndexers = [ ] ;
$ . fn . inView = function ( ) {
if ( ! this . length ) return false ;
var rect = this . get ( 0 ) . getBoundingClientRect ( ) ;
return (
rect . top >= 0 &&
rect . left >= 0 &&
rect . bottom <= ( window . innerHeight || document . documentElement . clientHeight ) &&
rect . right <= ( window . innerWidth || document . documentElement . clientWidth )
) ;
} ;
$ . fn . focusWithoutScrolling = function ( ) {
if ( this . inView ( ) )
this . focus ( ) ;
return this ;
} ;
$ ( document ) . ready ( function ( ) {
$ . ajaxSetup ( { cache : false } ) ;
2017-10-25 14:03:09 +00:00
//window.jackettIsLocal = window.location.hostname === '127.0.0.1';
window . jackettIsLocal = false ; // reCaptcha can't be solved via 127.0.0.1 anymore. This loophold was fixed by google around 2.10.2017
2017-06-29 05:53:25 +00:00
2017-08-08 15:02:16 +00:00
Handlebars . registerHelper ( 'if_eq' , function ( a , b , opts ) {
if ( a == b )
return opts . fn ( this ) ;
else
return opts . inverse ( this ) ;
2020-02-19 20:23:55 +00:00
} ) ;
Handlebars . registerHelper ( 'if_in' , function ( elem , list , opts ) {
if ( list . indexOf ( elem ) > - 1 ) {
return opts . fn ( this ) ;
}
return opts . inverse ( this ) ;
} ) ;
2017-08-08 15:02:16 +00:00
2017-08-12 18:12:30 +00:00
var index = window . location . pathname . indexOf ( "/UI" ) ;
var pathPrefix = window . location . pathname . substr ( 0 , index ) ;
api . root = pathPrefix + api . root ;
2017-06-29 05:53:25 +00:00
bindUIButtons ( ) ;
loadJackettSettings ( ) ;
} ) ;
2017-07-23 00:08:19 +00:00
function openSearchIfNecessary ( ) {
2017-08-28 16:54:57 +00:00
const hashArgs = location . hash . substring ( 1 ) . split ( '&' ) . reduce ( ( prev , item ) => Object . assign ( { [ item . split ( '=' ) [ 0 ] ] : ( item . split ( '=' ) . length < 2 ? undefined : decodeURIComponent ( item . split ( '=' ) [ 1 ] ) ) } , prev ) , { } ) ;
if ( "search" in hashArgs ) {
showSearch ( hashArgs . tracker , hashArgs . search , hashArgs . category ) ;
2017-07-23 00:08:19 +00:00
}
}
2017-06-29 05:53:25 +00:00
function insertWordWrap ( str ) {
// insert optional word wrap after punctuation to avoid overflows on long scene titles
return str . replace ( /([\.\-_\/\\])/g , "$1\u200B" ) ;
}
function getJackettConfig ( callback ) {
2017-08-08 15:02:16 +00:00
api . getServerConfig ( callback ) . fail ( function ( ) {
2017-08-20 12:54:34 +00:00
doNotify ( "Error loading Jackett settings, request to Jackett server failed, is server running ?" , "danger" , "glyphicon glyphicon-alert" ) ;
2017-06-29 05:53:25 +00:00
} ) ;
}
function loadJackettSettings ( ) {
getJackettConfig ( function ( data ) {
2017-08-08 15:02:16 +00:00
$ ( "#api-key-input" ) . val ( data . api _key ) ;
$ ( ".api-key-text" ) . text ( data . api _key ) ;
2017-06-29 05:53:25 +00:00
$ ( "#app-version" ) . html ( data . app _version ) ;
2017-08-08 15:02:16 +00:00
$ ( "#jackett-port" ) . val ( data . port ) ;
2017-10-31 09:45:30 +00:00
2017-11-06 10:51:26 +00:00
$ ( "#jackett-proxy-type" ) . val ( data . proxy _type ) ;
2017-10-31 09:45:30 +00:00
$ ( "#jackett-proxy-url" ) . val ( data . proxy _url ) ;
$ ( "#jackett-proxy-port" ) . val ( data . proxy _port ) ;
$ ( "#jackett-proxy-username" ) . val ( data . proxy _username ) ;
$ ( "#jackett-proxy-password" ) . val ( data . proxy _password ) ;
2017-08-08 15:02:16 +00:00
$ ( "#jackett-basepathoverride" ) . val ( data . basepathoverride ) ;
basePath = data . basepathoverride ;
2017-06-29 05:53:25 +00:00
if ( basePath === null || basePath === undefined ) {
basePath = '' ;
}
2017-08-08 15:02:16 +00:00
2017-08-11 23:04:30 +00:00
api . key = data . api _key ;
2017-08-08 15:02:16 +00:00
$ ( "#jackett-savedir" ) . val ( data . blackholedir ) ;
$ ( "#jackett-allowext" ) . attr ( 'checked' , data . external ) ;
$ ( "#jackett-allowupdate" ) . attr ( 'checked' , data . updatedisabled ) ;
$ ( "#jackett-prerelease" ) . attr ( 'checked' , data . prerelease ) ;
$ ( "#jackett-logging" ) . attr ( 'checked' , data . logging ) ;
$ ( "#jackett-omdbkey" ) . val ( data . omdbkey ) ;
2018-07-09 10:37:24 +00:00
$ ( "#jackett-omdburl" ) . val ( data . omdburl ) ;
2017-08-08 15:02:16 +00:00
var password = data . password ;
2017-06-29 05:53:25 +00:00
$ ( "#jackett-adminpwd" ) . val ( password ) ;
if ( password != null && password != '' ) {
$ ( "#logoutBtn" ) . show ( ) ;
}
2019-04-27 10:59:33 +00:00
if ( data . can _run _netcore != null && data . can _run _netcore === true ) {
$ ( "#can-upgrade-from-mono" ) . show ( ) ;
}
2017-08-08 15:02:16 +00:00
$ . each ( data . notices , function ( index , value ) {
2017-06-29 05:53:25 +00:00
console . log ( value ) ;
doNotify ( value , "danger" , "glyphicon glyphicon-alert" , false ) ;
} )
reloadIndexers ( ) ;
2019-04-01 08:40:35 +00:00
proxyWarning ( data . proxy _url ) ;
2017-06-29 05:53:25 +00:00
} ) ;
}
function reloadIndexers ( ) {
$ ( '#indexers' ) . hide ( ) ;
2017-08-08 15:02:16 +00:00
api . getAllIndexers ( function ( data ) {
2017-06-29 05:53:25 +00:00
indexers = data ;
configuredIndexers = [ ] ;
unconfiguredIndexers = [ ] ;
2017-08-08 15:02:16 +00:00
for ( var i = 0 ; i < data . length ; i ++ ) {
var item = data [ i ] ;
2017-12-05 14:24:50 +00:00
item . rss _host = resolveUrl ( basePath + "/api/v2.0/indexers/" + item . id + "/results/torznab/api?apikey=" + api . key + "&t=search&cat=&q=" ) ;
2017-08-08 15:02:16 +00:00
item . torznab _host = resolveUrl ( basePath + "/api/v2.0/indexers/" + item . id + "/results/torznab/" ) ;
item . potato _host = resolveUrl ( basePath + "/api/v2.0/indexers/" + item . id + "/results/potato/" ) ;
2017-06-29 05:53:25 +00:00
if ( item . last _error )
item . state = "error" ;
else
item . state = "success" ;
if ( item . type == "public" ) {
2017-09-08 07:06:06 +00:00
item . type _label = "success" ;
2017-06-29 05:53:25 +00:00
}
else if ( item . type == "private" ) {
2017-09-08 07:06:06 +00:00
item . type _label = "danger" ;
2017-06-29 05:53:25 +00:00
}
else if ( item . type == "semi-private" ) {
2017-09-08 07:06:06 +00:00
item . type _label = "warning" ;
2017-06-29 05:53:25 +00:00
}
else {
2017-09-08 07:06:06 +00:00
item . type _label = "default" ;
2017-06-29 05:53:25 +00:00
}
2017-08-08 15:02:16 +00:00
var main _cats _list = item . caps . filter ( function ( c ) {
return c . ID < 100000 ;
} ) . map ( function ( c ) {
return c . Name . split ( "/" ) [ 0 ] ;
} ) ;
2017-06-29 05:53:25 +00:00
item . mains _cats = $ . unique ( main _cats _list ) . join ( ", " ) ;
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
if ( item . configured )
configuredIndexers . push ( item ) ;
else
unconfiguredIndexers . push ( item ) ;
}
displayConfiguredIndexersList ( configuredIndexers ) ;
$ ( '#indexers div.dataTables_filter input' ) . focusWithoutScrolling ( ) ;
2017-08-11 23:04:07 +00:00
openSearchIfNecessary ( ) ;
2017-06-29 05:53:25 +00:00
} ) . fail ( function ( ) {
2017-08-20 11:11:46 +00:00
doNotify ( "Error loading indexers, request to Jackett server failed, is server running ?" , "danger" , "glyphicon glyphicon-alert" ) ;
2017-06-29 05:53:25 +00:00
} ) ;
}
function displayConfiguredIndexersList ( indexers ) {
var indexersTemplate = Handlebars . compile ( $ ( "#configured-indexer-table" ) . html ( ) ) ;
var indexersTable = $ ( indexersTemplate ( { indexers : indexers , total _configured _indexers : indexers . length } ) ) ;
prepareTestButtons ( indexersTable ) ;
prepareSearchButtons ( indexersTable ) ;
prepareSetupButtons ( indexersTable ) ;
prepareDeleteButtons ( indexersTable ) ;
prepareCopyButtons ( indexersTable ) ;
indexersTable . find ( "table" ) . dataTable (
{
"stateSave" : true ,
"pageLength" : - 1 ,
"lengthMenu" : [ [ 10 , 20 , 50 , 100 , 250 , 500 , - 1 ] , [ 10 , 20 , 50 , 100 , 250 , 500 , "All" ] ] ,
"order" : [ [ 0 , "asc" ] ] ,
"columnDefs" : [
{
"targets" : 0 ,
"visible" : true ,
"searchable" : true ,
"orderable" : true
} ,
{
"targets" : 1 ,
"visible" : true ,
"searchable" : true ,
"orderable" : true
}
]
} ) ;
$ ( '#indexers' ) . empty ( ) ;
$ ( '#indexers' ) . append ( indexersTable ) ;
$ ( '#indexers' ) . fadeIn ( ) ;
}
function displayUnconfiguredIndexersList ( ) {
var UnconfiguredIndexersDialog = $ ( $ ( "#select-indexer" ) . html ( ) ) ;
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
var indexersTemplate = Handlebars . compile ( $ ( "#unconfigured-indexer-table" ) . html ( ) ) ;
var indexersTable = $ ( indexersTemplate ( { indexers : unconfiguredIndexers , total _unconfigured _indexers : unconfiguredIndexers . length } ) ) ;
indexersTable . find ( '.indexer-setup' ) . each ( function ( i , btn ) {
2017-08-08 15:02:16 +00:00
var indexer = unconfiguredIndexers [ i ] ;
$ ( btn ) . click ( function ( ) {
$ ( '#select-indexer-modal' ) . modal ( 'hide' ) . on ( 'hidden.bs.modal' , function ( e ) {
2017-10-01 09:28:10 +00:00
displayIndexerSetup ( indexer . id , indexer . name , indexer . caps , indexer . link , indexer . alternativesitelinks , indexer . description ) ;
2017-08-08 15:02:16 +00:00
} ) ;
} ) ;
} ) ;
indexersTable . find ( '.indexer-add' ) . each ( function ( i , btn ) {
$ ( btn ) . click ( function ( ) {
2017-06-29 05:53:25 +00:00
$ ( '#select-indexer-modal' ) . modal ( 'hide' ) . on ( 'hidden.bs.modal' , function ( e ) {
2017-08-08 15:02:16 +00:00
var indexerId = $ ( btn ) . attr ( "data-id" ) ;
api . getIndexerConfig ( indexerId , function ( data ) {
if ( data . result !== undefined && data . result == "error" ) {
doNotify ( "Error: " + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
return ;
}
api . updateIndexerConfig ( indexerId , data , function ( data ) {
if ( data == undefined ) {
reloadIndexers ( ) ;
doNotify ( "Successfully configured " + name , "success" , "glyphicon glyphicon-ok" ) ;
} else if ( data . result == "error" ) {
if ( data . config ) {
populateConfigItems ( configForm , data . config ) ;
}
doNotify ( "Configuration failed: " + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
}
2017-08-20 12:54:34 +00:00
} ) . fail ( function ( data ) {
2019-04-20 21:52:09 +00:00
if ( data . responseJSON . error !== undefined ) {
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[" . length - indexerId . length - "] " . length - " (Config)" . length ; // keep url <= 2k #5104
doNotify ( "An error occured while configuring this indexer<br /><b>" + data . responseJSON . error . substring ( 0 , indexEnd ) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data . responseJSON . error . substring ( 0 , indexEnd ) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>" , "danger" , "glyphicon glyphicon-alert" , false ) ;
} else {
doNotify ( "An error occured while configuring this indexer, is Jackett server running ?" , "danger" , "glyphicon glyphicon-alert" ) ;
}
2017-08-08 15:02:16 +00:00
} ) ;
} ) ;
2017-06-29 05:53:25 +00:00
} ) ;
} ) ;
} ) ;
indexersTable . find ( "table" ) . DataTable (
{
"stateSave" : true ,
"fnStateSaveParams" : function ( oSettings , sValue ) {
sValue . search . search = "" ; // don't save the search filter content
return sValue ;
} ,
"bAutoWidth" : false ,
"pageLength" : - 1 ,
"lengthMenu" : [ [ 10 , 20 , 50 , 100 , 250 , 500 , - 1 ] , [ 10 , 20 , 50 , 100 , 250 , 500 , "All" ] ] ,
"order" : [ [ 0 , "asc" ] ] ,
"columnDefs" : [
{
"name" : "name" ,
"targets" : 0 ,
"visible" : true ,
"searchable" : true ,
"orderable" : true
} ,
{
"name" : "description" ,
"targets" : 1 ,
"visible" : true ,
"searchable" : true ,
"orderable" : true
} ,
{
"name" : "type" ,
"targets" : 2 ,
"visible" : true ,
"searchable" : true ,
"orderable" : true
} ,
{
"name" : "type_string" ,
"targets" : 3 ,
"visible" : false ,
"searchable" : true ,
"orderable" : true ,
} ,
{
"name" : "language" ,
"targets" : 4 ,
"visible" : true ,
"searchable" : true ,
"orderable" : true
} ,
{
"name" : "buttons" ,
"targets" : 5 ,
"visible" : true ,
"searchable" : false ,
"orderable" : false
}
]
} ) ;
var undefindexers = UnconfiguredIndexersDialog . find ( '#unconfigured-indexers' ) ;
undefindexers . append ( indexersTable ) ;
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
UnconfiguredIndexersDialog . on ( 'shown.bs.modal' , function ( ) {
$ ( this ) . find ( 'div.dataTables_filter input' ) . focusWithoutScrolling ( ) ;
} ) ;
UnconfiguredIndexersDialog . on ( 'hidden.bs.modal' , function ( e ) {
$ ( '#indexers div.dataTables_filter input' ) . focusWithoutScrolling ( ) ;
} ) ;
$ ( "#modals" ) . append ( UnconfiguredIndexersDialog ) ;
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
UnconfiguredIndexersDialog . modal ( "show" ) ;
}
function copyToClipboard ( text ) {
// create hidden text element, if it doesn't already exist
var targetId = "_hiddenCopyText_" ;
// must use a temporary form element for the selection and copy
target = document . getElementById ( targetId ) ;
if ( ! target ) {
var target = document . createElement ( "textarea" ) ;
target . style . position = "fixed" ;
target . style . left = "-9999px" ;
target . style . top = "0" ;
target . id = targetId ;
document . body . appendChild ( target ) ;
}
target . textContent = text ;
// select the content
var currentFocus = document . activeElement ;
target . focus ( ) ;
target . setSelectionRange ( 0 , target . value . length ) ;
// copy the selection
var succeed ;
try {
succeed = document . execCommand ( "copy" ) ;
2020-02-01 18:35:20 +00:00
doNotify ( "Copied to clipboard!" , "success" , "glyphicon glyphicon-ok" ) ;
2017-06-29 05:53:25 +00:00
} catch ( e ) {
succeed = false ;
}
// restore original focus
if ( currentFocus && typeof currentFocus . focus === "function" ) {
$ ( currentFocus ) . focusWithoutScrolling ( ) ;
}
target . textContent = "" ;
return succeed ;
}
function prepareCopyButtons ( element ) {
element . find ( ".indexer-button-copy" ) . each ( function ( i , btn ) {
var $btn = $ ( btn ) ;
var title = $btn [ 0 ] . title ;
$btn . click ( function ( ) {
copyToClipboard ( title ) ;
return false ;
} ) ;
} ) ;
}
function prepareDeleteButtons ( element ) {
element . find ( ".indexer-button-delete" ) . each ( function ( i , btn ) {
var $btn = $ ( btn ) ;
var id = $btn . data ( "id" ) ;
$btn . click ( function ( ) {
2017-08-08 15:02:16 +00:00
api . deleteIndexer ( id , function ( data ) {
if ( data == undefined ) {
2017-06-29 05:53:25 +00:00
doNotify ( "Deleted " + id , "success" , "glyphicon glyphicon-ok" ) ;
2017-08-08 15:02:16 +00:00
} else if ( data . result == "error" ) {
doNotify ( "Delete error for " + id + "\n" + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
2017-06-29 05:53:25 +00:00
}
} ) . fail ( function ( ) {
doNotify ( "Error deleting indexer, request to Jackett server error" , "danger" , "glyphicon glyphicon-alert" ) ;
} ) . always ( function ( ) {
reloadIndexers ( ) ;
} ) ;
} ) ;
} ) ;
}
function prepareSearchButtons ( element ) {
element . find ( '.indexer-button-search' ) . each ( function ( i , btn ) {
var $btn = $ ( btn ) ;
var id = $btn . data ( "id" ) ;
$btn . click ( function ( ) {
2017-08-28 16:54:57 +00:00
window . location . hash = "search&tracker=" + id ;
2017-06-29 05:53:25 +00:00
showSearch ( id ) ;
} ) ;
} ) ;
}
function prepareSetupButtons ( element ) {
element . find ( '.indexer-setup' ) . each ( function ( i , btn ) {
2017-08-08 15:02:16 +00:00
var indexer = configuredIndexers [ i ] ;
$ ( btn ) . click ( function ( ) {
2017-10-01 09:28:10 +00:00
displayIndexerSetup ( indexer . id , indexer . name , indexer . caps , indexer . link , indexer . alternativesitelinks , indexer . description ) ;
2017-06-29 05:53:25 +00:00
} ) ;
} ) ;
}
function updateTestState ( id , state , message , parent )
{
var btn = parent . find ( ".indexer-button-test[data-id=" + id + "]" ) ;
var sortmsg = message ;
if ( ! sortmsg || state == "success" )
sortmsg = "" ;
var td = btn . closest ( "td" ) ;
td . attr ( "data-sort" , sortmsg ) ;
td . attr ( "data-filter" , sortmsg ) ;
if ( message ) {
btn . tooltip ( "hide" ) ;
btn . attr ( "title" , message ) ;
btn . data ( 'bs.tooltip' , false ) . tooltip ( { title : message } ) ;
}
var icon = btn . find ( "span" ) ;
icon . removeClass ( "glyphicon-ok test-success glyphicon-alert test-error glyphicon-refresh spinner test-inprogres" ) ;
if ( state == "success" ) {
icon . addClass ( "glyphicon-ok test-success" ) ;
} else if ( state == "error" ) {
icon . addClass ( "glyphicon-alert test-error" ) ;
} else if ( state == "inprogres" ) {
icon . addClass ( "glyphicon-refresh test-inprogres spinner" ) ;
}
var dt = $ . fn . dataTable . tables ( { visible : true , api : true } ) . rows ( ) . invalidate ( 'dom' ) ;
if ( state != "inprogres" )
dt . draw ( ) ;
}
function testIndexer ( id , notifyResult ) {
var indexers = $ ( '#indexers' ) ;
updateTestState ( id , "inprogres" , null , indexers ) ;
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
if ( notifyResult )
doNotify ( "Test started for " + id , "info" , "glyphicon glyphicon-transfer" ) ;
2017-08-08 15:02:16 +00:00
api . testIndexer ( id , function ( data ) {
if ( data == undefined ) {
2017-06-29 05:53:25 +00:00
updateTestState ( id , "success" , "Test successful" , indexers ) ;
if ( notifyResult )
doNotify ( "Test successful for " + id , "success" , "glyphicon glyphicon-ok" ) ;
2017-08-08 15:02:16 +00:00
} else if ( data . result == "error" ) {
updateTestState ( id , "error" , data . error , indexers ) ;
if ( notifyResult )
doNotify ( "Test failed for " + id + ": \n" + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
2017-06-29 05:53:25 +00:00
}
2017-08-20 12:54:34 +00:00
} ) . fail ( function ( data ) {
2019-04-20 21:52:09 +00:00
updateTestState ( id , "error" , data . error , indexers ) ;
if ( data . responseJSON . error !== undefined && notifyResult ) {
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[" . length - id . length - "] " . length - " (Test)" . length ; // keep url <= 2k #5104
doNotify ( "An error occured while testing this indexer<br /><b>" + data . responseJSON . error . substring ( 0 , indexEnd ) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + id + "] " + data . responseJSON . error . substring ( 0 , indexEnd ) + " (Test)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>" , "danger" , "glyphicon glyphicon-alert" , false ) ;
} else {
doNotify ( "An error occured while testing indexers, please take a look at indexers with failed test for more informations." , "danger" , "glyphicon glyphicon-alert" ) ;
}
2017-06-29 05:53:25 +00:00
} ) ;
}
function prepareTestButtons ( element ) {
element . find ( ".indexer-button-test" ) . each ( function ( i , btn ) {
var $btn = $ ( btn ) ;
var id = $btn . data ( "id" ) ;
var state = $btn . data ( "state" ) ;
var title = $btn . attr ( "title" ) ;
$btn . tooltip ( ) ;
updateTestState ( id , state , title , element ) ;
$btn . click ( function ( ) {
testIndexer ( id , true ) ;
} ) ;
} ) ;
}
2017-10-01 09:28:10 +00:00
function displayIndexerSetup ( id , name , caps , link , alternativesitelinks , description ) {
2017-08-08 15:02:16 +00:00
api . getIndexerConfig ( id , function ( data ) {
if ( data . result !== undefined && data . result == "error" ) {
2017-06-29 05:53:25 +00:00
doNotify ( "Error: " + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
return ;
}
2017-10-01 09:28:10 +00:00
populateSetupForm ( id , name , data , caps , link , alternativesitelinks , description ) ;
2017-06-29 05:53:25 +00:00
} ) . fail ( function ( ) {
doNotify ( "Request to Jackett server failed" , "danger" , "glyphicon glyphicon-alert" ) ;
} ) ;
$ ( "#select-indexer-modal" ) . modal ( "hide" ) ;
}
function populateConfigItems ( configForm , config ) {
// Set flag so we show fields named password as a password input
for ( var i = 0 ; i < config . length ; i ++ ) {
config [ i ] . ispassword = config [ i ] . id . toLowerCase ( ) === 'password' ;
}
var $formItemContainer = configForm . find ( ".config-setup-form" ) ;
$formItemContainer . empty ( ) ;
$ ( '.jackettrecaptcha' ) . remove ( ) ;
var hasReacaptcha = false ;
var captchaItem = null ;
for ( var i = 0 ; i < config . length ; i ++ ) {
if ( config [ i ] . type === 'recaptcha' ) {
hasReacaptcha = true ;
captchaItem = config [ i ] ;
}
2018-04-26 17:29:03 +00:00
else if ( config [ i ] . id === 'cookieheader' && hasReacaptcha ) { // inject cookie into captcha item
captchaItem . cookieheader = config [ i ] . value ;
console . log ( captchaItem ) ;
}
2017-06-29 05:53:25 +00:00
}
var setupItemTemplate = Handlebars . compile ( $ ( "#setup-item" ) . html ( ) ) ;
2018-04-26 17:29:03 +00:00
if ( hasReacaptcha && ! window . jackettIsLocal && false ) { // disable this for now, use inline cookie (below)
2017-06-29 05:53:25 +00:00
var setupValueTemplate = Handlebars . compile ( $ ( "#setup-item-nonlocalrecaptcha" ) . html ( ) ) ;
captchaItem . value _element = setupValueTemplate ( captchaItem ) ;
var template = setupItemTemplate ( captchaItem ) ;
$formItemContainer . append ( template ) ;
} else {
for ( var i = 0 ; i < config . length ; i ++ ) {
var item = config [ i ] ;
2018-04-26 17:29:03 +00:00
if ( ( item . id === 'username' || item . id === 'password' ) && hasReacaptcha ) {
continue ; // skip username/password if there's a recaptcha
}
if ( item . type != 'recaptcha' ) {
var setupValueTemplate = Handlebars . compile ( $ ( "#setup-item-" + item . type ) . html ( ) ) ;
item . value _element = setupValueTemplate ( item ) ;
var template = setupItemTemplate ( item ) ;
$formItemContainer . append ( template ) ;
}
2017-06-29 05:53:25 +00:00
if ( item . type === 'recaptcha' ) {
2018-04-26 17:29:03 +00:00
// inject cookie dialog until recaptcha can be solved again
var setupValueTemplate = Handlebars . compile ( $ ( "#setup-item-nonlocalrecaptcha" ) . html ( ) ) ;
captchaItem . value _element = setupValueTemplate ( captchaItem ) ;
var template = setupItemTemplate ( captchaItem ) ;
$formItemContainer . append ( template ) ;
/ *
2017-06-29 05:53:25 +00:00
var jackettrecaptcha = $ ( '.jackettrecaptcha' ) ;
jackettrecaptcha . data ( "version" , item . version ) ;
switch ( item . version ) {
case "1" :
// The v1 reCAPTCHA code uses document.write() calls to write the CAPTCHA to the location where the script was loaded.
// As it's loaded async this doesn't work.
// We use an iframe to work around this problem.
var html = '<script type="text/javascript" src="https://www.google.com/recaptcha/api/challenge?k=' + encodeURIComponent ( item . sitekey ) + '"></script>' ;
var frame = document . createElement ( 'iframe' ) ;
frame . id = "jackettrecaptchaiframe" ;
frame . style . height = "145px" ;
frame . style . weight = "326px" ;
frame . style . border = "none" ;
frame . onload = function ( ) {
// auto resize iframe to content
frame . style . height = frame . contentWindow . document . body . scrollHeight + 'px' ;
frame . style . width = frame . contentWindow . document . body . scrollWidth + 'px' ;
}
jackettrecaptcha . append ( frame ) ;
frame . contentDocument . open ( ) ;
frame . contentDocument . write ( html ) ;
frame . contentDocument . close ( ) ;
break ;
case "2" :
grecaptcha . render ( jackettrecaptcha [ 0 ] , {
'sitekey' : item . sitekey
} ) ;
break ;
}
2018-04-26 17:29:03 +00:00
* /
2017-06-29 05:53:25 +00:00
}
}
}
}
2017-10-01 09:28:10 +00:00
function newConfigModal ( title , config , caps , link , alternativesitelinks , description ) {
2017-06-29 05:53:25 +00:00
var configTemplate = Handlebars . compile ( $ ( "#jackett-config-setup-modal" ) . html ( ) ) ;
2017-10-01 09:28:10 +00:00
var configForm = $ ( configTemplate ( { title : title , caps : caps , link : link , description : description } ) ) ;
2017-06-29 05:53:25 +00:00
$ ( "#modals" ) . append ( configForm ) ;
populateConfigItems ( configForm , config ) ;
if ( alternativesitelinks . length >= 1 ) {
var AlternativeSiteLinksTemplate = Handlebars . compile ( $ ( "#setup-item-alternativesitelinks" ) . html ( ) ) ;
var template = $ ( AlternativeSiteLinksTemplate ( { "alternativesitelinks" : alternativesitelinks } ) ) ;
configForm . find ( "div[data-id='sitelink']" ) . after ( template ) ;
2017-08-31 09:12:50 +00:00
template . find ( "a.alternativesitelink" ) . click ( function ( a ) {
$ ( "div[data-id='sitelink'] input" ) . val ( this . href ) ;
return false ;
} ) ;
2017-06-29 05:53:25 +00:00
}
return configForm ;
}
function getConfigModalJson ( configForm ) {
var configJson = [ ] ;
configForm . find ( ".config-setup-form" ) . children ( ) . each ( function ( i , el ) {
$el = $ ( el ) ;
var type = $el . data ( "type" ) ;
var id = $el . data ( "id" ) ;
var itemEntry = { id : id } ;
switch ( type ) {
case "hiddendata" :
itemEntry . value = $el . find ( ".setup-item-hiddendata input" ) . val ( ) ;
break ;
case "inputstring" :
itemEntry . value = $el . find ( ".setup-item-inputstring input" ) . val ( ) ;
break ;
case "inputbool" :
itemEntry . value = $el . find ( ".setup-item-inputbool input" ) . is ( ":checked" ) ;
break ;
2020-02-19 20:23:55 +00:00
case "inputcheckbox" :
itemEntry . values = [ ] ;
$el . find ( ".setup-item-inputcheckbox input:checked" ) . each ( function ( ) {
itemEntry . values . push ( $ ( this ) . val ( ) ) ;
} ) ;
2017-06-29 05:53:25 +00:00
case "inputselect" :
itemEntry . value = $el . find ( ".setup-item-inputselect select" ) . val ( ) ;
break ;
case "recaptcha" :
if ( window . jackettIsLocal ) {
var version = $el . find ( '.jackettrecaptcha' ) . data ( "version" ) ;
switch ( version ) {
case "1" :
var frameDoc = $ ( "#jackettrecaptchaiframe" ) [ 0 ] . contentDocument ;
itemEntry . version = version ;
itemEntry . challenge = $ ( "#recaptcha_challenge_field" , frameDoc ) . val ( )
itemEntry . value = $ ( "#recaptcha_response_field" , frameDoc ) . val ( )
break ;
case "2" :
itemEntry . value = $ ( '.g-recaptcha-response' ) . val ( ) ;
break ;
}
} else {
itemEntry . cookie = $el . find ( ".setup-item-recaptcha input" ) . val ( ) ;
}
break ;
}
configJson . push ( itemEntry )
} ) ;
return configJson ;
}
2017-10-01 09:28:10 +00:00
function populateSetupForm ( indexerId , name , config , caps , link , alternativesitelinks , description ) {
var configForm = newConfigModal ( name , config , caps , link , alternativesitelinks , description ) ;
2017-06-29 05:53:25 +00:00
var $goButton = configForm . find ( ".setup-indexer-go" ) ;
$goButton . click ( function ( ) {
2017-08-08 15:02:16 +00:00
var data = getConfigModalJson ( configForm ) ;
2017-06-29 05:53:25 +00:00
var originalBtnText = $goButton . html ( ) ;
$goButton . prop ( 'disabled' , true ) ;
$goButton . html ( $ ( '#spinner' ) . html ( ) ) ;
2017-08-08 15:02:16 +00:00
api . updateIndexerConfig ( indexerId , data , function ( data ) {
if ( data == undefined ) {
configForm . modal ( "hide" ) ;
reloadIndexers ( ) ;
doNotify ( "Successfully configured " + name , "success" , "glyphicon glyphicon-ok" ) ;
} else if ( data . result == "error" ) {
2017-06-29 05:53:25 +00:00
if ( data . config ) {
populateConfigItems ( configForm , data . config ) ;
}
doNotify ( "Configuration failed: " + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
}
2017-08-20 11:11:46 +00:00
} ) . fail ( function ( data ) {
2019-04-20 21:52:09 +00:00
if ( data . responseJSON . error !== undefined ) {
var indexEnd = 2048 - "https://github.com/Jackett/Jackett/issues/new?title=[" . length - indexerId . length - "] " . length - " (Config)" . length ; // keep url <= 2k #5104
doNotify ( "An error occured while updating this indexer<br /><b>" + data . responseJSON . error . substring ( 0 , indexEnd ) + "</b><br /><i><a href=\"https://github.com/Jackett/Jackett/issues/new?title=[" + indexerId + "] " + data . responseJSON . error . substring ( 0 , indexEnd ) + " (Config)\" target=\"_blank\">Click here to open an issue on GitHub for this indexer.</a><i>" , "danger" , "glyphicon glyphicon-alert" , false ) ;
} else {
doNotify ( "An error occured while updating this indexer, request to Jackett server failed, is server running ?" , "danger" , "glyphicon glyphicon-alert" ) ;
}
2017-06-29 05:53:25 +00:00
} ) . always ( function ( ) {
$goButton . html ( originalBtnText ) ;
$goButton . prop ( 'disabled' , false ) ;
} ) ;
} ) ;
configForm . on ( 'hidden.bs.modal' , function ( e ) {
$ ( '#indexers div.dataTables_filter input' ) . focusWithoutScrolling ( ) ;
} ) ;
configForm . modal ( "show" ) ;
}
function resolveUrl ( url ) {
var a = document . createElement ( 'a' ) ;
a . href = url ;
url = a . href ;
return url ;
}
function doNotify ( message , type , icon , autoHide ) {
if ( typeof autoHide === "undefined" || autoHide === null )
autoHide = true ;
var delay = 5000 ;
if ( ! autoHide )
delay = - 1 ;
$ . notify ( {
message : message ,
icon : icon
} , {
element : 'body' ,
autoHide : autoHide ,
delay : delay ,
type : type ,
allow _dismiss : true ,
z _index : 9000 ,
mouse _over : 'pause' ,
placement : {
from : "bottom" ,
align : "center"
}
} ) ;
}
function clearNotifications ( ) {
$ ( '[data-notify="container"]' ) . remove ( ) ;
}
function updateReleasesRow ( row )
2017-08-08 15:02:16 +00:00
{
2017-06-29 05:53:25 +00:00
var labels = $ ( row ) . find ( "span.release-labels" ) ;
var TitleLink = $ ( row ) . find ( "td.Title > a" ) ;
var IMDBId = $ ( row ) . data ( "imdb" ) ;
var Banner = $ ( row ) . data ( "banner" ) ;
var Description = $ ( row ) . data ( "description" ) ;
var DownloadVolumeFactor = parseFloat ( $ ( row ) . find ( "td.DownloadVolumeFactor" ) . html ( ) ) ;
var UploadVolumeFactor = parseFloat ( $ ( row ) . find ( "td.UploadVolumeFactor" ) . html ( ) ) ;
var TitleTooltip = "" ;
if ( Banner )
TitleTooltip += "<img src='" + Banner + "' /><br />" ;
if ( Description )
TitleTooltip += Description ;
if ( TitleTooltip ) {
TitleLink . data ( "toggle" , "tooltip" ) ;
TitleLink . tooltip ( {
title : TitleTooltip ,
html : true
} ) ;
}
labels . empty ( ) ;
if ( IMDBId ) {
2019-10-06 21:16:35 +00:00
labels . append ( '\n<a href="http://www.imdb.com/title/tt' + ( "0000000" + IMDBId ) . slice ( - 8 ) + '/" class="label label-imdb" alt="IMDB" title="IMDB">IMDB</a>' ) ;
2017-06-29 05:53:25 +00:00
}
if ( ! isNaN ( DownloadVolumeFactor ) ) {
if ( DownloadVolumeFactor == 0 ) {
labels . append ( '\n<span class="label label-success">FREELEECH</span>' ) ;
} else if ( DownloadVolumeFactor < 1 ) {
2018-07-30 11:02:09 +00:00
labels . append ( '\n<span class="label label-primary">' + ( DownloadVolumeFactor * 100 ) . toFixed ( 0 ) + '%DL</span>' ) ;
2017-06-29 05:53:25 +00:00
} else if ( DownloadVolumeFactor > 1 ) {
2018-07-30 11:02:09 +00:00
labels . append ( '\n<span class="label label-danger">' + ( DownloadVolumeFactor * 100 ) . toFixed ( 0 ) + '%DL</span>' ) ;
2017-06-29 05:53:25 +00:00
}
}
if ( ! isNaN ( UploadVolumeFactor ) ) {
if ( UploadVolumeFactor == 0 ) {
labels . append ( '\n<span class="label label-warning">NO UPLOAD</span>' ) ;
} else if ( UploadVolumeFactor != 1 ) {
2018-07-30 11:02:09 +00:00
labels . append ( '\n<span class="label label-info">' + ( UploadVolumeFactor * 100 ) . toFixed ( 0 ) + '%UL</span>' ) ;
2017-06-29 05:53:25 +00:00
}
}
}
2017-08-28 16:54:57 +00:00
function showSearch ( selectedIndexer , query , category ) {
2017-08-30 15:40:32 +00:00
var selectedIndexers = [ ]
if ( selectedIndexer )
selectedIndexers = selectedIndexer . split ( "," ) ;
2017-06-29 05:53:25 +00:00
$ ( '#select-indexer-modal' ) . remove ( ) ;
var releaseTemplate = Handlebars . compile ( $ ( "#jackett-search" ) . html ( ) ) ;
var releaseDialog = $ ( releaseTemplate ( {
indexers : configuredIndexers
} ) ) ;
$ ( "#modals" ) . append ( releaseDialog ) ;
releaseDialog . on ( 'shown.bs.modal' , function ( ) {
releaseDialog . find ( '#searchquery' ) . focusWithoutScrolling ( ) ;
} ) ;
releaseDialog . on ( 'hidden.bs.modal' , function ( e ) {
$ ( '#indexers div.dataTables_filter input' ) . focusWithoutScrolling ( ) ;
2017-08-11 23:04:07 +00:00
window . location . hash = '' ;
2017-06-29 05:53:25 +00:00
} ) ;
2017-08-30 15:40:32 +00:00
var setCategories = function ( trackers , items ) {
2017-06-29 05:53:25 +00:00
var cats = { } ;
for ( var i = 0 ; i < items . length ; i ++ ) {
2017-08-30 15:40:32 +00:00
if ( trackers . length == 0 || $ . inArray ( items [ i ] . id , trackers ) !== - 1 ) {
for ( var j in items [ i ] . caps ) {
var cat = items [ i ] . caps [ j ]
if ( cat . ID < 100000 || trackers . length == 1 )
cats [ cat . ID ] = cat . Name ;
2017-06-29 05:53:25 +00:00
}
}
}
var select = $ ( '#searchCategory' ) ;
2017-08-30 15:40:32 +00:00
var selected = select . val ( ) ;
var options = [ ]
$ . each ( cats , function ( ID , Name ) {
options . push ( { label : ID + ' (' + Name + ')' , value : ID } ) ;
2017-06-29 05:53:25 +00:00
} ) ;
2017-08-30 15:40:32 +00:00
select . multiselect ( 'dataprovider' , options ) ;
select . val ( selected ) . multiselect ( "refresh" ) ;
2017-06-29 05:53:25 +00:00
} ;
$ ( '#searchTracker' ) . change ( jQuery . proxy ( function ( ) {
2017-08-30 15:40:32 +00:00
var trackerIds = $ ( '#searchTracker' ) . val ( ) ;
setCategories ( trackerIds , this . items ) ;
2017-06-29 05:53:25 +00:00
} , { items : configuredIndexers } ) ) ;
2017-07-23 00:08:19 +00:00
var queryField = document . getElementById ( "searchquery" ) ;
queryField . addEventListener ( "keyup" , function ( event ) {
2017-06-29 05:53:25 +00:00
event . preventDefault ( ) ;
if ( event . keyCode == 13 ) {
document . getElementById ( "jackett-search-perform" ) . click ( ) ;
}
} ) ;
2017-07-23 00:08:19 +00:00
var searchButton = $ ( '#jackett-search-perform' ) ;
searchButton . click ( function ( ) {
2017-06-29 05:53:25 +00:00
if ( $ ( '#jackett-search-perform span' ) . hasClass ( "spinner" ) ) {
// We are searchin already
return ;
}
2017-08-08 15:02:16 +00:00
var searchString = releaseDialog . find ( '#searchquery' ) . val ( ) ;
2017-06-29 05:53:25 +00:00
var queryObj = {
2017-08-08 15:02:16 +00:00
Query : searchString ,
2017-06-29 05:53:25 +00:00
Category : releaseDialog . find ( '#searchCategory' ) . val ( ) ,
2017-08-30 15:40:32 +00:00
Tracker : releaseDialog . find ( '#searchTracker' ) . val ( )
2017-06-29 05:53:25 +00:00
} ;
2017-08-30 15:40:32 +00:00
window . location . hash = $ . param ( { search : queryObj . Query , tracker : queryObj . Tracker . join ( "," ) , category : queryObj . Category . join ( "," ) } ) ;
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
$ ( '#jackett-search-perform' ) . html ( $ ( '#spinner' ) . html ( ) ) ;
$ ( '#searchResults div.dataTables_filter input' ) . val ( "" ) ;
clearSearchResultTable ( $ ( '#searchResults' ) ) ;
2017-08-08 15:02:16 +00:00
2017-08-30 15:40:32 +00:00
var trackerId = "all" ;
2017-08-08 15:02:16 +00:00
api . resultsForIndexer ( trackerId , queryObj , function ( data ) {
2017-06-29 05:53:25 +00:00
for ( var i = 0 ; i < data . Results . length ; i ++ ) {
var item = data . Results [ i ] ;
item . Title = insertWordWrap ( item . Title ) ;
item . CategoryDesc = insertWordWrap ( item . CategoryDesc ) ;
}
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
$ ( '#jackett-search-perform' ) . html ( $ ( '#search-button-ready' ) . html ( ) ) ;
var searchResults = $ ( '#searchResults' ) ;
searchResults . empty ( ) ;
var datatable = updateSearchResultTable ( searchResults , data ) . search ( '' ) . columns ( ) . search ( '' ) . draw ( ) ;
searchResults . find ( 'div.dataTables_filter input' ) . focusWithoutScrolling ( ) ;
} ) . fail ( function ( ) {
$ ( '#jackett-search-perform' ) . html ( $ ( '#search-button-ready' ) . html ( ) ) ;
doNotify ( "Request to Jackett server failed" , "danger" , "glyphicon glyphicon-alert" ) ;
} ) ;
} ) ;
var searchTracker = releaseDialog . find ( "#searchTracker" ) ;
2017-08-30 15:40:32 +00:00
var searchCategory = releaseDialog . find ( '#searchCategory' )
searchCategory . multiselect ( {
maxHeight : 400 ,
enableFiltering : true ,
includeSelectAllOption : true ,
enableCaseInsensitiveFiltering : true ,
nonSelectedText : 'Any'
} ) ;
if ( selectedIndexers )
searchTracker . val ( selectedIndexers ) ;
2017-06-29 05:53:25 +00:00
searchTracker . trigger ( "change" ) ;
updateSearchResultTable ( $ ( '#searchResults' ) , [ ] ) ;
clearSearchResultTable ( $ ( '#searchResults' ) ) ;
2017-08-30 15:40:32 +00:00
searchTracker . multiselect ( {
maxHeight : 400 ,
enableFiltering : true ,
includeSelectAllOption : true ,
enableCaseInsensitiveFiltering : true ,
nonSelectedText : 'All'
} ) ;
2020-02-19 20:23:55 +00:00
2017-07-23 00:08:19 +00:00
2017-08-28 16:54:57 +00:00
if ( category !== undefined ) {
2017-08-30 15:40:32 +00:00
searchCategory . val ( category . split ( "," ) ) ;
searchCategory . multiselect ( "refresh" ) ;
2017-08-28 16:54:57 +00:00
}
2017-08-30 15:40:32 +00:00
releaseDialog . modal ( "show" ) ;
2017-07-23 00:08:19 +00:00
if ( query !== undefined ) {
2017-08-28 16:54:57 +00:00
queryField . value = query ;
2017-07-23 00:08:19 +00:00
searchButton . click ( ) ;
}
2017-06-29 05:53:25 +00:00
}
function clearSearchResultTable ( element ) {
element . find ( "#jackett-search-results-datatable > tbody" ) . empty ( ) ;
element . find ( "#jackett-search-results-datatable > tfoot" ) . empty ( ) ;
element . find ( "#jackett-search-results-datatable_info" ) . empty ( ) ;
element . find ( "#jackett-search-results-datatable_paginate" ) . empty ( ) ;
}
// dataTable dead torrent filter
$ . fn . dataTable . ext . search = [
function ( settings , data , dataIndex ) {
if ( settings . sInstance != "jackett-search-results-datatable" )
return true ;
var deadfiltercheckbox = $ ( settings . nTableWrapper ) . find ( ".dataTables_deadfilter input" )
if ( ! deadfiltercheckbox . length ) {
return true ;
}
var seeders = data [ 9 ] ;
if ( ! deadfiltercheckbox . get ( 0 ) . checked && seeders == 0 )
return false ;
return true ;
}
]
function updateSearchResultTable ( element , results ) {
var resultsTemplate = Handlebars . compile ( $ ( "#jackett-search-results" ) . html ( ) ) ;
element . html ( $ ( resultsTemplate ( results ) ) ) ;
element . find ( 'tr.jackett-search-results-row' ) . each ( function ( ) { updateReleasesRow ( this ) ; } ) ;
var settings = { "deadfilter" : true } ;
var datatable = element . find ( 'table' ) . DataTable (
{
"fnStateSaveParams" : function ( oSettings , sValue ) {
sValue . search . search = "" ; // don't save the search filter content
sValue . deadfilter = settings . deadfilter ;
return sValue ;
} ,
"fnStateLoadParams" : function ( oSettings , sValue ) {
if ( "deadfilter" in sValue )
settings . deadfilter = sValue . deadfilter ;
} ,
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
"dom" : "lfr<\"dataTables_deadfilter\">tip" ,
"stateSave" : true ,
"bAutoWidth" : false ,
"pageLength" : 20 ,
"lengthMenu" : [ [ 10 , 20 , 50 , 100 , 250 , 500 , - 1 ] , [ 10 , 20 , 50 , 100 , 250 , 500 , "All" ] ] ,
"order" : [ [ 0 , "desc" ] ] ,
"columnDefs" : [
{
"targets" : 0 ,
"visible" : false ,
"searchable" : false ,
"type" : 'date'
} ,
{
"targets" : 1 ,
"visible" : true ,
"searchable" : false ,
"iDataSort" : 0
} ,
{
"targets" : 4 ,
"visible" : false ,
"searchable" : false ,
"type" : 'num'
} ,
2020-02-01 18:35:37 +00:00
{
"targets" : 5 ,
"visible" : true ,
"searchable" : false ,
"iDataSort" : 4
}
2017-06-29 05:53:25 +00:00
] ,
fnPreDrawCallback : function ( ) {
var table = this ;
var deadfilterdiv = element . find ( ".dataTables_deadfilter" ) ;
var deadfiltercheckbox = deadfilterdiv . find ( "input" ) ;
if ( ! deadfiltercheckbox . length ) {
2020-02-01 18:35:37 +00:00
deadfilterlabel = $ ( '<label><input type="checkbox" id="jackett-search-results-datatable_deadfilter_checkbox" value="1"> Show dead torrents</label>'
2017-06-29 05:53:25 +00:00
) ;
deadfilterdiv . append ( deadfilterlabel ) ;
2020-02-01 18:35:37 +00:00
deadfiltercheckbox = deadfilterlabel . find ( "input" ) ;
2017-06-29 05:53:25 +00:00
deadfiltercheckbox . on ( "change" , function ( ) {
settings . deadfilter = this . checked ;
table . api ( ) . draw ( ) ;
} ) ;
deadfiltercheckbox . prop ( 'checked' , settings . deadfilter ) ;
}
} ,
initComplete : function ( ) {
var count = 0 ;
this . api ( ) . columns ( ) . every ( function ( ) {
count ++ ;
if ( count === 3 || count === 8 ) {
var column = this ;
var select = $ ( '<select><option value=""></option></select>' )
. appendTo ( $ ( column . footer ( ) ) . empty ( ) )
. on ( 'change' , function ( ) {
var val = $ . fn . dataTable . util . escapeRegex (
$ ( this ) . val ( )
) ;
column
. search ( val ? '^' + val + '$' : '' , true , false )
. draw ( ) ;
} ) ;
column . data ( ) . unique ( ) . sort ( ) . each ( function ( d , j ) {
select . append ( '<option value="' + d + '">' + d + '</option>' )
} ) ;
}
} ) ;
}
} ) ;
return datatable ;
}
function bindUIButtons ( ) {
$ ( 'body' ) . on ( 'click' , '.downloadlink' , function ( e , b ) {
$ ( e . target ) . addClass ( 'jackettdownloaded' ) ;
} ) ;
$ ( 'body' ) . on ( 'click' , '.jacketdownloadserver' , function ( event ) {
var href = $ ( event . target ) . parent ( ) . attr ( 'href' ) ;
var jqxhr = $ . get ( href , function ( data ) {
if ( data . result == "error" ) {
doNotify ( "Error: " + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
return ;
} else {
doNotify ( "Downloaded sent to the blackhole successfully." , "success" , "glyphicon glyphicon-ok" ) ;
}
} ) . fail ( function ( ) {
doNotify ( "Request to Jackett server failed" , "danger" , "glyphicon glyphicon-alert" ) ;
} ) ;
event . preventDefault ( ) ;
return false ;
} ) ;
$ ( '#jackett-add-indexer' ) . click ( function ( ) {
$ ( "#modals" ) . empty ( ) ;
displayUnconfiguredIndexersList ( ) ;
} ) ;
$ ( "#jackett-test-all" ) . click ( function ( ) {
$ ( ".indexer-button-test" ) . each ( function ( i , btn ) {
var $btn = $ ( btn ) ;
var id = $btn . data ( "id" ) ;
testIndexer ( id , false ) ;
} ) ;
} ) ;
$ ( "#jackett-show-releases" ) . click ( function ( ) {
2017-08-08 15:02:16 +00:00
api . getServerCache ( function ( data ) {
2017-06-29 05:53:25 +00:00
for ( var i = 0 ; i < data . length ; i ++ ) {
var item = data [ i ] ;
item . Title = insertWordWrap ( item . Title ) ;
item . CategoryDesc = insertWordWrap ( item . CategoryDesc ) ;
}
var releaseTemplate = Handlebars . compile ( $ ( "#jackett-releases" ) . html ( ) ) ;
var item = { releases : data , Title : 'Releases' } ;
var releaseDialog = $ ( releaseTemplate ( item ) ) ;
var table = releaseDialog . find ( 'table' ) ;
releaseDialog . find ( 'tr.jackett-releases-row' ) . each ( function ( ) { updateReleasesRow ( this ) ; } ) ;
releaseDialog . on ( 'hidden.bs.modal' , function ( e ) {
$ ( '#indexers div.dataTables_filter input' ) . focusWithoutScrolling ( ) ;
} ) ;
2017-08-08 15:02:16 +00:00
2017-06-29 05:53:25 +00:00
table . DataTable (
{
"stateSave" : true ,
"bAutoWidth" : false ,
"pageLength" : 20 ,
"lengthMenu" : [ [ 10 , 20 , 50 , - 1 ] , [ 10 , 20 , 50 , "All" ] ] ,
"order" : [ [ 0 , "desc" ] ] ,
"columnDefs" : [
{
"targets" : 0 ,
"visible" : false ,
"searchable" : false ,
"type" : 'date'
} ,
{
"targets" : 1 ,
"visible" : false ,
"searchable" : false ,
"type" : 'date'
} ,
{
"targets" : 2 ,
"visible" : true ,
"searchable" : false ,
"iDataSort" : 0
} ,
{
"targets" : 3 ,
"visible" : true ,
"searchable" : false ,
"iDataSort" : 1
} ,
{
"targets" : 6 ,
"visible" : false ,
"searchable" : false ,
"type" : 'num'
} ,
{
"targets" : 7 ,
"visible" : true ,
"searchable" : false ,
"iDataSort" : 6
}
] ,
initComplete : function ( ) {
var count = 0 ;
this . api ( ) . columns ( ) . every ( function ( ) {
count ++ ;
if ( count === 5 || count === 10 ) {
var column = this ;
var select = $ ( '<select><option value=""></option></select>' )
. appendTo ( $ ( column . footer ( ) ) . empty ( ) )
. on ( 'change' , function ( ) {
var val = $ . fn . dataTable . util . escapeRegex (
$ ( this ) . val ( )
) ;
column
. search ( val ? '^' + val + '$' : '' , true , false )
. draw ( ) ;
} ) ;
column . data ( ) . unique ( ) . sort ( ) . each ( function ( d , j ) {
select . append ( '<option value="' + d + '">' + d + '</option>' )
} ) ;
}
} ) ;
}
} ) ;
$ ( "#modals" ) . append ( releaseDialog ) ;
releaseDialog . modal ( "show" ) ;
} ) . fail ( function ( ) {
doNotify ( "Request to Jackett server failed" , "danger" , "glyphicon glyphicon-alert" ) ;
} ) ;
} ) ;
$ ( "#jackett-show-search" ) . click ( function ( ) {
showSearch ( null ) ;
2017-08-08 15:02:16 +00:00
window . location . hash = "search" ;
2017-06-29 05:53:25 +00:00
} ) ;
$ ( "#view-jackett-logs" ) . click ( function ( ) {
2017-08-08 15:02:16 +00:00
api . getServerLogs ( function ( data ) {
2017-06-29 05:53:25 +00:00
var releaseTemplate = Handlebars . compile ( $ ( "#jackett-logs" ) . html ( ) ) ;
var item = { logs : data } ;
var releaseDialog = $ ( releaseTemplate ( item ) ) ;
$ ( "#modals" ) . append ( releaseDialog ) ;
releaseDialog . modal ( "show" ) ;
} ) . fail ( function ( ) {
doNotify ( "Request to Jackett server failed" , "danger" , "glyphicon glyphicon-alert" ) ;
} ) ;
} ) ;
$ ( "#change-jackett-port" ) . click ( function ( ) {
2017-08-08 15:02:16 +00:00
var jackett _port = Number ( $ ( "#jackett-port" ) . val ( ) ) ;
2017-06-29 05:53:25 +00:00
var jackett _basepathoverride = $ ( "#jackett-basepathoverride" ) . val ( ) ;
var jackett _external = $ ( "#jackett-allowext" ) . is ( ':checked' ) ;
2020-02-19 20:23:55 +00:00
var jackett _update = $ ( "#jackett-allowupdate" ) . is ( ':checked' ) ;
var jackett _prerelease = $ ( "#jackett-prerelease" ) . is ( ':checked' ) ;
2017-06-29 05:53:25 +00:00
var jackett _logging = $ ( "#jackett-logging" ) . is ( ':checked' ) ;
var jackett _omdb _key = $ ( "#jackett-omdbkey" ) . val ( ) ;
2018-07-09 10:37:24 +00:00
var jackett _omdb _url = $ ( "#jackett-omdburl" ) . val ( ) ;
2017-10-31 09:45:30 +00:00
var jackett _proxy _url = $ ( "#jackett-proxy-url" ) . val ( ) ;
2017-11-06 10:51:26 +00:00
var jackett _proxy _type = $ ( "#jackett-proxy-type" ) . val ( ) ;
2017-10-31 09:45:30 +00:00
var jackett _proxy _port = $ ( "#jackett-proxy-port" ) . val ( ) ;
var jackett _proxy _username = $ ( "#jackett-proxy-username" ) . val ( ) ;
var jackett _proxy _password = $ ( "#jackett-proxy-password" ) . val ( ) ;
2017-06-29 05:53:25 +00:00
var jsonObject = {
port : jackett _port ,
external : jackett _external ,
updatedisabled : jackett _update ,
prerelease : jackett _prerelease ,
blackholedir : $ ( "#jackett-savedir" ) . val ( ) ,
logging : jackett _logging ,
basepathoverride : jackett _basepathoverride ,
2017-10-31 09:45:30 +00:00
omdbkey : jackett _omdb _key ,
2018-07-09 10:37:24 +00:00
omdburl : jackett _omdb _url ,
2017-11-06 10:51:26 +00:00
proxy _type : jackett _proxy _type ,
2017-10-31 09:45:30 +00:00
proxy _url : jackett _proxy _url ,
proxy _port : jackett _proxy _port ,
proxy _username : jackett _proxy _username ,
proxy _password : jackett _proxy _password
2017-06-29 05:53:25 +00:00
} ;
2017-08-12 01:12:56 +00:00
api . updateServerConfig ( jsonObject , function ( data ) {
2017-08-30 09:50:11 +00:00
doNotify ( "Redirecting you to complete configuration update.." , "success" , "glyphicon glyphicon-ok" ) ;
window . setTimeout ( function ( ) {
window . location . reload ( true ) ;
} , 3000 ) ;
} ) . fail ( function ( data ) {
if ( data . responseJSON !== undefined && data . responseJSON . result == "error" ) {
doNotify ( "Error: " + data . responseJSON . error , "danger" , "glyphicon glyphicon-alert" ) ;
2017-06-29 05:53:25 +00:00
return ;
} else {
2017-08-30 09:50:11 +00:00
doNotify ( "Request to Jackett server failed" , "danger" , "glyphicon glyphicon-alert" ) ;
2017-06-29 05:53:25 +00:00
}
} ) ;
} ) ;
$ ( "#trigger-updater" ) . click ( function ( ) {
2017-08-08 15:02:16 +00:00
api . updateServer ( function ( data ) {
2017-06-29 05:53:25 +00:00
if ( data . result == "error" ) {
doNotify ( "Error: " + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
return ;
} else {
doNotify ( "Updater triggered see log for details.." , "success" , "glyphicon glyphicon-ok" ) ;
}
} ) . fail ( function ( ) {
doNotify ( "Request to Jackett server failed" , "danger" , "glyphicon glyphicon-alert" ) ;
} ) ;
} ) ;
$ ( "#change-jackett-password" ) . click ( function ( ) {
var password = $ ( "#jackett-adminpwd" ) . val ( ) ;
2017-08-08 15:02:16 +00:00
api . updateAdminPassword ( password , function ( data ) {
if ( data == undefined ) {
2017-06-29 05:53:25 +00:00
doNotify ( "Admin password has been set." , "success" , "glyphicon glyphicon-ok" ) ;
window . setTimeout ( function ( ) {
window . location = window . location . pathname ;
} , 1000 ) ;
2017-08-08 15:02:16 +00:00
} else if ( data . result == "error" ) {
doNotify ( "Error: " + data . error , "danger" , "glyphicon glyphicon-alert" ) ;
return ;
2017-06-29 05:53:25 +00:00
}
} ) . fail ( function ( ) {
doNotify ( "Request to Jackett server failed" , "danger" , "glyphicon glyphicon-alert" ) ;
} ) ;
} ) ;
2019-04-01 08:24:49 +00:00
$ ( '#jackett-proxy-url' ) . on ( 'input' , function ( ) {
proxyWarning ( $ ( this ) . val ( ) ) ;
} ) ;
}
function proxyWarning ( input ) {
2019-04-01 08:40:35 +00:00
if ( input != null && input . trim ( ) !== "" ) {
2019-04-01 08:24:49 +00:00
$ ( '#proxy-warning' ) . show ( ) ;
2019-04-01 08:40:35 +00:00
}
2019-04-01 08:24:49 +00:00
else
2019-04-01 08:40:35 +00:00
{
2019-04-01 08:24:49 +00:00
$ ( '#proxy-warning' ) . hide ( ) ;
2019-04-01 08:40:35 +00:00
}
2017-06-29 05:53:25 +00:00
}