Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0ae406b0a | ||
|
|
afdeaacbea | ||
|
|
f5124c9e79 | ||
|
|
5fe0d40023 | ||
|
|
3da2a8c091 | ||
|
|
cc3f4e6125 | ||
|
|
5643b5682f | ||
|
|
92a49d1736 | ||
|
|
ce9350cd8e | ||
|
|
04d67887d1 | ||
|
|
afd3df869b | ||
|
|
f6804fe009 | ||
|
|
eda7642af1 | ||
|
|
cab42a44f3 | ||
|
|
89b3c18e9f | ||
|
|
08560ae9ea | ||
|
|
1bcc993a99 | ||
|
|
2054c31575 | ||
|
|
a2278ea1b3 | ||
|
|
8feaae8061 | ||
|
|
a65a5d4b41 | ||
|
|
693b59cc0c | ||
|
|
b85e093d38 | ||
|
|
180cd6f3da | ||
|
|
1de601c505 | ||
|
|
97a481c73d | ||
|
|
4fdb715b54 | ||
|
|
8fbe463adf | ||
|
|
70ee174a47 | ||
|
|
7532f6b569 | ||
|
|
4013e616af | ||
|
|
19daeab0f3 | ||
|
|
4387234e71 | ||
|
|
ad92ec55f8 | ||
|
|
cba62676d0 | ||
|
|
05f50fc546 | ||
|
|
1ee25ac279 | ||
|
|
5ee0ad4a20 | ||
|
|
e52dd8d3f3 | ||
|
|
755afced61 | ||
|
|
0cdba27504 | ||
|
|
3636e3ce4b | ||
|
|
f98d55a14e | ||
|
|
b645314e50 | ||
|
|
95cae0e6c4 | ||
|
|
1fdf04e9c0 |
4
.gitignore
vendored
@@ -8,10 +8,10 @@ locale/
|
||||
srcdist/
|
||||
|
||||
# Generated email templates
|
||||
email/*.tmpl
|
||||
email/
|
||||
|
||||
# Romanian ro.po is generated from ro.px, due to mapping to latin-1
|
||||
ro.po
|
||||
po/*/ro.po
|
||||
|
||||
# Build results
|
||||
SABnzbd*.zip
|
||||
|
||||
13
ABOUT.txt
@@ -1,5 +1,5 @@
|
||||
*******************************************
|
||||
*** This is SABnzbd 0.7.7 ***
|
||||
*** This is SABnzbd 0.6.12 ***
|
||||
*******************************************
|
||||
SABnzbd is an open-source cross-platform binary newsreader.
|
||||
It simplifies the process of downloading from Usenet dramatically,
|
||||
@@ -12,8 +12,8 @@ and offers a complete API for third-party applications to hook into.
|
||||
There is an extensive Wiki on the use of SABnzbd.
|
||||
http://wiki.sabnzbd.org/
|
||||
|
||||
IMPORTANT INFORMATION about release 0.7.0:
|
||||
http://wiki.sabnzbd.org/introducing-0-7-0
|
||||
IMPORTANT INFORMATION about release 0.6.0:
|
||||
http://wiki.sabnzbd.org/introducing-0-6-0
|
||||
|
||||
|
||||
Please also read the file "ISSUES.txt"
|
||||
@@ -54,3 +54,10 @@ an nzb backup folder, or temporarily go back to 0.4.x until your queue is comple
|
||||
|
||||
The history is now stored in a better format meaning future upgrades should be backwards
|
||||
compatible.
|
||||
|
||||
|
||||
*******************************************
|
||||
*** Changes since 0.5.6 ***
|
||||
*******************************************
|
||||
|
||||
See: http://wiki.sabnzbd.org/introducing-0-6-0
|
||||
|
||||
1051
CHANGELOG.txt
@@ -1,32 +1,17 @@
|
||||
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
|
||||
The SABnzbd-team is:
|
||||
|
||||
Active team:
|
||||
Current team:
|
||||
ShyPike <shypike@sabnzbd.org>
|
||||
inpheaux <inpheaux@sabnzbd.org>
|
||||
zoggy <zoggy@sabnzbd.org>
|
||||
Sleeping members
|
||||
sw1tch <switch@sabnzbd.org>
|
||||
pairofdimes <pairofdimes@sabnzbd.org>
|
||||
inpheaux <inpheaux@sabnzbd.org>
|
||||
rAf <rAf@sabnzbd.org>
|
||||
Honorary member (and original author)
|
||||
Gregor Kaufmann <tdian@users.sourceforge.net>
|
||||
|
||||
The main contributors and moderators of the translations
|
||||
Danish: Rene (nordjyden6)
|
||||
Dutch: ShyPike
|
||||
French : rAf and Fox Ace
|
||||
German: Severin Heiniger
|
||||
Norwegian: Protx
|
||||
Romanian: nicusor
|
||||
Serbian: Ozzii
|
||||
Swedish: Malmis
|
||||
Spanish: Syquus
|
||||
Portuguese (Brazil): lrrosa
|
||||
Russian: Pavel Maryanov
|
||||
Polish: Tomasz 'Zen' Napierala
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
|
||||
40
INSTALL.txt
@@ -1,10 +1,10 @@
|
||||
SABnzbd 0.7.7
|
||||
SABnzbd 0.6.12
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
0) LICENSE
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
@@ -39,20 +39,12 @@ Start the SABnzbd.exe program.
|
||||
Within 5-10 seconds your web browser will start and show the user interface.
|
||||
Use the "Help" button in the web-interface to be directed to the Help Wiki.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
3) INSTALL pre-built OSX binaries
|
||||
-------------------------------------------------------------------------------
|
||||
Download the DMG file, mount and drag the SABnzbd icon to Programs.
|
||||
Just like you do with so many apps.
|
||||
Make sure you pick the right folder, depending on your OSX version.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
4) INSTALL with only sources
|
||||
3) INSTALL with only sources
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
You need to have Python installed plus some non-standard Python modules
|
||||
and a few tools.
|
||||
You need to have Python installed and some modules.
|
||||
|
||||
Unix/Linux/OSX
|
||||
Python-2.5, 2.6 or 2.7 http://www.python.org
|
||||
@@ -60,33 +52,33 @@ Unix/Linux/OSX
|
||||
OSX Leopard/SnowLeopard
|
||||
Python 2.6 http://www.activestate.com
|
||||
|
||||
OSX Lion/MountainLion
|
||||
Apple Python 2.7 Included in OSX (default)
|
||||
OSX Lion Apple Python 2.7 (included in OSX)
|
||||
|
||||
Windows
|
||||
Python-2.7.latest http://www.activestate.com
|
||||
Python-2.5.latest http://www.activestate.com
|
||||
Python-2.6.latest
|
||||
Python-2.7.latest
|
||||
|
||||
Essential modules
|
||||
cheetah-2.0.1+ http://www.cheetahtemplate.org/ (or use "pypm install cheetah")
|
||||
cheetah-2.0.1+ http://www.cheetahtemplate.org/
|
||||
yenc module >= 0.3 http://sabnzbd.sourceforge.net/yenc-0.3.tar.gz
|
||||
http://sabnzbd.sourceforge.net/yenc-0.3-w32fixed.zip (Win32-only)
|
||||
par2cmdline >= 0.4 http://parchive.sourceforge.net/
|
||||
http://chuchusoft.com/par2_tbb/index.html (multi-core)
|
||||
|
||||
Optional modules
|
||||
unrar >= 3.90+ http://www.rarlab.com/rar_add.htm
|
||||
unzip >= 5.52 http://www.info-zip.org/
|
||||
yenc module >= 0.3 http://sabnzbd.sourceforge.net/yenc-0.3.tar.gz
|
||||
http://sabnzbd.sourceforge.net/yenc-0.3-w32fixed.zip (Win32-only)
|
||||
gnu gettext http://www.gnu.org/software/gettext/
|
||||
|
||||
Optional modules Windows
|
||||
pyopenssl >= 0.11 http://pypi.python.org/pypi/pyOpenSSL
|
||||
(Binaries, including the OpenSSL libraries)
|
||||
|
||||
Optional modules Unix/Linux/OSX
|
||||
pyopenssl >= 0.11 http://pypi.python.org/pypi/pyOpenSSL
|
||||
pyopenssl >= 0.10 http://pypi.python.org/pypi/pyOpenSSL
|
||||
openssl => v0.9.8g+ http://www.openssl.org/
|
||||
Make sure the OpenSSL libraries match with PyOpenSSL
|
||||
pynotify Should be part of GTK for Python support on Debian/Ubuntu
|
||||
If not, you cannot use the NotifyOSD feature.
|
||||
|
||||
Embedded modules (only use the included version)
|
||||
CherryPy-3.2 rev2138 with patches http://www.cherrypy.org
|
||||
@@ -104,7 +96,7 @@ Use the "Help" button in the web-interface to be directed to the Help Wiki.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
5) TROUBLESHOOTING
|
||||
4) TROUBLESHOOTING
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Your browser may start up with just an error page.
|
||||
@@ -122,7 +114,7 @@ This will show a black window where logging information will be shown. This
|
||||
may help you solve problems easier.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
6) MORE INFORMATION
|
||||
5) MORE INFORMATION
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Visit the WIKI site:
|
||||
@@ -130,7 +122,7 @@ Visit the WIKI site:
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
7) CREDITS
|
||||
6) CREDITS
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Several parts of SABnzbd were built by other people, illustrating the
|
||||
|
||||
30
ISSUES.txt
@@ -2,8 +2,8 @@
|
||||
*** Known issues ***
|
||||
*******************************************
|
||||
|
||||
- To prevent unexpectedly large NZBs from eating your download quota you can set
|
||||
the option 'size_limit' on the Config->Special page.
|
||||
- To prevent unexpectedly large NZBs from eating your quotum you can set
|
||||
the option 'size_limit' in the INI file.
|
||||
Any NZB larger than this size will be set to paused and get a low priority.
|
||||
|
||||
- When par2 or unrar hang up, never just stop SABnzbd.
|
||||
@@ -27,19 +27,18 @@
|
||||
For Windows the default is 128 and for others 256.
|
||||
A quite safe value for Windows would be 64.
|
||||
SABnzbd will take care of overlapping names.
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
See: http://wiki.sabnzbd.org/configure-special
|
||||
|
||||
- Some Usenet servers have intermittent login (or other) problems.
|
||||
For these the server blocking method is not very favourable.
|
||||
There is an INI-only option that will limit blocks to 1 minute.
|
||||
no_penalties = 1
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
See: http://wiki.sabnzbd.org/configure-special
|
||||
|
||||
- Some third-party utilties try to probe SABnzbd API in such a way that you will
|
||||
often see warnings about unauthenticated access.
|
||||
If you are sure these probes are harmless, you can suppress the warnings by
|
||||
setting the option "api_warnings" to 0.
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
setting the option "api_warnings" to 0 in the file sabnzbd.ini
|
||||
|
||||
- On OSX you may encounter downloaded files with foreign characters.
|
||||
The par2 repair may fail when the files were created on a Windows system.
|
||||
@@ -49,8 +48,6 @@
|
||||
- On Linux when you download files they may have the wrong character encoding.
|
||||
You will see this only when downloaded files contain accented characters.
|
||||
You need to fix it yourself by running the convmv utility (availaible for most Linux platforms).
|
||||
Possible the file system override setting 'fsys_type' might be solve things:
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
|
||||
- The "Watched Folder" sometimes fails to delete the NZB files it has
|
||||
processed. This happens when other software still accesses these files.
|
||||
@@ -58,6 +55,10 @@
|
||||
We cannot solve this problem, because the Operating System (read Windows)
|
||||
prevents the removal.
|
||||
|
||||
- Jobs deleted from the queue will leave downloaded files behind
|
||||
in the "incomplete" folder.
|
||||
You will have to remove these files manually.
|
||||
|
||||
- Memory usage can sometimes have high peaks. This makes using SABnzbd on very low
|
||||
memory systems (eg a SAN device) a challenge.
|
||||
|
||||
@@ -72,16 +73,3 @@
|
||||
make sure that the drives are mounted.
|
||||
The operating system wil simply redirect your files to alternative locations.
|
||||
You may have trouble finding the files when mounting the drive later.
|
||||
On OSX, SABnzbd will not create new folders in /Volumes.
|
||||
The result will be a failed job that can be retried once the volume has been mounted.
|
||||
|
||||
- On some operating systems it looks like there is a problem with one of the standard Python libraries.
|
||||
It is possible that you get errors about saving admin files and even unexplained crashes.
|
||||
If so, you can enable the option for the alternative library.
|
||||
It has the same functionality, but is slower.
|
||||
We've had reports about this issue on non-mainstream Linux platforms.
|
||||
- OpenElec
|
||||
- Squeeze Linux
|
||||
There is a "special" option that will allow you to select an alternative library.
|
||||
use_pickle = 1
|
||||
See: http://wiki.sabnzbd.org/configure-special-0-7
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
|
||||
@@ -1,462 +1,469 @@
|
||||
; -*- coding: latin-1 -*-
|
||||
;
|
||||
; Copyright 2008-2012 The SABnzbd-Team <team@sabnzbd.org>
|
||||
;
|
||||
; This program 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 2
|
||||
; of the License, or (at your option) any later version.
|
||||
;
|
||||
; This program 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 this program; if not, write to the Free Software
|
||||
; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
!addplugindir win\nsis\Plugins
|
||||
!addincludedir win\nsis\Include
|
||||
|
||||
!include "MUI2.nsh"
|
||||
!include "registerExtension.nsh"
|
||||
!include "FileFunc.nsh"
|
||||
!include "LogicLib.nsh"
|
||||
!include "WinVer.nsh"
|
||||
!include "WinSxSQuery.nsh"
|
||||
|
||||
;------------------------------------------------------------------
|
||||
;
|
||||
; Marco for removing existing and the current installation
|
||||
; It share buy the installer and the uninstaller.
|
||||
; Make sure it covers 0.5.x, 0.6.x and 0.7.x in one go.
|
||||
;
|
||||
!define RemovePrev "!insertmacro RemovePrev"
|
||||
!macro RemovePrev idir
|
||||
Delete "${idir}\email\email-de.tmpl"
|
||||
Delete "${idir}\email\email-en.tmpl"
|
||||
Delete "${idir}\email\email-nl.tmpl"
|
||||
Delete "${idir}\email\email-fr.tmpl"
|
||||
Delete "${idir}\email\email-sv.tmpl"
|
||||
Delete "${idir}\email\email-da.tmpl"
|
||||
Delete "${idir}\email\email-nb.tmpl"
|
||||
Delete "${idir}\email\email-pl.tmpl"
|
||||
Delete "${idir}\email\email-ro.tmpl"
|
||||
Delete "${idir}\email\email-sr.tmpl"
|
||||
Delete "${idir}\email\email-es.tmpl"
|
||||
Delete "${idir}\email\email-pt_BR.tmpl"
|
||||
Delete "${idir}\email\email-sr.tmpl"
|
||||
Delete "${idir}\email\email-ru.tmpl"
|
||||
Delete "${idir}\email\rss-de.tmpl"
|
||||
Delete "${idir}\email\rss-en.tmpl"
|
||||
Delete "${idir}\email\rss-nl.tmpl"
|
||||
Delete "${idir}\email\rss-pl.tmpl"
|
||||
Delete "${idir}\email\rss-fr.tmpl"
|
||||
Delete "${idir}\email\rss-sv.tmpl"
|
||||
Delete "${idir}\email\rss-da.tmpl"
|
||||
Delete "${idir}\email\rss-nb.tmpl"
|
||||
Delete "${idir}\email\rss-ro.tmpl"
|
||||
Delete "${idir}\email\rss-sr.tmpl"
|
||||
Delete "${idir}\email\rss-es.tmpl"
|
||||
Delete "${idir}\email\rss-pt_BR.tmpl"
|
||||
Delete "${idir}\email\rss-sr.tmpl"
|
||||
Delete "${idir}\email\rss-ru.tmpl"
|
||||
Delete "${idir}\email\badfetch-da.tmpl"
|
||||
Delete "${idir}\email\badfetch-de.tmpl"
|
||||
Delete "${idir}\email\badfetch-en.tmpl"
|
||||
Delete "${idir}\email\badfetch-fr.tmpl"
|
||||
Delete "${idir}\email\badfetch-nb.tmpl"
|
||||
Delete "${idir}\email\badfetch-nl.tmpl"
|
||||
Delete "${idir}\email\badfetch-pl.tmpl"
|
||||
Delete "${idir}\email\badfetch-ro.tmpl"
|
||||
Delete "${idir}\email\badfetch-sr.tmpl"
|
||||
Delete "${idir}\email\badfetch-sv.tmpl"
|
||||
Delete "${idir}\email\badfetch-sr.tmpl"
|
||||
Delete "${idir}\email\badfetch-es.tmpl"
|
||||
Delete "${idir}\email\badfetch-pt_BR.tmpl"
|
||||
Delete "${idir}\email\badfetch-ru.tmpl"
|
||||
RMDir "${idir}\email"
|
||||
RMDir /r "${idir}\locale"
|
||||
RMDir /r "${idir}\interfaces\Classic"
|
||||
RMDir /r "${idir}\interfaces\Plush"
|
||||
RMDir /r "${idir}\interfaces\smpl"
|
||||
RMDir /r "${idir}\interfaces\Mobile"
|
||||
RMDir /r "${idir}\interfaces\wizard"
|
||||
RMDir /r "${idir}\interfaces\Config"
|
||||
RMDir "${idir}\interfaces"
|
||||
RMDir /r "${idir}\win\curl"
|
||||
RMDir /r "${idir}\win\par2"
|
||||
RMDir /r "${idir}\win\unrar"
|
||||
RMDir /r "${idir}\win\unzip"
|
||||
RMDir /r "${idir}\win"
|
||||
RMDir /r "${idir}\licenses"
|
||||
RMDir /r "${idir}\lib\"
|
||||
RMDir /r "${idir}\po\email"
|
||||
RMDir /r "${idir}\po\main"
|
||||
RMDir /r "${idir}\po\nsis"
|
||||
RMDir "${idir}\po"
|
||||
RMDir /r "${idir}\icons"
|
||||
Delete "${idir}\CHANGELOG.txt"
|
||||
Delete "${idir}\COPYRIGHT.txt"
|
||||
Delete "${idir}\email.tmpl"
|
||||
Delete "${idir}\GPL2.txt"
|
||||
Delete "${idir}\GPL3.txt"
|
||||
Delete "${idir}\INSTALL.txt"
|
||||
Delete "${idir}\ISSUES.txt"
|
||||
Delete "${idir}\LICENSE.txt"
|
||||
Delete "${idir}\nzbmatrix.txt"
|
||||
Delete "${idir}\MSVCR71.dll"
|
||||
Delete "${idir}\nzb.ico"
|
||||
Delete "${idir}\sabnzbd.ico"
|
||||
Delete "${idir}\PKG-INFO"
|
||||
Delete "${idir}\python25.dll"
|
||||
Delete "${idir}\python26.dll"
|
||||
Delete "${idir}\python27.dll"
|
||||
Delete "${idir}\README.txt"
|
||||
Delete "${idir}\README.rtf"
|
||||
Delete "${idir}\ABOUT.txt"
|
||||
Delete "${idir}\IMPORTANT_MESSAGE.txt"
|
||||
Delete "${idir}\SABnzbd-console.exe"
|
||||
Delete "${idir}\SABnzbd.exe"
|
||||
Delete "${idir}\SABnzbd.exe.log"
|
||||
Delete "${idir}\SABnzbd-helper.exe"
|
||||
Delete "${idir}\SABnzbd-service.exe"
|
||||
Delete "${idir}\Sample-PostProc.cmd"
|
||||
Delete "${idir}\Uninstall.exe"
|
||||
Delete "${idir}\w9xpopen.exe"
|
||||
RMDir "${idir}"
|
||||
!macroend
|
||||
|
||||
;------------------------------------------------------------------
|
||||
; Define names of the product
|
||||
Name "${SAB_PRODUCT}"
|
||||
OutFile "${SAB_FILE}"
|
||||
InstallDir "$PROGRAMFILES\SABnzbd"
|
||||
InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
|
||||
;DirText $(MsgSelectDir)
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
; Some default compiler settings (uncomment and change at will):
|
||||
SetCompress auto ; (can be off or force)
|
||||
SetDatablockOptimize on ; (can be off)
|
||||
CRCCheck on ; (can be off)
|
||||
AutoCloseWindow false ; (can be true for the window go away automatically at end)
|
||||
ShowInstDetails hide ; (can be show to have them shown, or nevershow to disable)
|
||||
SetDateSave off ; (can be on to have files restored to their orginal date)
|
||||
WindowIcon on
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
; Vista/Win7 redirects $SMPROGRAMS to all users without this
|
||||
RequestExecutionLevel admin
|
||||
FileErrorText "If you have no admin rights, try to install into a user directory."
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
;Variables
|
||||
Var MUI_TEMP
|
||||
Var STARTMENU_FOLDER
|
||||
|
||||
;------------------------------------------------------------------
|
||||
;Interface Settings
|
||||
|
||||
!define MUI_ABORTWARNING
|
||||
|
||||
;Show all languages, despite user's codepage
|
||||
!define MUI_LANGDLL_ALLLANGUAGES
|
||||
|
||||
!define MUI_ICON "interfaces/Classic/templates/static/images/favicon.ico"
|
||||
|
||||
|
||||
;--------------------------------
|
||||
;Pages
|
||||
|
||||
!insertmacro MUI_PAGE_LICENSE "LICENSE.txt"
|
||||
!define MUI_COMPONENTSPAGE_NODESC
|
||||
!insertmacro MUI_PAGE_COMPONENTS
|
||||
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
|
||||
;Start Menu Folder Page Configuration
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\SABnzbd"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
|
||||
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "SABnzbd"
|
||||
;Remember the installer language
|
||||
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
|
||||
!define MUI_LANGDLL_REGISTRY_KEY "Software\SABnzbd"
|
||||
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
|
||||
|
||||
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
|
||||
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!define MUI_FINISHPAGE_RUN
|
||||
!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
|
||||
!define MUI_FINISHPAGE_RUN_TEXT $(MsgGoWiki)
|
||||
!define MUI_FINISHPAGE_RUN_NOTCHECKED
|
||||
!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\README.txt"
|
||||
!define MUI_FINISHPAGE_SHOWREADME_TEXT $(MsgShowRelNote)
|
||||
!define MUI_FINISHPAGE_LINK $(MsgSupportUs)
|
||||
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.sabnzbd.org/contribute/"
|
||||
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!define MUI_UNPAGE_COMPONENTSPAGE_NODESC
|
||||
!insertmacro MUI_UNPAGE_COMPONENTS
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
; Set supported languages
|
||||
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
|
||||
!insertmacro MUI_LANGUAGE "French"
|
||||
!insertmacro MUI_LANGUAGE "German"
|
||||
!insertmacro MUI_LANGUAGE "Dutch"
|
||||
!insertmacro MUI_LANGUAGE "Polish"
|
||||
!insertmacro MUI_LANGUAGE "Swedish"
|
||||
!insertmacro MUI_LANGUAGE "Danish"
|
||||
!insertmacro MUI_LANGUAGE "NORWEGIAN"
|
||||
!insertmacro MUI_LANGUAGE "Romanian"
|
||||
!insertmacro MUI_LANGUAGE "Spanish"
|
||||
!insertmacro MUI_LANGUAGE "PortugueseBR"
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
;Reserve Files
|
||||
;If you are using solid compression, files that are required before
|
||||
;the actual installation should be stored first in the data block,
|
||||
;because this will make your installer start faster.
|
||||
|
||||
!insertmacro MUI_RESERVEFILE_LANGDLL
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
Function LaunchLink
|
||||
ExecShell "" "http://wiki.sabnzbd.org/"
|
||||
FunctionEnd
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
Function .onInit
|
||||
!insertmacro MUI_LANGDLL_DISPLAY
|
||||
|
||||
;--------------------------------
|
||||
;make sure that the requires MS Runtimes are installed
|
||||
;
|
||||
goto nodownload ; Not needed while still using Python25
|
||||
runtime_loop:
|
||||
push 'msvcr90.dll'
|
||||
push 'Microsoft.VC90.CRT,version="9.0.21022.8",type="win32",processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b"'
|
||||
call WinSxS_HasAssembly
|
||||
pop $0
|
||||
|
||||
StrCmp $0 "1" nodownload
|
||||
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgNoRuntime) /SD IDOK IDOK download IDCANCEL noinstall
|
||||
download:
|
||||
inetc::get /BANNER $(MsgDLRuntime) \
|
||||
"http://download.microsoft.com/download/1/1/1/1116b75a-9ec3-481a-a3c8-1777b5381140/vcredist_x86.exe" \
|
||||
"$TEMP\vcredist_x86.exe"
|
||||
Pop $0
|
||||
DetailPrint "Downloaded MS runtime library"
|
||||
StrCmp $0 "OK" dlok
|
||||
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgDLError) /SD IDCANCEL IDCANCEL exitinstall IDOK download
|
||||
dlok:
|
||||
ExecWait "$TEMP\vcredist_x86.exe" $1
|
||||
DetailPrint "VCRESULT=$1"
|
||||
DetailPrint "Tried to install MS runtime library"
|
||||
delete "$TEMP\vcredist_x86.exe"
|
||||
StrCmp $1 "0" nodownload
|
||||
noinstall:
|
||||
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgDLNeed) /SD IDOK IDOK runtime_loop IDCANCEL exitinstall
|
||||
Abort
|
||||
nodownload:
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
;make sure user terminates sabnzbd.exe or else abort
|
||||
;
|
||||
loop:
|
||||
StrCpy $0 "SABnzbd.exe"
|
||||
KillProc::FindProcesses
|
||||
StrCmp $0 "0" endcheck
|
||||
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgCloseSab) /SD IDCANCEL IDOK loop IDCANCEL exitinstall
|
||||
exitinstall:
|
||||
Abort
|
||||
endcheck:
|
||||
|
||||
FunctionEnd
|
||||
|
||||
|
||||
;------------------------------------------------------------------
|
||||
; SECTION main program
|
||||
;
|
||||
Section "SABnzbd" SecDummy
|
||||
SetOutPath "$INSTDIR"
|
||||
|
||||
;------------------------------------------------------------------
|
||||
; Make sure old versions are gone
|
||||
IfFileExists $INSTDIR\sabnzbd.exe 0 endWarnExist
|
||||
IfFileExists $INSTDIR\python27.dll 0 endWarnExist
|
||||
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(MsgRemoveOld)$\n$\n$(MsgRemoveOld2)" IDOK uninst
|
||||
Abort
|
||||
uninst:
|
||||
${RemovePrev} "$INSTDIR"
|
||||
endWarnExist:
|
||||
|
||||
; add files / whatever that need to be installed here.
|
||||
File /r "dist\*"
|
||||
|
||||
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" "" "$INSTDIR"
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayName" "SABnzbd ${SAB_VERSION}"
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayVersion" '${SAB_VERSION}'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "Publisher" 'The SABnzbd Team'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "HelpLink" 'http://forums.sabnzbd.org/'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "URLInfoAbout" 'http://wiki.sabnzbd.org/'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "URLUpdateInfo" 'http://sabnzbd.org/'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "Comments" 'The automated Usenet download tool'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayIcon" '$INSTDIR\interfaces\Classic\templates\static\images\favicon.ico'
|
||||
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "EstimatedSize" 25674
|
||||
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "NoRepair" -1
|
||||
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "NoModify" -1
|
||||
; write out uninstaller
|
||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||
|
||||
;Create shortcuts
|
||||
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
|
||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe"
|
||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd - SafeMode.lnk" "$INSTDIR\SABnzbd.exe" "--server 127.0.0.1:8080 -b1 --no-login -t Plush"
|
||||
WriteINIStr "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd - Documentation.url" "InternetShortcut" "URL" "http://wiki.sabnzbd.org/"
|
||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||
|
||||
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
|
||||
|
||||
SectionEnd ; end of default section
|
||||
|
||||
Section /o $(MsgRunAtStart) startup
|
||||
CreateShortCut "$SMPROGRAMS\Startup\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe" "-b0"
|
||||
SectionEnd ;
|
||||
|
||||
Section $(MsgIcon) desktop
|
||||
CreateShortCut "$DESKTOP\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe"
|
||||
SectionEnd ; end of desktop icon section
|
||||
|
||||
Section /o $(MsgAssoc) assoc
|
||||
${registerExtension} "$INSTDIR\icons\nzb.ico" "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
|
||||
${RefreshShellIcons}
|
||||
SectionEnd ; end of file association section
|
||||
|
||||
; begin uninstall settings/section
|
||||
UninstallText $(MsgUninstall)
|
||||
|
||||
Section "un.$(MsgDelProgram)" Uninstall
|
||||
;make sure sabnzbd.exe isnt running..if so shut it down
|
||||
|
||||
StrCpy $0 "sabnzbd.exe"
|
||||
DetailPrint "Searching for processes called '$0'"
|
||||
KillProc::FindProcesses
|
||||
StrCmp $1 "-1" wooops
|
||||
DetailPrint "-> Found $0 processes"
|
||||
|
||||
StrCmp $0 "0" completed
|
||||
Sleep 1500
|
||||
|
||||
StrCpy $0 "sabnzbd.exe"
|
||||
DetailPrint "Killing all processes called '$0'"
|
||||
KillProc::KillProcesses
|
||||
StrCmp $1 "-1" wooops
|
||||
DetailPrint "-> Killed $0 processes, failed to kill $1 processes"
|
||||
|
||||
Goto completed
|
||||
|
||||
wooops:
|
||||
DetailPrint "-> Error: Something went wrong :-("
|
||||
Abort
|
||||
|
||||
completed:
|
||||
DetailPrint "Process Killed"
|
||||
|
||||
|
||||
; add delete commands to delete whatever files/registry keys/etc you installed here.
|
||||
Delete "$INSTDIR\uninstall.exe"
|
||||
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd"
|
||||
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd"
|
||||
|
||||
${RemovePrev} "$INSTDIR"
|
||||
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
|
||||
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd.lnk"
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd - SafeMode.lnk"
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd - Documentation.url"
|
||||
RMDir "$SMPROGRAMS\$MUI_TEMP"
|
||||
|
||||
Delete "$SMPROGRAMS\Startup\SABnzbd.lnk"
|
||||
|
||||
Delete "$DESKTOP\SABnzbd.lnk"
|
||||
|
||||
DeleteRegKey HKEY_CURRENT_USER "Software\SABnzbd"
|
||||
|
||||
${unregisterExtension} ".nzb" "NZB File"
|
||||
${RefreshShellIcons}
|
||||
|
||||
SectionEnd ; end of uninstall section
|
||||
|
||||
Section /o "un.$(MsgDelSettings)" DelSettings
|
||||
DetailPrint "Uninstall settings $LOCALAPPDATA"
|
||||
Delete "$LOCALAPPDATA\sabnzbd\sabnzbd.ini"
|
||||
RMDir /r "$LOCALAPPDATA\sabnzbd"
|
||||
SectionEnd
|
||||
|
||||
; eof
|
||||
|
||||
;--------------------------------
|
||||
;Language strings
|
||||
LangString MsgGoWiki ${LANG_ENGLISH} "Go to the SABnzbd Wiki"
|
||||
|
||||
LangString MsgShowRelNote ${LANG_ENGLISH} "Show Release Notes"
|
||||
|
||||
LangString MsgSupportUs ${LANG_ENGLISH} "Support the project, Donate!"
|
||||
|
||||
LangString MsgCloseSab ${LANG_ENGLISH} "Please close $\"SABnzbd.exe$\" first"
|
||||
|
||||
LangString MsgOldQueue ${LANG_ENGLISH} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-7-0 !"
|
||||
|
||||
LangString MsgUninstall ${LANG_ENGLISH} "This will uninstall SABnzbd from your system"
|
||||
|
||||
LangString MsgRunAtStart ${LANG_ENGLISH} "Run at startup"
|
||||
|
||||
LangString MsgIcon ${LANG_ENGLISH} "Desktop Icon"
|
||||
|
||||
LangString MsgAssoc ${LANG_ENGLISH} "NZB File association"
|
||||
|
||||
LangString MsgDelProgram ${LANG_ENGLISH} "Delete Program"
|
||||
|
||||
LangString MsgDelSettings ${LANG_ENGLISH} "Delete Settings"
|
||||
|
||||
LangString MsgNoRuntime ${LANG_ENGLISH} "This system requires the Microsoft runtime library VC90 to be installed first. Do you want to do that now?"
|
||||
|
||||
LangString MsgDLRuntime ${LANG_ENGLISH} "Downloading Microsoft runtime installer..."
|
||||
|
||||
LangString MsgDLError ${LANG_ENGLISH} "Download error, retry?"
|
||||
|
||||
LangString MsgDLNeed ${LANG_ENGLISH} "Cannot install without runtime library, retry?"
|
||||
|
||||
LangString MsgRemoveOld ${LANG_ENGLISH} "You cannot overwrite an existing installation. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade."
|
||||
|
||||
LangString MsgRemoveOld2 ${LANG_ENGLISH} "Your settings and data will be preserved."
|
||||
|
||||
|
||||
Function un.onInit
|
||||
!insertmacro MUI_UNGETLANGUAGE
|
||||
FunctionEnd
|
||||
; -*- coding: latin-1 -*-
|
||||
;
|
||||
; Copyright 2008-2011 The SABnzbd-Team <team@sabnzbd.org>
|
||||
;
|
||||
; This program 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 2
|
||||
; of the License, or (at your option) any later version.
|
||||
;
|
||||
; This program 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 this program; if not, write to the Free Software
|
||||
; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
!addplugindir win\nsis\Plugins
|
||||
!addincludedir win\nsis\Include
|
||||
|
||||
!include "MUI2.nsh"
|
||||
!include "registerExtension.nsh"
|
||||
|
||||
|
||||
Name "${SAB_PRODUCT}"
|
||||
OutFile "${SAB_FILE}"
|
||||
|
||||
|
||||
; Some default compiler settings (uncomment and change at will):
|
||||
; SetCompress auto ; (can be off or force)
|
||||
; SetDatablockOptimize on ; (can be off)
|
||||
; CRCCheck on ; (can be off)
|
||||
; AutoCloseWindow false ; (can be true for the window go away automatically at end)
|
||||
; ShowInstDetails hide ; (can be show to have them shown, or nevershow to disable)
|
||||
; SetDateSave off ; (can be on to have files restored to their orginal date)
|
||||
WindowIcon on
|
||||
|
||||
InstallDir "$PROGRAMFILES\SABnzbd"
|
||||
InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" ""
|
||||
;DirText $(MsgSelectDir)
|
||||
|
||||
;Vista redirects $SMPROGRAMS to all users without this
|
||||
RequestExecutionLevel admin
|
||||
FileErrorText "If you have no admin rights, try to install into a user directory."
|
||||
|
||||
|
||||
;--------------------------------
|
||||
;Variables
|
||||
|
||||
Var MUI_TEMP
|
||||
Var STARTMENU_FOLDER
|
||||
;--------------------------------
|
||||
;Interface Settings
|
||||
|
||||
!define MUI_ABORTWARNING
|
||||
|
||||
;Show all languages, despite user's codepage
|
||||
!define MUI_LANGDLL_ALLLANGUAGES
|
||||
|
||||
!define MUI_ICON "interfaces/Classic/templates/static/images/favicon.ico"
|
||||
|
||||
|
||||
;--------------------------------
|
||||
;Pages
|
||||
|
||||
!insertmacro MUI_PAGE_LICENSE "LICENSE.txt"
|
||||
!define MUI_COMPONENTSPAGE_NODESC
|
||||
!insertmacro MUI_PAGE_COMPONENTS
|
||||
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
|
||||
;Start Menu Folder Page Configuration
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\SABnzbd"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
|
||||
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "SABnzbd"
|
||||
;Remember the installer language
|
||||
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
|
||||
!define MUI_LANGDLL_REGISTRY_KEY "Software\SABnzbd"
|
||||
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
|
||||
|
||||
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
|
||||
|
||||
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!define MUI_FINISHPAGE_RUN
|
||||
!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
|
||||
!define MUI_FINISHPAGE_RUN_TEXT $(MsgStartSab)
|
||||
!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\README.txt"
|
||||
!define MUI_FINISHPAGE_SHOWREADME_TEXT $(MsgShowRelNote)
|
||||
;!define MUI_FINISHPAGE_LINK "View the SABnzbdPlus Wiki"
|
||||
;!define MUI_FINISHPAGE_LINK_LOCATION "http://wiki.sabnzbd.org/"
|
||||
!define MUI_FINISHPAGE_LINK $(MsgSupportUs)
|
||||
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.sabnzbd.org/contribute/"
|
||||
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!define MUI_UNPAGE_COMPONENTSPAGE_NODESC
|
||||
!insertmacro MUI_UNPAGE_COMPONENTS
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
;--------------------------------
|
||||
;Languages
|
||||
|
||||
; Set supported languages
|
||||
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
|
||||
!insertmacro MUI_LANGUAGE "French"
|
||||
!insertmacro MUI_LANGUAGE "German"
|
||||
!insertmacro MUI_LANGUAGE "Dutch"
|
||||
!insertmacro MUI_LANGUAGE "Swedish"
|
||||
!insertmacro MUI_LANGUAGE "Danish"
|
||||
!insertmacro MUI_LANGUAGE "NORWEGIAN"
|
||||
!insertmacro MUI_LANGUAGE "Romanian"
|
||||
|
||||
|
||||
;--------------------------------
|
||||
;Reserve Files
|
||||
|
||||
;If you are using solid compression, files that are required before
|
||||
;the actual installation should be stored first in the data block,
|
||||
;because this will make your installer start faster.
|
||||
|
||||
!insertmacro MUI_RESERVEFILE_LANGDLL
|
||||
|
||||
|
||||
Function LaunchLink
|
||||
ExecShell "" "$INSTDIR\SABnzbd.exe"
|
||||
FunctionEnd
|
||||
|
||||
;--------------------------------
|
||||
Function .onInit
|
||||
!insertmacro MUI_LANGDLL_DISPLAY
|
||||
|
||||
;make sure sabnzbd.exe isnt running..if so abort
|
||||
loop:
|
||||
StrCpy $0 "SABnzbd.exe"
|
||||
KillProc::FindProcesses
|
||||
StrCmp $0 "0" endcheck
|
||||
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgCloseSab) IDOK loop IDCANCEL exitinstall
|
||||
exitinstall:
|
||||
Abort
|
||||
endcheck:
|
||||
FunctionEnd
|
||||
|
||||
|
||||
Section "SABnzbd" SecDummy
|
||||
SetOutPath "$INSTDIR"
|
||||
|
||||
IfFileExists $INSTDIR\sabnzbd.exe 0 endWarnExist
|
||||
IfFileExists $INSTDIR\locale\nl\LC_MESSAGES\SABnzbd.mo endWarnExist 0
|
||||
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION $(MsgOldQueue) IDOK endWarnExist IDCANCEL 0
|
||||
Abort
|
||||
endWarnExist:
|
||||
|
||||
; add files / whatever that need to be installed here.
|
||||
File /r "dist\*"
|
||||
|
||||
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd" "" "$INSTDIR"
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayName" "SABnzbd ${SAB_VERSION}"
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayVersion" '${SAB_VERSION}'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "Publisher" 'The SABnzbd Team'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "HelpLink" 'http://forums.sabnzbd.org/'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "URLInfoAbout" 'http://wiki.sabnzbd.org/'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "URLUpdateInfo" 'http://sabnzbd.org/'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "Comments" 'The automated Usenet download tool'
|
||||
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "DisplayIcon" '$INSTDIR\interfaces\Classic\templates\static\images\favicon.ico'
|
||||
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "EstimatedSize" 18400
|
||||
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "NoRepair" -1
|
||||
WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd" "NoModify" -1
|
||||
; write out uninstaller
|
||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||
|
||||
;Create shortcuts
|
||||
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
|
||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe"
|
||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd - SafeMode.lnk" "$INSTDIR\SABnzbd.exe" "--server 127.0.0.1:8080 -b1 --no-login -t Plush"
|
||||
WriteINIStr "$SMPROGRAMS\$STARTMENU_FOLDER\SABnzbd - Documentation.url" "InternetShortcut" "URL" "http://wiki.sabnzbd.org/"
|
||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||
|
||||
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
|
||||
|
||||
SectionEnd ; end of default section
|
||||
|
||||
Section /o $(MsgRunAtStart) startup
|
||||
CreateShortCut "$SMPROGRAMS\Startup\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe" "-b0"
|
||||
SectionEnd ;
|
||||
|
||||
Section $(MsgIcon) desktop
|
||||
CreateShortCut "$DESKTOP\SABnzbd.lnk" "$INSTDIR\SABnzbd.exe"
|
||||
SectionEnd ; end of desktop icon section
|
||||
|
||||
Section /o $(MsgAssoc) assoc
|
||||
${registerExtension} "$INSTDIR\nzb.ico" "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
|
||||
;${registerExtension} "$INSTDIR\SABnzbd.exe" ".nzb" "NZB File"
|
||||
SectionEnd ; end of file association section
|
||||
|
||||
; begin uninstall settings/section
|
||||
UninstallText $(MsgUninstall)
|
||||
|
||||
Section "un.$(MsgDelProgram)" Uninstall
|
||||
;make sure sabnzbd.exe isnt running..if so shut it down
|
||||
|
||||
StrCpy $0 "sabnzbd.exe"
|
||||
DetailPrint "Searching for processes called '$0'"
|
||||
KillProc::FindProcesses
|
||||
StrCmp $1 "-1" wooops
|
||||
DetailPrint "-> Found $0 processes"
|
||||
|
||||
StrCmp $0 "0" completed
|
||||
Sleep 1500
|
||||
|
||||
StrCpy $0 "sabnzbd.exe"
|
||||
DetailPrint "Killing all processes called '$0'"
|
||||
KillProc::KillProcesses
|
||||
StrCmp $1 "-1" wooops
|
||||
DetailPrint "-> Killed $0 processes, failed to kill $1 processes"
|
||||
|
||||
Goto completed
|
||||
|
||||
wooops:
|
||||
DetailPrint "-> Error: Something went wrong :-("
|
||||
Abort
|
||||
|
||||
completed:
|
||||
DetailPrint "Process Killed"
|
||||
|
||||
|
||||
; add delete commands to delete whatever files/registry keys/etc you installed here.
|
||||
Delete "$INSTDIR\uninstall.exe"
|
||||
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\SABnzbd"
|
||||
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SABnzbd"
|
||||
|
||||
; Delete installation files are carefully as possible
|
||||
; Using just rmdir /r "$instdir" is considered unsafe!
|
||||
Delete "$INSTDIR\email\email-de.tmpl"
|
||||
Delete "$INSTDIR\email\email-en.tmpl"
|
||||
Delete "$INSTDIR\email\email-nl.tmpl"
|
||||
Delete "$INSTDIR\email\email-fr.tmpl"
|
||||
Delete "$INSTDIR\email\email-sv.tmpl"
|
||||
Delete "$INSTDIR\email\email-da.tmpl"
|
||||
Delete "$INSTDIR\email\email-nb.tmpl"
|
||||
Delete "$INSTDIR\email\email-ro.tmpl"
|
||||
Delete "$INSTDIR\email\rss-de.tmpl"
|
||||
Delete "$INSTDIR\email\rss-en.tmpl"
|
||||
Delete "$INSTDIR\email\rss-nl.tmpl"
|
||||
Delete "$INSTDIR\email\rss-fr.tmpl"
|
||||
Delete "$INSTDIR\email\rss-sv.tmpl"
|
||||
Delete "$INSTDIR\email\rss-da.tmpl"
|
||||
Delete "$INSTDIR\email\rss-nb.tmpl"
|
||||
Delete "$INSTDIR\email\rss-ro.tmpl"
|
||||
RMDir "$INSTDIR\email"
|
||||
RMDir /r "$INSTDIR\locale"
|
||||
RMDir /r "$INSTDIR\interfaces\Classic"
|
||||
RMDir /r "$INSTDIR\interfaces\Plush"
|
||||
RMDir /r "$INSTDIR\interfaces\smpl"
|
||||
RMDir /r "$INSTDIR\interfaces\Mobile"
|
||||
RMDir /r "$INSTDIR\interfaces\wizard"
|
||||
RMDir "$INSTDIR\interfaces"
|
||||
RMDir /r "$INSTDIR\win\par2"
|
||||
RMDir /r "$INSTDIR\win\unrar"
|
||||
RMDir /r "$INSTDIR\win\unzip"
|
||||
RMDir /r "$INSTDIR\win"
|
||||
Delete "$INSTDIR\licenses\*.txt"
|
||||
Delete "$INSTDIR\licenses\Python\*.txt"
|
||||
RMDir "$INSTDIR\licenses\Python"
|
||||
RMDir "$INSTDIR\licenses"
|
||||
Delete "$INSTDIR\lib\libeay32.dll"
|
||||
Delete "$INSTDIR\lib\pywintypes25.dll"
|
||||
Delete "$INSTDIR\lib\ssleay32.dll"
|
||||
Delete "$INSTDIR\lib\sabnzbd.zip"
|
||||
Delete "$INSTDIR\lib\*.pyd"
|
||||
RMDir /r "$INSTDIR\lib\"
|
||||
RMDir /r "$INSTDIR\po\email"
|
||||
RMDir /r "$INSTDIR\po\main"
|
||||
RMDir /r "$INSTDIR\po\nsis"
|
||||
RMDIR "$INSTDIR\po"
|
||||
Delete "$INSTDIR\CHANGELOG.txt"
|
||||
Delete "$INSTDIR\COPYRIGHT.txt"
|
||||
Delete "$INSTDIR\email.tmpl"
|
||||
Delete "$INSTDIR\GPL2.txt"
|
||||
Delete "$INSTDIR\GPL3.txt"
|
||||
Delete "$INSTDIR\INSTALL.txt"
|
||||
Delete "$INSTDIR\ISSUES.txt"
|
||||
Delete "$INSTDIR\LICENSE.txt"
|
||||
Delete "$INSTDIR\nzbmatrix.txt"
|
||||
Delete "$INSTDIR\MSVCR71.dll"
|
||||
Delete "$INSTDIR\nzb.ico"
|
||||
Delete "$INSTDIR\PKG-INFO"
|
||||
Delete "$INSTDIR\python25.dll"
|
||||
Delete "$INSTDIR\python26.dll"
|
||||
Delete "$INSTDIR\README.txt"
|
||||
Delete "$INSTDIR\SABnzbd-console.exe"
|
||||
Delete "$INSTDIR\SABnzbd.exe"
|
||||
Delete "$INSTDIR\SABnzbd-helper.exe"
|
||||
Delete "$INSTDIR\SABnzbd-service.exe"
|
||||
Delete "$INSTDIR\Sample-PostProc.cmd"
|
||||
Delete "$INSTDIR\Uninstall.exe"
|
||||
Delete "$INSTDIR\w9xpopen.exe"
|
||||
RMDir "$INSTDIR"
|
||||
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
|
||||
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd.lnk"
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd - SafeMode.lnk"
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\SABnzbd - Documentation.url"
|
||||
RMDir "$SMPROGRAMS\$MUI_TEMP"
|
||||
|
||||
Delete "$SMPROGRAMS\Startup\SABnzbd.lnk"
|
||||
|
||||
Delete "$DESKTOP\SABnzbd.lnk"
|
||||
|
||||
DeleteRegKey HKEY_CURRENT_USER "Software\SABnzbd"
|
||||
|
||||
${unregisterExtension} ".nzb" "NZB File"
|
||||
|
||||
|
||||
SectionEnd ; end of uninstall section
|
||||
|
||||
Section "un.$(MsgDelSettings)" DelSettings
|
||||
Delete "$LOCALAPPDATA\sabnzbd\sabnzbd.ini"
|
||||
RMDir /r "$LOCALAPPDATA\sabnzbd\admin"
|
||||
SectionEnd
|
||||
|
||||
|
||||
Section "un.$(MsgDelLogs)" DelLogs
|
||||
RMDir /r "$LOCALAPPDATA\sabnzbd\logs"
|
||||
SectionEnd
|
||||
|
||||
|
||||
Section "un.$(MsgDelCache)" DelCache
|
||||
RMDir /r "$LOCALAPPDATA\sabnzbd\cache"
|
||||
RMDir "$LOCALAPPDATA\sabnzbd"
|
||||
SectionEnd
|
||||
|
||||
; eof
|
||||
|
||||
;--------------------------------
|
||||
;Language strings
|
||||
; MsgWarnRunning 'Please close "SABnzbd.exe" first'
|
||||
LangString MsgStartSab ${LANG_ENGLISH} "Start SABnzbd (hidden)"
|
||||
LangString MsgStartSab ${LANG_DANISH} "Start SABnzbd"
|
||||
LangString MsgStartSab ${LANG_GERMAN} "SABnzbd starten (unsichtbar)"
|
||||
LangString MsgStartSab ${LANG_FRENCH} "D<EFBFBD>marrer SABnzbd (cach<63>)"
|
||||
LangString MsgStartSab ${LANG_NORWEGIAN} "Start SABnzbd (hidden)"
|
||||
LangString MsgStartSab ${LANG_DUTCH} "Start SABnzbd (verborgen)"
|
||||
LangString MsgStartSab ${LANG_ROMANIAN} "Porneste SABnzbd (ascuns)"
|
||||
LangString MsgStartSab ${LANG_SWEDISH} "Starta SABnzbd (dold)"
|
||||
|
||||
LangString MsgShowRelNote ${LANG_ENGLISH} "Show Release Notes"
|
||||
LangString MsgShowRelNote ${LANG_DANISH} "Vis udgivelsesbem<65>rkninger"
|
||||
LangString MsgShowRelNote ${LANG_GERMAN} "Versionshinweise anzeigen"
|
||||
LangString MsgShowRelNote ${LANG_FRENCH} "Afficher les notes de version"
|
||||
LangString MsgShowRelNote ${LANG_NORWEGIAN} "Show Release Notes"
|
||||
LangString MsgShowRelNote ${LANG_DUTCH} "Toon vrijgave bericht"
|
||||
LangString MsgShowRelNote ${LANG_ROMANIAN} "Arat<EFBFBD> Notele de Publicare"
|
||||
LangString MsgShowRelNote ${LANG_SWEDISH} "Visa release noteringar"
|
||||
|
||||
LangString MsgSupportUs ${LANG_ENGLISH} "Support the project, Donate!"
|
||||
LangString MsgSupportUs ${LANG_DANISH} "St<EFBFBD>tte projektet, donere!"
|
||||
LangString MsgSupportUs ${LANG_GERMAN} "Bitte unterst<73>tzen Sie das Projekt durch eine Spende!"
|
||||
LangString MsgSupportUs ${LANG_FRENCH} "Supportez le projet, faites un don !"
|
||||
LangString MsgSupportUs ${LANG_NORWEGIAN} "Support the project, Donate!"
|
||||
LangString MsgSupportUs ${LANG_DUTCH} "Steun het project, Doneer!"
|
||||
LangString MsgSupportUs ${LANG_ROMANIAN} "Sustine proiectul, Doneaz<61>!"
|
||||
LangString MsgSupportUs ${LANG_SWEDISH} "Donera och st<73>d detta projekt!"
|
||||
|
||||
LangString MsgCloseSab ${LANG_ENGLISH} "Please close $\"SABnzbd.exe$\" first"
|
||||
LangString MsgCloseSab ${LANG_DANISH} "Luk 'SABnzbd.exe' f<>rst"
|
||||
LangString MsgCloseSab ${LANG_GERMAN} "Schliessen Sie bitte zuerst $\"SABnzbd.exe$\"."
|
||||
LangString MsgCloseSab ${LANG_FRENCH} "Quittez $\"SABnzbd.exe$\" avant l'installation, SVP"
|
||||
LangString MsgCloseSab ${LANG_NORWEGIAN} "Please close $\"SABnzbd.exe$\" first"
|
||||
LangString MsgCloseSab ${LANG_DUTCH} "Sluit $\"SABnzbd.exe$\" eerst af"
|
||||
LangString MsgCloseSab ${LANG_ROMANIAN} "<EFBFBD>nchideti mai <20>nt<6E>i $\"SABnzbd.exe$\""
|
||||
LangString MsgCloseSab ${LANG_SWEDISH} "Var v<>nlig st<73>ng $\"SABnzbd.exe$\" f<>rst"
|
||||
|
||||
LangString MsgOldQueue ${LANG_ENGLISH} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !"
|
||||
LangString MsgOldQueue ${LANG_DANISH} " >>>> WARNING <<<<$\r$\n$\r$\nVenligst, kontroll<6C>r f<>rst udgivelsesnoter eller g<> til http://wiki.sabnzbd.org/introducing-0-6-0 !"
|
||||
LangString MsgOldQueue ${LANG_GERMAN} " >>>> WARNUNG <<<<$\r$\n$\r$\nBitte zuerst die Versionsanmerkungen lesen oder $\"http://wiki.sabnzbd.org/introducing-0-6-0 besuchen!$\""
|
||||
LangString MsgOldQueue ${LANG_FRENCH} " >>>> AVERTISSEMENT<<<<$\r$\n$\r$\nS'il vous pla<6C>t, v<>rifiez d'abord les notes de version ou visiter http://wiki.sabnzbd.org/introducing-0-6-0 !"
|
||||
LangString MsgOldQueue ${LANG_NORWEGIAN} " >>>> WARNING <<<<$\r$\n$\r$\nPlease, first check the release notes or go to http://wiki.sabnzbd.org/introducing-0-6-0 !"
|
||||
LangString MsgOldQueue ${LANG_DUTCH} " >>>> WAARSCHUWING <<<<$\r$\n$\r$\nLees eerst het vrijgave bericht of ga naar $\"http://wiki.sabnzbd.org/introducing-0-6-0 !$\""
|
||||
LangString MsgOldQueue ${LANG_ROMANIAN} " >>>> ATENTIE <<<<$\r$\n$\r$\nV<6E> rug<75>m, verificati mai <20>nt<6E>i notele de publicare sau mergeti la http://wiki.sabnzbd.org/introducing-0-6-0 !"
|
||||
LangString MsgOldQueue ${LANG_SWEDISH} " >>>> VARNING <<<<$\r$\n$\r$\nVar v<>nlig och l<>s versions noteringarna eller g<> till http://wiki.sabnzbd.org/introducing-0-6-0 !"
|
||||
|
||||
LangString MsgUninstall ${LANG_ENGLISH} "This will uninstall SABnzbd from your system"
|
||||
LangString MsgUninstall ${LANG_DANISH} "Dette vil afinstallere SABnzbd fra dit system"
|
||||
LangString MsgUninstall ${LANG_GERMAN} "Dies entfernt SABnzbd von Ihrem System"
|
||||
LangString MsgUninstall ${LANG_FRENCH} "Ceci d<>sinstallera SABnzbd de votre syst<73>me"
|
||||
LangString MsgUninstall ${LANG_NORWEGIAN} "This will uninstall SABnzbd from your system"
|
||||
LangString MsgUninstall ${LANG_DUTCH} "Dit verwijdert SABnzbd van je systeem"
|
||||
LangString MsgUninstall ${LANG_ROMANIAN} "Acest lucru va dezinstala SABnzbd din sistem"
|
||||
LangString MsgUninstall ${LANG_SWEDISH} "Detta kommer att avinstallera SABnzbd fr<66>n systemet"
|
||||
|
||||
LangString MsgRunAtStart ${LANG_ENGLISH} "Run at startup"
|
||||
LangString MsgRunAtStart ${LANG_DANISH} "K<EFBFBD>r ved opstart"
|
||||
LangString MsgRunAtStart ${LANG_GERMAN} "Beim Systemstart ausf<73>hren"
|
||||
LangString MsgRunAtStart ${LANG_FRENCH} "Lancer au d<>marrage"
|
||||
LangString MsgRunAtStart ${LANG_NORWEGIAN} "Run at startup"
|
||||
LangString MsgRunAtStart ${LANG_DUTCH} "Opstarten bij systeem start"
|
||||
LangString MsgRunAtStart ${LANG_ROMANIAN} "Executare la pornire"
|
||||
LangString MsgRunAtStart ${LANG_SWEDISH} "K<EFBFBD>r vid uppstart"
|
||||
|
||||
LangString MsgIcon ${LANG_ENGLISH} "Desktop Icon"
|
||||
LangString MsgIcon ${LANG_DANISH} "Skrivebords ikon"
|
||||
LangString MsgIcon ${LANG_GERMAN} "Desktop-Symbol"
|
||||
LangString MsgIcon ${LANG_FRENCH} "Ic<EFBFBD>ne sur le Bureau"
|
||||
LangString MsgIcon ${LANG_NORWEGIAN} "Desktop Icon"
|
||||
LangString MsgIcon ${LANG_DUTCH} "Pictogram op bureaublad"
|
||||
LangString MsgIcon ${LANG_ROMANIAN} "Icoan<EFBFBD> Desktop"
|
||||
LangString MsgIcon ${LANG_SWEDISH} "Skrivbordsikon"
|
||||
|
||||
LangString MsgAssoc ${LANG_ENGLISH} "NZB File association"
|
||||
LangString MsgAssoc ${LANG_DANISH} "NZB filtilknytning"
|
||||
LangString MsgAssoc ${LANG_GERMAN} "Mit NZB-Dateien verkn<6B>pfen"
|
||||
LangString MsgAssoc ${LANG_FRENCH} "Association des fichiers NZB"
|
||||
LangString MsgAssoc ${LANG_NORWEGIAN} "NZB File association"
|
||||
LangString MsgAssoc ${LANG_DUTCH} "NZB bestanden koppelen aan SABnzbd"
|
||||
LangString MsgAssoc ${LANG_ROMANIAN} "Asociere cu Fisierele NZB"
|
||||
LangString MsgAssoc ${LANG_SWEDISH} "NZB Filassosication"
|
||||
|
||||
LangString MsgDelProgram ${LANG_ENGLISH} "Delete Program"
|
||||
LangString MsgDelProgram ${LANG_DANISH} "Slet program"
|
||||
LangString MsgDelProgram ${LANG_GERMAN} "Programm l<>schen"
|
||||
LangString MsgDelProgram ${LANG_FRENCH} "Supprimer le programme"
|
||||
LangString MsgDelProgram ${LANG_NORWEGIAN} "Delete Program"
|
||||
LangString MsgDelProgram ${LANG_DUTCH} "Verwijder programma"
|
||||
LangString MsgDelProgram ${LANG_ROMANIAN} "Sterge Program"
|
||||
LangString MsgDelProgram ${LANG_SWEDISH} "Ta bort programmet"
|
||||
|
||||
LangString MsgDelSettings ${LANG_ENGLISH} "Delete Settings"
|
||||
LangString MsgDelSettings ${LANG_DANISH} "Slet instillinger"
|
||||
LangString MsgDelSettings ${LANG_GERMAN} "Einstellungen l<>schen"
|
||||
LangString MsgDelSettings ${LANG_FRENCH} "Supprimer les Param<61>tres"
|
||||
LangString MsgDelSettings ${LANG_NORWEGIAN} "Delete Settings"
|
||||
LangString MsgDelSettings ${LANG_DUTCH} "Verwijder instellingen"
|
||||
LangString MsgDelSettings ${LANG_ROMANIAN} "Stergeti Set<65>ri"
|
||||
LangString MsgDelSettings ${LANG_SWEDISH} "Ta bort inst<EFBFBD>llningar"
|
||||
|
||||
LangString MsgDelLogs ${LANG_ENGLISH} "Delete Logs"
|
||||
LangString MsgDelLogs ${LANG_DANISH} "Slet logs"
|
||||
LangString MsgDelLogs ${LANG_GERMAN} "Protokoll l<>schen"
|
||||
LangString MsgDelLogs ${LANG_FRENCH} "Supprimer les logs"
|
||||
LangString MsgDelLogs ${LANG_NORWEGIAN} "Delete Logs"
|
||||
LangString MsgDelLogs ${LANG_DUTCH} "Verwijder logging"
|
||||
LangString MsgDelLogs ${LANG_ROMANIAN} "Stergeti Activitate"
|
||||
LangString MsgDelLogs ${LANG_SWEDISH} "Ta bort logg"
|
||||
|
||||
LangString MsgDelCache ${LANG_ENGLISH} "Delete Cache"
|
||||
LangString MsgDelCache ${LANG_DANISH} "Slet hukommelse"
|
||||
LangString MsgDelCache ${LANG_GERMAN} "Cache l<>schen"
|
||||
LangString MsgDelCache ${LANG_FRENCH} "Supprimer le Cache"
|
||||
LangString MsgDelCache ${LANG_NORWEGIAN} "Delete Cache"
|
||||
LangString MsgDelCache ${LANG_DUTCH} "Verwijder Cache"
|
||||
LangString MsgDelCache ${LANG_ROMANIAN} "Stergeti Cache"
|
||||
LangString MsgDelCache ${LANG_SWEDISH} "Ta bort tempor<6F>r-mapp"
|
||||
|
||||
Function un.onInit
|
||||
!insertmacro MUI_UNGETLANGUAGE
|
||||
FunctionEnd
|
||||
|
||||
6
PKG-INFO
@@ -1,8 +1,8 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: SABnzbd
|
||||
Version: 0.7.7
|
||||
Summary: SABnzbd-0.7.7
|
||||
Home-page: http://sabnzbd.org
|
||||
Version: 0.6.12
|
||||
Summary: SABnzbd-0.6.12
|
||||
Home-page: http://sourceforge.net/projects/sabnzbdplus
|
||||
Author: The SABnzbd Team
|
||||
Author-email: team@sabnzbd.org
|
||||
License: GNU General Public License 2 (GPL2 or later)
|
||||
|
||||
68
README.mkd
@@ -1,68 +0,0 @@
|
||||
Release Notes - SABnzbd 0.7.7
|
||||
===============================
|
||||
|
||||
## Features
|
||||
- Updated unrar to 4.20 (OSX/Windows)
|
||||
- Optional web-ui watchdog (diagnostic tool)
|
||||
- Removed account support for defunct indexers
|
||||
|
||||
## Bug fixes
|
||||
- Fix some issues with orphaned items
|
||||
- Generic sort didn't always rename media files in multi-part jobs properly
|
||||
- Always show RSS items in the same order as the original RSS feed
|
||||
|
||||
## What's new in 0.7.0
|
||||
|
||||
- Download quota management
|
||||
- Windows: simple system tray menu
|
||||
- Multi-platform Growl support
|
||||
- NotifyOSD support for Linux distros that have it
|
||||
- Option to set maximum number of retries for servers (prevents deadlock)
|
||||
- Pre-download check to estimate completeness (reliability is limited)
|
||||
- Prevent partial downloading of par2 files that are not needed yet
|
||||
- Config->Special for settings previously only available in the sabnzbd.ini file
|
||||
- For Usenet servers with multiple IP addresses, pick a random one per connection
|
||||
- Add pseudo-priority "Stop" that will send the job immediately to the post-processing queue
|
||||
- Allow jobs still waiting for post-processing to be deleted too
|
||||
- More persistent retries for unreliable indexers
|
||||
- Single Configuration skin for all others skins (there is an option for the old style)
|
||||
- Config->Special for settings that were previously only changeable in the sabnzbd.ini file
|
||||
- Add Spanish, Portuguese (Brazil) and Polish translations
|
||||
- Individual RSS filter toggle
|
||||
- Unified OSX DMG
|
||||
|
||||
|
||||
## About
|
||||
SABnzbd is an open-source cross-platform binary newsreader.
|
||||
It simplifies the process of downloading from Usenet dramatically,
|
||||
thanks to its web-based user interface and advanced
|
||||
built-in post-processing options that automatically verify, repair,
|
||||
extract and clean up posts downloaded from Usenet.
|
||||
|
||||
(c) Copyright 2007-2012 by "The SABnzbd-team" \<team@sabnzbd.org\>
|
||||
|
||||
|
||||
### IMPORTANT INFORMATION about release 0.7.x
|
||||
<http://wiki.sabnzbd.org/introducing-0-7-0>
|
||||
|
||||
### Known problems and solutions
|
||||
- Read the file "ISSUES.txt"
|
||||
|
||||
### Upgrading from 0.6.x
|
||||
- Stop SABnzbd
|
||||
- Install new version
|
||||
- Start SABnzbd
|
||||
|
||||
### Upgrading from 0.5.x
|
||||
- Stop SABnzbd
|
||||
- Install new version
|
||||
- Start SABnzbd.
|
||||
|
||||
The organization of the download queue is different from 0.5.x.
|
||||
0.7.x will finish downloading an existing queue, but you
|
||||
cannot go back to an older version without losing your queue.
|
||||
Also, your sabnzbd.ini file will be upgraded, making it
|
||||
incompatible with release 0.5.x
|
||||
|
||||
### Upgrading from 0.4.x
|
||||
Download your current queue before upgrading.
|
||||
101
README.rtf
Normal file
@@ -0,0 +1,101 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\paperw11900\paperh16840\vieww16360\viewh15680\viewkind0
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
|
||||
|
||||
\f0\b\fs48 \cf0 SABnzbd 0.6.12\
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
|
||||
|
||||
\b0\fs26 \cf0 \
|
||||
|
||||
\b What's new (0.6.12)
|
||||
\b0 \
|
||||
- Fix issue with new localhost handling on some IPv4-only Unixes\
|
||||
- Fix job folder creation by Movie Sort when the Sort expression specifies one\
|
||||
- Fix problem with retrieving ZIP files from some web sites\
|
||||
\b What's new (0.6.11)
|
||||
\b0 \
|
||||
- Improve detection of encrypted RAR files during download\
|
||||
- SABnzbd will now listen on all "localhost" addresses\
|
||||
This should prevent problems on IPV6-enabled systems\
|
||||
- Remove unneeded extra temporary folder level in Generic Sort\
|
||||
- When par2 fails and SFV-check enabled, verify using SFV files\
|
||||
- Perform extra checks on job administration\
|
||||
- Fix logging of pre-queue script result\
|
||||
- Better support for Yahoo pipes\
|
||||
- Accept NZB files containing incorrect dates\
|
||||
- Make newzbin "Get bookmarks now" button independent of automatic readout\
|
||||
- OSX: Fix Growl issues\
|
||||
- OSX: Show the promised 10 queue entries in the OSX menu instead of 9\
|
||||
\
|
||||
\
|
||||
\b About
|
||||
\b0 \
|
||||
SABnzbd is an open-source cross-platform binary newsreader.\
|
||||
It simplifies the process of downloading from Usenet dramatically,\
|
||||
thanks to its friendly web-based user interface and advanced\
|
||||
built-in post-processing options that automatically verify, repair,\
|
||||
extract and clean up posts downloaded from Usenet.\
|
||||
SABnzbd also has a fully customizable user interface,\
|
||||
and offers a complete API for third-party applications to hook into.\
|
||||
\
|
||||
There is an extensive Wiki on the use of SABnzbd.\
|
||||
{\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/"}}{\fldrslt http://wiki.sabnzbd.org/}}\
|
||||
\
|
||||
|
||||
\b IMPORTANT INFORMATION
|
||||
\b0 about release 0.6.0:\
|
||||
{\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/introducing-0-6-0"}}{\fldrslt http://wiki.sabnzbd.org/introducing-0-6-0}}\
|
||||
\
|
||||
|
||||
\b Known problems and solutions\
|
||||
|
||||
\b0 Read the file"ISSUES.txt"
|
||||
\b \
|
||||
|
||||
\b0 \
|
||||
\
|
||||
|
||||
\b\fs40 Upgrading from 0.6.x
|
||||
\b0\fs26 \
|
||||
Stop SABnzbd.\
|
||||
Install new version\
|
||||
Start SABnzbd.\
|
||||
\
|
||||
|
||||
\b\fs40 Upgrading from 0.5.x
|
||||
\b0\fs26 \
|
||||
Stop SABnzbd.\
|
||||
Uninstall current version, keeping the data.\
|
||||
Install new version\
|
||||
Start SABnzbd.\
|
||||
\
|
||||
The organization of the download queue is different from 0.5.x.\
|
||||
0.6.x will finish downloading an existing queue, but you\
|
||||
cannot go back to an older version without losing your queue.\
|
||||
Also, your sabnzbd.ini file will be upgraded, making it\
|
||||
incompatible with release 0.5.x\
|
||||
\
|
||||
|
||||
\b\fs40 \
|
||||
Upgrading from 0.4.x
|
||||
\b0\fs26 \
|
||||
\
|
||||
|
||||
\b PLEASE DOWNLOAD YOUR CURRENT QUEUE BEFORE UPGRADING
|
||||
\b0 \
|
||||
\
|
||||
When upgrading from a 0.4.x release such as 0.4.12 your old settings will be kept.\
|
||||
You will however be given a fresh queue and history. If you have items in your queue\
|
||||
from the older version of SABnzbd, you can either re-import the nzb files if you kept\
|
||||
an nzb backup folder, or temporarily go back to 0.4.x until your queue is complete.\
|
||||
The history is now stored in a better format meaning future upgrades should be backwards\
|
||||
compatible.\
|
||||
\
|
||||
\
|
||||
|
||||
\b\fs40 Changes since 0.5.6
|
||||
\b0\fs26 \
|
||||
See: {\field{\*\fldinst{HYPERLINK "http://wiki.sabnzbd.org/introducing-0-6-0"}}{\fldrslt http://wiki.sabnzbd.org/introducing-0-6-0}}\
|
||||
}
|
||||
30
README.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
************************ SABnzbd 0.6.12 ************************
|
||||
|
||||
What's new (0.6.12):
|
||||
- Fix issue with new localhost handling on some IPv4-only Unixes
|
||||
- Fix job folder creation by Movie Sort when the Sort expression specifies one
|
||||
- Fix problem with retrieving ZIP files from some web sites
|
||||
|
||||
What's new (0.6.11):
|
||||
- Improve detection of encrypted RAR files during download
|
||||
- SABnzbd will now listen on all "localhost" addresses
|
||||
This should prevent problems on IPV6-enabled systems
|
||||
- Remove unneeded extra temporary folder level in Generic Sort
|
||||
- When par2 fails and SFV-check enabled, verify using SFV files
|
||||
- Perform extra checks on job administration
|
||||
- Fix logging of pre-queue script result
|
||||
- Better support for Yahoo pipes
|
||||
- Accept NZB files containing incorrect dates
|
||||
- Make newzbin "Get bookmarks now" button independent of automatic readout
|
||||
- OSX: Fix Growl issues
|
||||
- OSX: Show the promised 10 queue entries in the OSX menu instead of 9
|
||||
|
||||
|
||||
About:
|
||||
SABnzbd is an open-source cross-platform binary newsreader.
|
||||
It simplifies the process of downloading from Usenet dramatically,
|
||||
thanks to its friendly web-based user interface and advanced
|
||||
built-in post-processing options that automatically verify, repair,
|
||||
extract and clean up posts downloaded from Usenet.
|
||||
|
||||
(c) Copyright 2007-2011 by "The SABnzbd-team" <team@sabnzbd.org>
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/python -OO
|
||||
# Copyright 2008-2012 The SABnzbd-Team <team@sabnzbd.org>
|
||||
# Copyright 2008-2011 The SABnzbd-Team <team@sabnzbd.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
|
||||
220
SABnzbd.py
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/python -OO
|
||||
# Copyright 2008-2012 The SABnzbd-Team <team@sabnzbd.org>
|
||||
# Copyright 2008-2011 The SABnzbd-Team <team@sabnzbd.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@@ -16,8 +16,8 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
import sys
|
||||
if sys.version_info < (2, 5):
|
||||
print "Sorry, requires Python 2.5, 2.6 or 2.7."
|
||||
if sys.version_info < (2,5):
|
||||
print "Sorry, requires Python 2.5 or higher."
|
||||
sys.exit(1)
|
||||
|
||||
import logging
|
||||
@@ -28,7 +28,6 @@ import signal
|
||||
import socket
|
||||
import platform
|
||||
import time
|
||||
import re
|
||||
|
||||
try:
|
||||
import Cheetah
|
||||
@@ -79,7 +78,7 @@ import sabnzbd.config as config
|
||||
import sabnzbd.cfg
|
||||
import sabnzbd.downloader
|
||||
from sabnzbd.encoding import unicoder, latin1
|
||||
import sabnzbd.growler as growler
|
||||
from sabnzbd.utils import osx
|
||||
|
||||
from threading import Thread
|
||||
|
||||
@@ -232,7 +231,7 @@ def print_help():
|
||||
print " -t --templates <templ> Template directory [*]"
|
||||
print " -2 --template2 <templ> Secondary template dir [*]"
|
||||
print
|
||||
print " -l --logging <0..2> Set logging level (-1=off, 0= least, 2= most) [*]"
|
||||
print " -l --logging <0..2> Set logging level (0= least, 2= most) [*]"
|
||||
print " -w --weblogging <0..2> Set cherrypy logging (0= off, 1= on, 2= file-only) [*]"
|
||||
print
|
||||
print " -b --browser <0..1> Auto browser launch (0= off, 1= on) [*]"
|
||||
@@ -252,15 +251,13 @@ def print_help():
|
||||
print " with full data reconstruction"
|
||||
print " --https <port> Port to use for HTTPS server"
|
||||
print " --log-all Log all article handling (for developers)"
|
||||
print " --console Force console logging for OSX app"
|
||||
print " --new Run a new instance of SABnzbd"
|
||||
print " --no_ipv6 Do not listen on IPv6 address [::1]"
|
||||
|
||||
def print_version():
|
||||
print """
|
||||
%s-%s
|
||||
|
||||
Copyright (C) 2008-2012, The SABnzbd-Team <team@sabnzbd.org>
|
||||
Copyright (C) 2008-2011, The SABnzbd-Team <team@sabnzbd.org>
|
||||
SABnzbd comes with ABSOLUTELY NO WARRANTY.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions. It is licensed under the
|
||||
@@ -323,8 +320,7 @@ def Web_Template(key, defweb, wdir):
|
||||
wdir = ''
|
||||
if not wdir:
|
||||
wdir = defweb
|
||||
if key:
|
||||
key.set(wdir)
|
||||
key.set(wdir)
|
||||
if not wdir:
|
||||
# No default value defined, accept empty path
|
||||
return ''
|
||||
@@ -334,10 +330,6 @@ def Web_Template(key, defweb, wdir):
|
||||
logging.info("Web dir is %s", full_dir)
|
||||
|
||||
if not os.path.exists(full_main):
|
||||
# Temporarily fix that allows missing Config
|
||||
if defweb == DEF_STDCONFIG:
|
||||
return ''
|
||||
# end temp fix
|
||||
logging.warning(Ta('Cannot find web template: %s, trying standard template'), full_main)
|
||||
full_dir = real_path(sabnzbd.DIR_INTERFACES, DEF_STDINTF)
|
||||
full_main = real_path(full_dir, DEF_MAIN_TMPL)
|
||||
@@ -367,14 +359,12 @@ def fix_webname(name):
|
||||
xname = name.title()
|
||||
else:
|
||||
xname = ''
|
||||
if xname in ('Default', ):
|
||||
if xname in ('Default',):
|
||||
return 'Classic'
|
||||
elif xname in ('Classic', 'Plush', 'Mobile'):
|
||||
return xname
|
||||
elif xname in ('Smpl', 'Wizard'):
|
||||
return name.lower()
|
||||
elif xname in ('Config',):
|
||||
return 'Plush'
|
||||
else:
|
||||
return name
|
||||
|
||||
@@ -503,49 +493,20 @@ def print_modules():
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
def all_localhosts():
|
||||
""" Return all unique values of localhost in order of preference """
|
||||
ips = ['127.0.0.1']
|
||||
try:
|
||||
# Check whether IPv6 is available and enabled
|
||||
info = socket.getaddrinfo('::1', None)
|
||||
af, socktype, proto, canonname, sa = info[0]
|
||||
s = socket.socket(af, socktype, proto)
|
||||
s.close()
|
||||
except socket.error:
|
||||
return ips
|
||||
try:
|
||||
info = socket.getaddrinfo('localhost', None)
|
||||
except:
|
||||
# localhost does not resolve
|
||||
return ips
|
||||
""" Return all unique values of localhost """
|
||||
ips = []
|
||||
for item in info:
|
||||
for item in socket.getaddrinfo('localhost', None):
|
||||
item = item[4][0]
|
||||
if item not in ips:
|
||||
ips.append(item)
|
||||
return ips
|
||||
|
||||
|
||||
def check_resolve(host):
|
||||
""" Return True if 'host' resolves
|
||||
"""
|
||||
try:
|
||||
info = socket.getaddrinfo(host, None)
|
||||
except:
|
||||
# Does not resolve
|
||||
return False
|
||||
return True
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
def get_webhost(cherryhost, cherryport, https_port):
|
||||
""" Determine the webhost address and port,
|
||||
return (host, port, browserhost)
|
||||
"""
|
||||
if cherryhost == '0.0.0.0' and not check_resolve('127.0.0.1'):
|
||||
cherryhost = ''
|
||||
elif cherryhost == '::' and not check_resolve('::1'):
|
||||
cherryhost = ''
|
||||
|
||||
if cherryhost is None:
|
||||
cherryhost = sabnzbd.cfg.cherryhost()
|
||||
else:
|
||||
@@ -558,18 +519,9 @@ def get_webhost(cherryhost, cherryport, https_port):
|
||||
try:
|
||||
info = socket.getaddrinfo(socket.gethostname(), None)
|
||||
except:
|
||||
# Hostname does not resolve
|
||||
try:
|
||||
# Valid user defined name?
|
||||
info = socket.getaddrinfo(cherryhost, None)
|
||||
except:
|
||||
if cherryhost not in ('localhost', '127.0.0.1', '::1'):
|
||||
cherryhost = '0.0.0.0'
|
||||
try:
|
||||
info = socket.getaddrinfo(localhost, None)
|
||||
except:
|
||||
info = socket.getaddrinfo('127.0.0.1', None)
|
||||
localhost = '127.0.0.1'
|
||||
# Hostname does not resolve, use 0.0.0.0
|
||||
cherryhost = '0.0.0.0'
|
||||
info = socket.getaddrinfo(localhost, None)
|
||||
for item in info:
|
||||
ip = str(item[4][0])
|
||||
if ip.startswith('169.254.'):
|
||||
@@ -663,7 +615,7 @@ def get_webhost(cherryhost, cherryport, https_port):
|
||||
# if the https port was specified, assume they want HTTPS enabling also
|
||||
sabnzbd.cfg.enable_https.set(True)
|
||||
|
||||
if cherryport == https_port and sabnzbd.cfg.enable_https():
|
||||
if cherryport == https_port:
|
||||
sabnzbd.cfg.enable_https.set(False)
|
||||
# Should have a translated message, but that's not available yet
|
||||
#logging.error(Ta('HTTP and HTTPS ports cannot be the same'))
|
||||
@@ -672,27 +624,28 @@ def get_webhost(cherryhost, cherryport, https_port):
|
||||
return cherryhost, cherryport, browserhost, https_port
|
||||
|
||||
|
||||
def attach_server(host, port, cert=None, key=None, chain=None):
|
||||
def attach_server(host, port, cert=None, key=None):
|
||||
""" Define and attach server, optionally HTTPS
|
||||
"""
|
||||
if not (sabnzbd.cfg.no_ipv6() and '::1' in host):
|
||||
http_server = _cpwsgi_server.CPWSGIServer()
|
||||
http_server.bind_addr = (host, port)
|
||||
if cert and key:
|
||||
http_server.ssl_certificate = cert
|
||||
http_server.ssl_private_key = key
|
||||
http_server.ssl_certificate_chain = chain
|
||||
adapter = _cpserver.ServerAdapter(cherrypy.engine, http_server, http_server.bind_addr)
|
||||
adapter.subscribe()
|
||||
http_server = _cpwsgi_server.CPWSGIServer()
|
||||
http_server.bind_addr = (host, port)
|
||||
if cert and key:
|
||||
http_server.ssl_certificate = cert
|
||||
http_server.ssl_private_key = key
|
||||
adapter = _cpserver.ServerAdapter(cherrypy.engine, http_server, http_server.bind_addr)
|
||||
adapter.subscribe()
|
||||
|
||||
|
||||
def is_sabnzbd_running(url, timeout=None):
|
||||
def is_sabnzbd_running(url):
|
||||
""" Return True when there's already a SABnzbd instance running.
|
||||
"""
|
||||
try:
|
||||
url = '%s&mode=version' % (url)
|
||||
ver = sabnzbd.newsunpack.get_from_url(url, timeout=timeout)
|
||||
return bool(ver and re.search(r'\d+\.\d+\.', ver))
|
||||
ver = sabnzbd.newsunpack.get_from_url(url)
|
||||
if ver and ver.strip(' \n\r\t') == sabnzbd.__version__:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
except:
|
||||
return False
|
||||
|
||||
@@ -712,7 +665,7 @@ def find_free_port(host, currentport):
|
||||
|
||||
|
||||
def check_for_sabnzbd(url, upload_nzbs, allow_browser=True):
|
||||
""" Check for a running instance of sabnzbd on this port
|
||||
""" Check for a running instance of sabnzbd(same version) on this port
|
||||
allow_browser==True|None will launch the browser, False will not.
|
||||
"""
|
||||
if allow_browser is None:
|
||||
@@ -777,7 +730,7 @@ def evaluate_inipath(path):
|
||||
inipath = os.path.join(path, DEF_INI_FILE)
|
||||
if os.path.isdir(path):
|
||||
return inipath
|
||||
elif os.path.isfile(path) or os.path.isfile(path + '.bak'):
|
||||
elif os.path.isfile(path):
|
||||
return path
|
||||
else:
|
||||
dirpart, name = os.path.split(path)
|
||||
@@ -840,10 +793,10 @@ def commandline_handler(frozen=True):
|
||||
try:
|
||||
opts, args = getopt.getopt(info, "phdvncw:l:s:f:t:b:2:",
|
||||
['pause', 'help', 'daemon', 'nobrowser', 'clean', 'logging=',
|
||||
'weblogging=', 'server=', 'templates', 'no_ipv6',
|
||||
'weblogging=', 'server=', 'templates',
|
||||
'template2', 'browser=', 'config-file=', 'force',
|
||||
'version', 'https=', 'autorestarted', 'repair', 'repair-all',
|
||||
'log-all', 'no-login', 'pid=', 'new', 'sessions', 'console',
|
||||
'log-all', 'no-login', 'pid=', 'new', 'sessions',
|
||||
# Below Win32 Service options
|
||||
'password=', 'username=', 'startup=', 'perfmonini=', 'perfmondll=',
|
||||
'interactive', 'wait=',
|
||||
@@ -917,8 +870,6 @@ def main():
|
||||
pid_path = None
|
||||
new_instance = False
|
||||
force_sessions = False
|
||||
osx_console = False
|
||||
no_ipv6 = False
|
||||
|
||||
service, sab_opts, serv_opts, upload_nzbs = commandline_handler()
|
||||
|
||||
@@ -967,8 +918,8 @@ def main():
|
||||
try:
|
||||
logging_level = int(arg)
|
||||
except:
|
||||
logging_level = -2
|
||||
if logging_level < -1 or logging_level > 2:
|
||||
logging_level = -1
|
||||
if logging_level < 0 or logging_level > 2:
|
||||
print_help()
|
||||
exit_sab(1)
|
||||
elif opt in ('-v', '--version'):
|
||||
@@ -1000,13 +951,7 @@ def main():
|
||||
elif opt in ('--new',):
|
||||
new_instance = True
|
||||
elif opt in ('--sessions',):
|
||||
re_argv.append(opt)
|
||||
force_sessions = True
|
||||
elif opt in ('--console',):
|
||||
re_argv.append(opt)
|
||||
osx_console = True
|
||||
elif opt in ('--no_ipv6',):
|
||||
no_ipv6 = True
|
||||
|
||||
sabnzbd.MY_FULLNAME = os.path.normpath(os.path.abspath(sabnzbd.MY_FULLNAME))
|
||||
sabnzbd.MY_NAME = os.path.basename(sabnzbd.MY_FULLNAME)
|
||||
@@ -1024,11 +969,11 @@ def main():
|
||||
consoleLogging = consoleLogging and not sabnzbd.DAEMON
|
||||
|
||||
# No console logging needed for OSX app
|
||||
noConsoleLoggingOSX = (not osx_console) and (sabnzbd.DIR_PROG.find('.app/Contents/Resources') > 0)
|
||||
noConsoleLoggingOSX = (sabnzbd.DIR_PROG.find('.app/Contents/Resources') > 0)
|
||||
if noConsoleLoggingOSX:
|
||||
consoleLogging = 1
|
||||
|
||||
LOGLEVELS = (logging.FATAL, logging.WARNING, logging.INFO, logging.DEBUG)
|
||||
LOGLEVELS = (logging.WARNING, logging.INFO, logging.DEBUG)
|
||||
|
||||
# Setup primary logging to prevent default console logging
|
||||
gui_log = guiHandler(MAX_WARNINGS)
|
||||
@@ -1060,7 +1005,7 @@ def main():
|
||||
GetProfileInfo(vista_plus)
|
||||
# Find out where INI file is
|
||||
inifile = os.path.abspath(sabnzbd.DIR_PROG + '/' + DEF_INI_FILE)
|
||||
if not os.path.exists(inifile) and not os.path.exists(inifile + '.bak'):
|
||||
if not os.path.exists(inifile):
|
||||
inifile = os.path.abspath(sabnzbd.DIR_LCLDATA + '/' + DEF_INI_FILE)
|
||||
if sabnzbd.DARWIN:
|
||||
copy_old_files(sabnzbd.DIR_LCLDATA)
|
||||
@@ -1072,7 +1017,7 @@ def main():
|
||||
# All system data dirs are relative to the place we found the INI file
|
||||
sabnzbd.DIR_LCLDATA = os.path.dirname(inifile)
|
||||
|
||||
if not os.path.exists(inifile) and not os.path.exists(inifile + '.bak') and not os.path.exists(sabnzbd.DIR_LCLDATA):
|
||||
if not os.path.exists(inifile) and not os.path.exists(sabnzbd.DIR_LCLDATA):
|
||||
try:
|
||||
os.makedirs(sabnzbd.DIR_LCLDATA)
|
||||
except IOError:
|
||||
@@ -1089,9 +1034,6 @@ def main():
|
||||
# Set root folders for HTTPS server file paths
|
||||
sabnzbd.cfg.set_root_folders2()
|
||||
|
||||
if no_ipv6:
|
||||
sabnzbd.cfg.no_ipv6.set(True)
|
||||
|
||||
# Determine web host address
|
||||
cherryhost, cherryport, browserhost, https_port = get_webhost(cherryhost, cherryport, https_port)
|
||||
enable_https = sabnzbd.cfg.enable_https()
|
||||
@@ -1210,11 +1152,13 @@ def main():
|
||||
sabnzbd.cfg.log_backups())
|
||||
|
||||
format = '%(asctime)s::%(levelname)s::[%(module)s:%(lineno)d] %(message)s'
|
||||
if sabnzbd.WIN32:
|
||||
format += '\r'
|
||||
rollover_log.setFormatter(logging.Formatter(format))
|
||||
rollover_log.addFilter(FilterCP3())
|
||||
sabnzbd.LOGHANDLER = rollover_log
|
||||
logger.addHandler(rollover_log)
|
||||
logger.setLevel(LOGLEVELS[logging_level+1])
|
||||
logger.setLevel(LOGLEVELS[logging_level])
|
||||
|
||||
except IOError:
|
||||
print "Error:"
|
||||
@@ -1242,7 +1186,7 @@ def main():
|
||||
if consoleLogging:
|
||||
console = logging.StreamHandler()
|
||||
console.addFilter(FilterCP3())
|
||||
console.setLevel(LOGLEVELS[logging_level+1])
|
||||
console.setLevel(LOGLEVELS[logging_level])
|
||||
console.setFormatter(logging.Formatter(format))
|
||||
logger.addHandler(console)
|
||||
if noConsoleLoggingOSX:
|
||||
@@ -1303,14 +1247,12 @@ def main():
|
||||
|
||||
web_dir = Web_Template(sabnzbd.cfg.web_dir, DEF_STDINTF, fix_webname(web_dir))
|
||||
web_dir2 = Web_Template(sabnzbd.cfg.web_dir2, '', fix_webname(web_dir2))
|
||||
web_dirc = Web_Template(None, DEF_STDCONFIG, '')
|
||||
|
||||
wizard_dir = os.path.join(sabnzbd.DIR_INTERFACES, 'wizard')
|
||||
#sabnzbd.lang.install_language(os.path.join(wizard_dir, DEF_INT_LANGUAGE), sabnzbd.cfg.language(), 'wizard')
|
||||
|
||||
sabnzbd.WEB_DIR = web_dir
|
||||
sabnzbd.WEB_DIR2 = web_dir2
|
||||
sabnzbd.WEB_DIRC = web_dirc
|
||||
sabnzbd.WIZARD_DIR = wizard_dir
|
||||
|
||||
sabnzbd.WEB_COLOR = CheckColor(sabnzbd.cfg.web_color(), web_dir)
|
||||
@@ -1324,10 +1266,6 @@ def main():
|
||||
# Save the INI file
|
||||
config.save_config(force=True)
|
||||
|
||||
if sabnzbd.WIN32 and sabnzbd.cfg.win_menu() and not sabnzbd.DAEMON:
|
||||
import sabnzbd.sabtray
|
||||
sabnzbd.WINTRAY = sabnzbd.sabtray.SABTrayThread()
|
||||
|
||||
print_modules()
|
||||
|
||||
cherrylogtoscreen = False
|
||||
@@ -1349,10 +1287,6 @@ def main():
|
||||
|
||||
https_cert = sabnzbd.cfg.https_cert.get_path()
|
||||
https_key = sabnzbd.cfg.https_key.get_path()
|
||||
https_chain = sabnzbd.cfg.https_chain.get_path()
|
||||
if not (sabnzbd.cfg.https_chain() and os.path.exists(https_chain)):
|
||||
https_chain = None
|
||||
|
||||
if enable_https:
|
||||
# If either the HTTPS certificate or key do not exist, make some self-signed ones.
|
||||
if not (https_cert and os.path.exists(https_cert)) or not (https_key and os.path.exists(https_key)):
|
||||
@@ -1371,8 +1305,8 @@ def main():
|
||||
hosts[1] = '::1'
|
||||
|
||||
# The Windows binary requires numeric localhost as primary address
|
||||
if multilocal and cherryhost == 'localhost':
|
||||
cherryhost = hosts[0]
|
||||
if multilocal and cherryhost == 'localhost' and hosts[1] == '127.0.0.1':
|
||||
cherryhost = '::1'
|
||||
|
||||
if enable_https:
|
||||
if https_port:
|
||||
@@ -1382,15 +1316,14 @@ def main():
|
||||
# Extra HTTP port for secondary localhost
|
||||
attach_server(hosts[1], cherryport)
|
||||
# Extra HTTPS port for secondary localhost
|
||||
attach_server(hosts[1], https_port, https_cert, https_key, https_chain)
|
||||
attach_server(hosts[1], https_port, https_cert, https_key)
|
||||
cherryport = https_port
|
||||
elif multilocal:
|
||||
# Extra HTTPS port for secondary localhost
|
||||
attach_server(hosts[1], cherryport, https_cert, https_key)
|
||||
|
||||
cherrypy.config.update({'server.ssl_certificate' : https_cert,
|
||||
'server.ssl_private_key' : https_key,
|
||||
'server.ssl_certificate_chain' : https_chain})
|
||||
'server.ssl_private_key' : https_key })
|
||||
elif multilocal:
|
||||
# Extra HTTP port for secondary localhost
|
||||
attach_server(hosts[1], cherryport)
|
||||
@@ -1408,17 +1341,6 @@ def main():
|
||||
else:
|
||||
sessions = None
|
||||
|
||||
mime_gzip = ('text/html',
|
||||
'text/plain',
|
||||
'text/css',
|
||||
'text/xml',
|
||||
'text/javascript',
|
||||
'application/javascript',
|
||||
'text/x-javascript',
|
||||
'application/x-javascript',
|
||||
'text/x-json',
|
||||
'application/json'
|
||||
)
|
||||
cherrypy.config.update({'server.environment': 'production',
|
||||
'server.socket_host': cherryhost,
|
||||
'server.socket_port': cherryport,
|
||||
@@ -1428,21 +1350,17 @@ def main():
|
||||
'engine.reexec_retry' : 100,
|
||||
'tools.encode.on' : True,
|
||||
'tools.gzip.on' : True,
|
||||
'tools.gzip.mime_types' : mime_gzip,
|
||||
'tools.sessions.on' : bool(sessions),
|
||||
'tools.sessions.storage_type' : 'file',
|
||||
'tools.sessions.storage_path' : sessions,
|
||||
'tools.sessions.timeout' : 60,
|
||||
'request.show_tracebacks': True,
|
||||
'checker.check_localhost' : bool(consoleLogging),
|
||||
'error_page.401': sabnzbd.panic.error_page_401,
|
||||
'error_page.404': sabnzbd.panic.error_page_404
|
||||
'error_page.401': sabnzbd.panic.error_page_401
|
||||
})
|
||||
|
||||
|
||||
static = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(web_dir, 'static')}
|
||||
if web_dirc:
|
||||
staticcfg = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(web_dirc, 'staticcfg')}
|
||||
wizard_static = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(wizard_dir, 'static')}
|
||||
|
||||
appconfig = {'/sabnzbd/api' : {'tools.basic_auth.on' : False},
|
||||
@@ -1457,9 +1375,6 @@ def main():
|
||||
'/sabnzbd/wizard/static': wizard_static,
|
||||
'/wizard/static': wizard_static
|
||||
}
|
||||
if web_dirc:
|
||||
appconfig['/sabnzbd/staticcfg'] = staticcfg
|
||||
appconfig['/staticcfg'] = staticcfg
|
||||
|
||||
if web_dir2:
|
||||
static2 = {'tools.staticdir.on': True, 'tools.staticdir.dir': os.path.join(web_dir2, 'static')}
|
||||
@@ -1470,11 +1385,8 @@ def main():
|
||||
appconfig['/m/static'] = static2
|
||||
appconfig['/sabnzbd/m/wizard/static'] = wizard_static
|
||||
appconfig['/m/wizard/static'] = wizard_static
|
||||
if web_dirc:
|
||||
appconfig['/sabnzbd/m/staticcfg'] = staticcfg
|
||||
appconfig['/m/staticcfg'] = staticcfg
|
||||
|
||||
login_page = sabnzbd.interface.MainPage(web_dir, '/', web_dir2, '/m/', web_dirc, first=2)
|
||||
login_page = sabnzbd.interface.MainPage(web_dir, '/', web_dir2, '/m/', first=2)
|
||||
cherrypy.tree.mount(login_page, '/', config=appconfig)
|
||||
|
||||
# Set authentication for CherryPy
|
||||
@@ -1509,9 +1421,9 @@ def main():
|
||||
|
||||
if enable_https:
|
||||
browser_url = "https://%s:%s/sabnzbd" % (browserhost, cherryport)
|
||||
cherrypy.wsgiserver.REDIRECT_URL = browser_url
|
||||
else:
|
||||
browser_url = "http://%s:%s/sabnzbd" % (browserhost, cherryport)
|
||||
cherrypy.wsgiserver.REDIRECT_URL = browser_url
|
||||
|
||||
sabnzbd.BROWSER_URL = browser_url
|
||||
if not autorestarted:
|
||||
@@ -1519,12 +1431,12 @@ def main():
|
||||
if sabnzbd.FOUNDATION:
|
||||
import sabnzbd.osxmenu
|
||||
sabnzbd.osxmenu.notify("SAB_Launched", None)
|
||||
growler.send_notification('SABnzbd%s' % growler.hostname(),
|
||||
T('SABnzbd %s started') % sabnzbd.__version__, 'startup')
|
||||
osx.sendGrowlMsg('SABnzbd %s' % (sabnzbd.__version__),"http://%s:%s/sabnzbd" % (browserhost, cherryport),osx.NOTIFICATION['startup'])
|
||||
# Now's the time to check for a new version
|
||||
check_latest_version()
|
||||
autorestarted = False
|
||||
|
||||
|
||||
mail = None
|
||||
if sabnzbd.WIN32:
|
||||
if enable_https:
|
||||
@@ -1563,7 +1475,7 @@ def main():
|
||||
add_local(f)
|
||||
|
||||
# Have to keep this running, otherwise logging will terminate
|
||||
timer = timer5 = 0
|
||||
timer = 0
|
||||
while not sabnzbd.SABSTOP:
|
||||
if sabnzbd.WIN_SERVICE:
|
||||
rc = win32event.WaitForMultipleObjects((sabnzbd.WIN_SERVICE.hWaitStop,
|
||||
@@ -1581,7 +1493,7 @@ def main():
|
||||
# Check for loglevel changes
|
||||
if LOG_FLAG:
|
||||
LOG_FLAG = False
|
||||
level = LOGLEVELS[sabnzbd.cfg.log_level()+1]
|
||||
level = LOGLEVELS[sabnzbd.cfg.log_level()]
|
||||
logger.setLevel(level)
|
||||
if consoleLogging:
|
||||
console.setLevel(level)
|
||||
@@ -1589,7 +1501,7 @@ def main():
|
||||
### 30 sec polling tasks
|
||||
if timer > 9:
|
||||
timer = 0
|
||||
# Keep OS awake (if needed)
|
||||
# Keep Windows awake (if needed)
|
||||
sabnzbd.keep_awake()
|
||||
# Restart scheduler (if needed)
|
||||
scheduler.restart()
|
||||
@@ -1603,15 +1515,6 @@ def main():
|
||||
if sabnzbd.WIN_SERVICE and mail:
|
||||
mail.send('active')
|
||||
|
||||
if timer5 > 9:
|
||||
### 5 minute polling tasks
|
||||
timer5 = 0
|
||||
if sabnzbd.cfg.web_watchdog() and not is_sabnzbd_running('%s/api?tickleme=1' % sabnzbd.BROWSER_URL, 120):
|
||||
autorestarted = True
|
||||
cherrypy.engine.execv = True
|
||||
else:
|
||||
timer5 += 1
|
||||
|
||||
else:
|
||||
timer += 1
|
||||
|
||||
@@ -1656,9 +1559,6 @@ def main():
|
||||
|
||||
config.save_config()
|
||||
|
||||
if sabnzbd.WINTRAY:
|
||||
sabnzbd.WINTRAY.terminate = True
|
||||
|
||||
if sabnzbd.WIN_SERVICE and mail:
|
||||
mail.send('stop')
|
||||
if sabnzbd.WIN32:
|
||||
@@ -1671,7 +1571,8 @@ def main():
|
||||
if getattr(sys, 'frozen', None) == 'macosx_app':
|
||||
AppHelper.stopEventLoop()
|
||||
else:
|
||||
growler.send_notification('SABnzbd',T('SABnzbd shutdown finished'), 'startup')
|
||||
if sabnzbd.DARWIN:
|
||||
osx.sendGrowlMsg('SABnzbd',T('SABnzbd shutdown finished'),osx.NOTIFICATION['startup'])
|
||||
os._exit(0)
|
||||
|
||||
|
||||
@@ -1794,14 +1695,7 @@ def HandleCommandLine(allow_service=True):
|
||||
#
|
||||
if __name__ == '__main__':
|
||||
|
||||
args = []
|
||||
for txt in sys.argv:
|
||||
if ' ' in txt:
|
||||
txt = '"%s"' % latin1(txt)
|
||||
else:
|
||||
txt = latin1(txt)
|
||||
args.append(txt)
|
||||
sabnzbd.CMDLINE = ' '.join(args)
|
||||
sabnzbd.CMDLINE = ', '.join(['"%s"' % latin1(p) for p in sys.argv])
|
||||
|
||||
if sabnzbd.WIN32:
|
||||
if not HandleCommandLine(allow_service=not hasattr(sys, "frozen")):
|
||||
|
||||
@@ -658,10 +658,7 @@ class Request(object):
|
||||
# Handle cookies differently because on Konqueror, multiple
|
||||
# cookies come on different lines with the same key
|
||||
if name == 'Cookie':
|
||||
try:
|
||||
self.cookie.load(value)
|
||||
except:
|
||||
pass
|
||||
self.cookie.load(value)
|
||||
|
||||
if not dict.__contains__(headers, 'Host'):
|
||||
# All Internet-based HTTP/1.1 servers MUST respond with a 400
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 52 KiB |
@@ -1,4 +1,3 @@
|
||||
import logging
|
||||
import cherrypy
|
||||
from cherrypy.lib import httpauth
|
||||
|
||||
@@ -10,10 +9,10 @@ def check_auth(users, encrypt=None, realm=None):
|
||||
ah = httpauth.parseAuthorization(cherrypy.request.headers['authorization'])
|
||||
if ah is None:
|
||||
raise cherrypy.HTTPError(400, 'Bad Request')
|
||||
|
||||
|
||||
if not encrypt:
|
||||
encrypt = httpauth.DIGEST_AUTH_ENCODERS[httpauth.MD5]
|
||||
|
||||
|
||||
if callable(users):
|
||||
try:
|
||||
# backward compatibility
|
||||
@@ -21,7 +20,7 @@ def check_auth(users, encrypt=None, realm=None):
|
||||
|
||||
if not isinstance(users, dict):
|
||||
raise ValueError, "Authentication users must be a dictionary"
|
||||
|
||||
|
||||
# fetch the user password
|
||||
password = users.get(ah["username"], None)
|
||||
except TypeError:
|
||||
@@ -30,26 +29,23 @@ def check_auth(users, encrypt=None, realm=None):
|
||||
else:
|
||||
if not isinstance(users, dict):
|
||||
raise ValueError, "Authentication users must be a dictionary"
|
||||
|
||||
|
||||
# fetch the user password
|
||||
password = users.get(ah["username"], None)
|
||||
|
||||
|
||||
# validate the authorization by re-computing it here
|
||||
# and compare it with what the user-agent provided
|
||||
if httpauth.checkResponse(ah, password, method=cherrypy.request.method,
|
||||
encrypt=encrypt, realm=realm):
|
||||
cherrypy.request.login = ah["username"]
|
||||
return True
|
||||
|
||||
if ah.get('username') or ah.get('password'):
|
||||
logging.info('Attempt to login with wrong credentials from %s',
|
||||
cherrypy.request.headers['Remote-Addr'])
|
||||
|
||||
cherrypy.request.login = False
|
||||
return False
|
||||
|
||||
def basic_auth(realm, users, encrypt=None):
|
||||
"""If auth fails, raise 401 with a basic authentication header.
|
||||
|
||||
|
||||
realm: a string containing the authentication realm.
|
||||
users: a dict of the form: {username: password} or a callable returning a dict.
|
||||
encrypt: callable used to encrypt the password returned from the user-agent.
|
||||
@@ -57,23 +53,23 @@ def basic_auth(realm, users, encrypt=None):
|
||||
"""
|
||||
if check_auth(users, encrypt):
|
||||
return
|
||||
|
||||
|
||||
# inform the user-agent this path is protected
|
||||
cherrypy.response.headers['www-authenticate'] = httpauth.basicAuth(realm)
|
||||
|
||||
raise cherrypy.HTTPError(401, "You are not authorized to access that resource")
|
||||
|
||||
raise cherrypy.HTTPError(401, "You are not authorized to access that resource")
|
||||
|
||||
def digest_auth(realm, users):
|
||||
"""If auth fails, raise 401 with a digest authentication header.
|
||||
|
||||
|
||||
realm: a string containing the authentication realm.
|
||||
users: a dict of the form: {username: password} or a callable returning a dict.
|
||||
"""
|
||||
if check_auth(users, realm=realm):
|
||||
return
|
||||
|
||||
|
||||
# inform the user-agent this path is protected
|
||||
cherrypy.response.headers['www-authenticate'] = httpauth.digestAuth(realm)
|
||||
|
||||
raise cherrypy.HTTPError(401, "You are not authorized to access that resource")
|
||||
|
||||
|
||||
raise cherrypy.HTTPError(401, "You are not authorized to access that resource")
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
##
|
||||
## Bad URL Fetch Email template for SABnzbd
|
||||
## This a Cheetah template
|
||||
## Documentation: http://sabnzbd.wikidot.com/email-templates
|
||||
##
|
||||
## Newlines and whitespace are significant!
|
||||
##
|
||||
## These are the email headers
|
||||
To: $to
|
||||
From: $from
|
||||
Date: $date
|
||||
Subject: SABnzbd failed to fetch an NZB
|
||||
X-priority: 5
|
||||
X-MS-priority: 5
|
||||
## After this comes the body, the empty line is required!
|
||||
|
||||
Hi,
|
||||
|
||||
SABnzbd has failed to retrieve the NZB from $url.
|
||||
The error message was: $msg
|
||||
|
||||
Bye
|
||||
592
gntp/__init__.py
@@ -1,402 +1,332 @@
|
||||
import re
|
||||
import hashlib
|
||||
import time
|
||||
import StringIO
|
||||
|
||||
__version__ = '0.8'
|
||||
|
||||
#GNTP/<version> <messagetype> <encryptionAlgorithmID>[:<ivValue>][ <keyHashAlgorithmID>:<keyHash>.<salt>]
|
||||
GNTP_INFO_LINE = re.compile(
|
||||
'GNTP/(?P<version>\d+\.\d+) (?P<messagetype>REGISTER|NOTIFY|SUBSCRIBE|\-OK|\-ERROR)' +
|
||||
' (?P<encryptionAlgorithmID>[A-Z0-9]+(:(?P<ivValue>[A-F0-9]+))?) ?' +
|
||||
'((?P<keyHashAlgorithmID>[A-Z0-9]+):(?P<keyHash>[A-F0-9]+).(?P<salt>[A-F0-9]+))?\r\n',
|
||||
re.IGNORECASE
|
||||
)
|
||||
|
||||
GNTP_INFO_LINE_SHORT = re.compile(
|
||||
'GNTP/(?P<version>\d+\.\d+) (?P<messagetype>REGISTER|NOTIFY|SUBSCRIBE|\-OK|\-ERROR)',
|
||||
re.IGNORECASE
|
||||
)
|
||||
|
||||
GNTP_HEADER = re.compile('([\w-]+):(.+)')
|
||||
|
||||
GNTP_EOL = '\r\n'
|
||||
import platform
|
||||
|
||||
__version__ = '0.4'
|
||||
|
||||
class BaseError(Exception):
|
||||
def gntp_error(self):
|
||||
error = GNTPError(self.errorcode, self.errordesc)
|
||||
return error.encode()
|
||||
|
||||
pass
|
||||
|
||||
class ParseError(BaseError):
|
||||
errorcode = 500
|
||||
errordesc = 'Error parsing the message'
|
||||
|
||||
def gntp_error(self):
|
||||
error = GNTPError(errorcode=500,errordesc='Error parsing the message')
|
||||
return error.encode()
|
||||
|
||||
class AuthError(BaseError):
|
||||
errorcode = 400
|
||||
errordesc = 'Error with authorization'
|
||||
|
||||
def gntp_error(self):
|
||||
error = GNTPError(errorcode=400,errordesc='Error with authorization')
|
||||
return error.encode()
|
||||
|
||||
class UnsupportedError(BaseError):
|
||||
errorcode = 500
|
||||
errordesc = 'Currently unsupported by gntp.py'
|
||||
|
||||
|
||||
class _GNTPBuffer(StringIO.StringIO):
|
||||
"""GNTP Buffer class"""
|
||||
def writefmt(self, message="", *args):
|
||||
"""Shortcut function for writing GNTP Headers"""
|
||||
self.write((message % args).encode('utf8', 'replace'))
|
||||
self.write(GNTP_EOL)
|
||||
|
||||
def gntp_error(self):
|
||||
error = GNTPError(errorcode=500,errordesc='Currently unsupported by gntp.py')
|
||||
return error.encode()
|
||||
|
||||
class _GNTPBase(object):
|
||||
"""Base initilization
|
||||
|
||||
:param string messagetype: GNTP Message type
|
||||
:param string version: GNTP Protocol version
|
||||
:param string encription: Encryption protocol
|
||||
"""
|
||||
def __init__(self, messagetype=None, version='1.0', encryption=None):
|
||||
self.info = {
|
||||
'version': version,
|
||||
'messagetype': messagetype,
|
||||
'encryptionAlgorithmID': encryption
|
||||
}
|
||||
self.headers = {}
|
||||
self.resources = {}
|
||||
|
||||
info = {
|
||||
'version':'1.0',
|
||||
'messagetype':None,
|
||||
'encryptionAlgorithmID':None
|
||||
}
|
||||
_requiredHeaders = []
|
||||
headers = {}
|
||||
resources = {}
|
||||
def add_origin_info(self):
|
||||
self.add_header('Origin-Machine-Name',platform.node())
|
||||
self.add_header('Origin-Software-Name','gntp.py')
|
||||
self.add_header('Origin-Software-Version',__version__)
|
||||
self.add_header('Origin-Platform-Name',platform.system())
|
||||
self.add_header('Origin-Platform-Version',platform.platform())
|
||||
def __str__(self):
|
||||
return self.encode()
|
||||
|
||||
def _parse_info(self, data):
|
||||
"""Parse the first line of a GNTP message to get security and other info values
|
||||
|
||||
:param string data: GNTP Message
|
||||
:return dict: Parsed GNTP Info line
|
||||
"""
|
||||
|
||||
match = GNTP_INFO_LINE.match(data)
|
||||
|
||||
def _parse_info(self,data):
|
||||
'''
|
||||
Parse the first line of a GNTP message to get security and other info values
|
||||
@param data: GNTP Message
|
||||
@return: GNTP Message information in a dictionary
|
||||
'''
|
||||
#GNTP/<version> <messagetype> <encryptionAlgorithmID>[:<ivValue>][ <keyHashAlgorithmID>:<keyHash>.<salt>]
|
||||
match = re.match('GNTP/(?P<version>\d+\.\d+) (?P<messagetype>REGISTER|NOTIFY|SUBSCRIBE|\-OK|\-ERROR)'+
|
||||
' (?P<encryptionAlgorithmID>[A-Z0-9]+(:(?P<ivValue>[A-F0-9]+))?) ?'+
|
||||
'((?P<keyHashAlgorithmID>[A-Z0-9]+):(?P<keyHash>[A-F0-9]+).(?P<salt>[A-F0-9]+))?\r\n', data,re.IGNORECASE)
|
||||
|
||||
if not match:
|
||||
raise ParseError('ERROR_PARSING_INFO_LINE')
|
||||
|
||||
|
||||
info = match.groupdict()
|
||||
if info['encryptionAlgorithmID'] == 'NONE':
|
||||
info['encryptionAlgorithmID'] = None
|
||||
|
||||
|
||||
return info
|
||||
|
||||
def set_password(self, password, encryptAlgo='MD5'):
|
||||
"""Set a password for a GNTP Message
|
||||
|
||||
:param string password: Null to clear password
|
||||
:param string encryptAlgo: Supports MD5, SHA1, SHA256, SHA512
|
||||
"""
|
||||
def set_password(self,password,encryptAlgo='MD5'):
|
||||
'''
|
||||
Set a password for a GNTP Message
|
||||
@param password: Null to clear password
|
||||
@param encryptAlgo: Supports MD5,SHA1,SHA256,SHA512
|
||||
@todo: Support other hash functions
|
||||
'''
|
||||
hash = {
|
||||
'MD5': hashlib.md5,
|
||||
'SHA1': hashlib.sha1,
|
||||
'SHA256': hashlib.sha256,
|
||||
'SHA512': hashlib.sha512,
|
||||
}
|
||||
|
||||
|
||||
self.password = password
|
||||
self.encryptAlgo = encryptAlgo.upper()
|
||||
if not password:
|
||||
self.info['encryptionAlgorithmID'] = None
|
||||
self.info['keyHashAlgorithm'] = None
|
||||
self.info['keyHashAlgorithm'] = None;
|
||||
return
|
||||
if not self.encryptAlgo in hash.keys():
|
||||
raise UnsupportedError('INVALID HASH "%s"' % self.encryptAlgo)
|
||||
|
||||
raise UnsupportedError('INVALID HASH "%s"'%self.encryptAlgo)
|
||||
|
||||
hashfunction = hash.get(self.encryptAlgo)
|
||||
|
||||
|
||||
password = password.encode('utf8')
|
||||
seed = time.ctime()
|
||||
salt = hashfunction(seed).hexdigest()
|
||||
saltHash = hashfunction(seed).digest()
|
||||
keyBasis = password + saltHash
|
||||
keyBasis = password+saltHash
|
||||
key = hashfunction(keyBasis).digest()
|
||||
keyHash = hashfunction(key).hexdigest()
|
||||
|
||||
|
||||
self.info['keyHashAlgorithmID'] = self.encryptAlgo
|
||||
self.info['keyHash'] = keyHash.upper()
|
||||
self.info['salt'] = salt.upper()
|
||||
|
||||
def _decode_hex(self, value):
|
||||
"""Helper function to decode hex string to `proper` hex string
|
||||
|
||||
:param string value: Human readable hex string
|
||||
:return string: Hex string
|
||||
"""
|
||||
def _decode_hex(self,value):
|
||||
'''
|
||||
Helper function to decode hex string to `proper` hex string
|
||||
@param value: Value to decode
|
||||
@return: Hex string
|
||||
'''
|
||||
result = ''
|
||||
for i in range(0, len(value), 2):
|
||||
tmp = int(value[i:i + 2], 16)
|
||||
for i in range(0,len(value),2):
|
||||
tmp = int(value[i:i+2],16)
|
||||
result += chr(tmp)
|
||||
return result
|
||||
|
||||
def _decode_binary(self, rawIdentifier, identifier):
|
||||
def _decode_binary(self,rawIdentifier,identifier):
|
||||
rawIdentifier += '\r\n\r\n'
|
||||
dataLength = int(identifier['Length'])
|
||||
pointerStart = self.raw.find(rawIdentifier) + len(rawIdentifier)
|
||||
pointerStart = self.raw.find(rawIdentifier)+len(rawIdentifier)
|
||||
pointerEnd = pointerStart + dataLength
|
||||
data = self.raw[pointerStart:pointerEnd]
|
||||
if not len(data) == dataLength:
|
||||
raise ParseError('INVALID_DATA_LENGTH Expected: %s Recieved %s' % (dataLength, len(data)))
|
||||
raise ParseError('INVALID_DATA_LENGTH Expected: %s Recieved %s'%(dataLength,len(data)))
|
||||
return data
|
||||
|
||||
def _validate_password(self, password):
|
||||
"""Validate GNTP Message against stored password"""
|
||||
def _validate_password(self,password):
|
||||
'''
|
||||
Validate GNTP Message against stored password
|
||||
'''
|
||||
self.password = password
|
||||
if password == None:
|
||||
raise AuthError('Missing password')
|
||||
keyHash = self.info.get('keyHash', None)
|
||||
if password == None: raise Exception()
|
||||
keyHash = self.info.get('keyHash',None)
|
||||
if keyHash is None and self.password is None:
|
||||
return True
|
||||
if keyHash is None:
|
||||
raise AuthError('Invalid keyHash')
|
||||
if self.password is None:
|
||||
raise AuthError('Missing password')
|
||||
|
||||
|
||||
password = self.password.encode('utf8')
|
||||
saltHash = self._decode_hex(self.info['salt'])
|
||||
|
||||
keyBasis = password + saltHash
|
||||
|
||||
keyBasis = password+saltHash
|
||||
key = hashlib.md5(keyBasis).digest()
|
||||
keyHash = hashlib.md5(key).hexdigest()
|
||||
|
||||
|
||||
if not keyHash.upper() == self.info['keyHash'].upper():
|
||||
raise AuthError('Invalid Hash')
|
||||
return True
|
||||
|
||||
def validate(self):
|
||||
"""Verify required headers"""
|
||||
'''
|
||||
Verify required headers
|
||||
'''
|
||||
for header in self._requiredHeaders:
|
||||
if not self.headers.get(header, False):
|
||||
raise ParseError('Missing Notification Header: ' + header)
|
||||
|
||||
if not self.headers.get(header,False):
|
||||
raise ParseError('Missing Notification Header: '+header)
|
||||
|
||||
def _format_info(self):
|
||||
"""Generate info line for GNTP Message
|
||||
|
||||
:return string:
|
||||
"""
|
||||
info = u'GNTP/%s %s' % (
|
||||
'''
|
||||
Generate info line for GNTP Message
|
||||
@return: Info line string
|
||||
'''
|
||||
info = u'GNTP/%s %s'%(
|
||||
self.info.get('version'),
|
||||
self.info.get('messagetype'),
|
||||
)
|
||||
if self.info.get('encryptionAlgorithmID', None):
|
||||
info += ' %s:%s' % (
|
||||
if self.info.get('encryptionAlgorithmID',None):
|
||||
info += ' %s:%s'%(
|
||||
self.info.get('encryptionAlgorithmID'),
|
||||
self.info.get('ivValue'),
|
||||
)
|
||||
else:
|
||||
info += ' NONE'
|
||||
|
||||
if self.info.get('keyHashAlgorithmID', None):
|
||||
info += ' %s:%s.%s' % (
|
||||
info+=' NONE'
|
||||
|
||||
if self.info.get('keyHashAlgorithmID',None):
|
||||
info += ' %s:%s.%s'%(
|
||||
self.info.get('keyHashAlgorithmID'),
|
||||
self.info.get('keyHash'),
|
||||
self.info.get('salt')
|
||||
)
|
||||
|
||||
return info
|
||||
|
||||
def _parse_dict(self, data):
|
||||
"""Helper function to parse blocks of GNTP headers into a dictionary
|
||||
|
||||
:param string data:
|
||||
:return dict:
|
||||
"""
|
||||
)
|
||||
|
||||
return info
|
||||
def _parse_dict(self,data):
|
||||
'''
|
||||
Helper function to parse blocks of GNTP headers into a dictionary
|
||||
@param data:
|
||||
@return: Dictionary of headers
|
||||
'''
|
||||
dict = {}
|
||||
for line in data.split('\r\n'):
|
||||
match = GNTP_HEADER.match(line)
|
||||
if not match:
|
||||
continue
|
||||
|
||||
key = unicode(match.group(1).strip(), 'utf8', 'replace')
|
||||
val = unicode(match.group(2).strip(), 'utf8', 'replace')
|
||||
match = re.match('([\w-]+):(.+)', line)
|
||||
if not match: continue
|
||||
|
||||
key = match.group(1).strip()
|
||||
val = match.group(2).strip()
|
||||
dict[key] = val
|
||||
return dict
|
||||
|
||||
def add_header(self, key, value):
|
||||
def add_header(self,key,value):
|
||||
if isinstance(value, unicode):
|
||||
self.headers[key] = value
|
||||
else:
|
||||
self.headers[key] = unicode('%s' % value, 'utf8', 'replace')
|
||||
|
||||
def add_resource(self, data):
|
||||
"""Add binary resource
|
||||
|
||||
:param string data: Binary Data
|
||||
"""
|
||||
identifier = hashlib.md5(data).hexdigest()
|
||||
self.resources[identifier] = data
|
||||
return 'x-growl-resource://%s' % identifier
|
||||
|
||||
def decode(self, data, password=None):
|
||||
"""Decode GNTP Message
|
||||
|
||||
:param string data:
|
||||
"""
|
||||
self.headers[key] = unicode('%s'%value,'utf8','replace')
|
||||
def decode(self,data,password=None):
|
||||
'''
|
||||
Decode GNTP Message
|
||||
@param data:
|
||||
'''
|
||||
self.password = password
|
||||
self.raw = data
|
||||
parts = self.raw.split('\r\n\r\n')
|
||||
self.info = self._parse_info(data)
|
||||
self.headers = self._parse_dict(parts[0])
|
||||
|
||||
def encode(self):
|
||||
"""Encode a generic GNTP Message
|
||||
|
||||
:return string: GNTP Message ready to be sent
|
||||
"""
|
||||
|
||||
buffer = _GNTPBuffer()
|
||||
|
||||
buffer.writefmt(self._format_info())
|
||||
|
||||
'''
|
||||
Encode a GNTP Message
|
||||
@return: GNTP Message ready to be sent
|
||||
'''
|
||||
self.validate()
|
||||
EOL = u'\r\n'
|
||||
|
||||
message = self._format_info() + EOL
|
||||
#Headers
|
||||
for k, v in self.headers.iteritems():
|
||||
buffer.writefmt('%s: %s', k, v)
|
||||
buffer.writefmt()
|
||||
|
||||
#Resources
|
||||
for resource, data in self.resources.iteritems():
|
||||
buffer.writefmt('Identifier: %s', resource)
|
||||
buffer.writefmt('Length: %d', len(data))
|
||||
buffer.writefmt()
|
||||
buffer.write(data)
|
||||
buffer.writefmt()
|
||||
buffer.writefmt()
|
||||
|
||||
return buffer.getvalue()
|
||||
|
||||
|
||||
for k,v in self.headers.iteritems():
|
||||
message += u'%s: %s%s'%(k,v,EOL)
|
||||
|
||||
message += EOL
|
||||
return message
|
||||
class GNTPRegister(_GNTPBase):
|
||||
"""Represents a GNTP Registration Command
|
||||
|
||||
:param string data: (Optional) See decode()
|
||||
:param string password: (Optional) Password to use while encoding/decoding messages
|
||||
"""
|
||||
"""Represents a GNTP Registration Command"""
|
||||
notifications = []
|
||||
_requiredHeaders = [
|
||||
'Application-Name',
|
||||
'Notifications-Count'
|
||||
]
|
||||
_requiredNotificationHeaders = ['Notification-Name']
|
||||
|
||||
def __init__(self, data=None, password=None):
|
||||
_GNTPBase.__init__(self, 'REGISTER')
|
||||
self.notifications = []
|
||||
|
||||
def __init__(self,data=None,password=None):
|
||||
'''
|
||||
@param data: (Optional) See decode()
|
||||
@param password: (Optional) Password to use while encoding/decoding messages
|
||||
'''
|
||||
self.info['messagetype'] = 'REGISTER'
|
||||
|
||||
if data:
|
||||
self.decode(data, password)
|
||||
self.decode(data,password)
|
||||
else:
|
||||
self.set_password(password)
|
||||
self.add_header('Application-Name', 'pygntp')
|
||||
self.add_header('Notifications-Count', 0)
|
||||
|
||||
self.add_origin_info()
|
||||
def validate(self):
|
||||
'''Validate required headers and validate notification headers'''
|
||||
'''
|
||||
Validate required headers and validate notification headers
|
||||
'''
|
||||
for header in self._requiredHeaders:
|
||||
if not self.headers.get(header, False):
|
||||
raise ParseError('Missing Registration Header: ' + header)
|
||||
if not self.headers.get(header,False):
|
||||
raise ParseError('Missing Registration Header: '+header)
|
||||
for notice in self.notifications:
|
||||
for header in self._requiredNotificationHeaders:
|
||||
if not notice.get(header, False):
|
||||
raise ParseError('Missing Notification Header: ' + header)
|
||||
|
||||
def decode(self, data, password):
|
||||
"""Decode existing GNTP Registration message
|
||||
|
||||
:param string data: Message to decode
|
||||
"""
|
||||
if not notice.get(header,False):
|
||||
raise ParseError('Missing Notification Header: '+header)
|
||||
def decode(self,data,password):
|
||||
'''
|
||||
Decode existing GNTP Registration message
|
||||
@param data: Message to decode.
|
||||
'''
|
||||
self.raw = data
|
||||
parts = self.raw.split('\r\n\r\n')
|
||||
self.info = self._parse_info(data)
|
||||
self._validate_password(password)
|
||||
self.headers = self._parse_dict(parts[0])
|
||||
|
||||
for i, part in enumerate(parts):
|
||||
if i == 0:
|
||||
continue # Skip Header
|
||||
if part.strip() == '':
|
||||
continue
|
||||
|
||||
for i,part in enumerate(parts):
|
||||
if i==0: continue #Skip Header
|
||||
if part.strip()=='': continue
|
||||
notice = self._parse_dict(part)
|
||||
if notice.get('Notification-Name', False):
|
||||
if notice.get('Notification-Name',False):
|
||||
self.notifications.append(notice)
|
||||
elif notice.get('Identifier', False):
|
||||
notice['Data'] = self._decode_binary(part, notice)
|
||||
elif notice.get('Identifier',False):
|
||||
notice['Data'] = self._decode_binary(part,notice)
|
||||
#open('register.png','wblol').write(notice['Data'])
|
||||
self.resources[notice.get('Identifier')] = notice
|
||||
|
||||
def add_notification(self, name, enabled=True):
|
||||
"""Add new Notification to Registration message
|
||||
|
||||
:param string name: Notification Name
|
||||
:param boolean enabled: Enable this notification by default
|
||||
"""
|
||||
self.resources[ notice.get('Identifier') ] = notice
|
||||
|
||||
def add_notification(self,name,enabled=True):
|
||||
'''
|
||||
Add new Notification to Registration message
|
||||
@param name: Notification Name
|
||||
@param enabled: Default Notification to Enabled
|
||||
'''
|
||||
notice = {}
|
||||
notice['Notification-Name'] = u'%s' % name
|
||||
notice['Notification-Enabled'] = u'%s' % enabled
|
||||
|
||||
notice['Notification-Name'] = u'%s'%name
|
||||
notice['Notification-Enabled'] = u'%s'%enabled
|
||||
|
||||
self.notifications.append(notice)
|
||||
self.add_header('Notifications-Count', len(self.notifications))
|
||||
|
||||
def encode(self):
|
||||
"""Encode a GNTP Registration Message
|
||||
|
||||
:return string: Encoded GNTP Registration message
|
||||
"""
|
||||
|
||||
buffer = _GNTPBuffer()
|
||||
|
||||
buffer.writefmt(self._format_info())
|
||||
|
||||
'''
|
||||
Encode a GNTP Registration Message
|
||||
@return: GNTP Registration Message ready to be sent
|
||||
'''
|
||||
self.validate()
|
||||
EOL = u'\r\n'
|
||||
|
||||
message = self._format_info() + EOL
|
||||
#Headers
|
||||
for k, v in self.headers.iteritems():
|
||||
buffer.writefmt('%s: %s', k, v)
|
||||
buffer.writefmt()
|
||||
|
||||
for k,v in self.headers.iteritems():
|
||||
message += u'%s: %s%s'%(k,v,EOL)
|
||||
|
||||
#Notifications
|
||||
if len(self.notifications) > 0:
|
||||
if len(self.notifications)>0:
|
||||
for notice in self.notifications:
|
||||
for k, v in notice.iteritems():
|
||||
buffer.writefmt('%s: %s', k, v)
|
||||
buffer.writefmt()
|
||||
|
||||
#Resources
|
||||
for resource, data in self.resources.iteritems():
|
||||
buffer.writefmt('Identifier: %s', resource)
|
||||
buffer.writefmt('Length: %d', len(data))
|
||||
buffer.writefmt()
|
||||
buffer.write(data)
|
||||
buffer.writefmt()
|
||||
buffer.writefmt()
|
||||
|
||||
return buffer.getvalue()
|
||||
|
||||
message += EOL
|
||||
for k,v in notice.iteritems():
|
||||
message += u'%s: %s%s'%(k,v,EOL)
|
||||
|
||||
message += EOL
|
||||
return message
|
||||
|
||||
class GNTPNotice(_GNTPBase):
|
||||
"""Represents a GNTP Notification Command
|
||||
|
||||
:param string data: (Optional) See decode()
|
||||
:param string app: (Optional) Set Application-Name
|
||||
:param string name: (Optional) Set Notification-Name
|
||||
:param string title: (Optional) Set Notification Title
|
||||
:param string password: (Optional) Password to use while encoding/decoding messages
|
||||
"""
|
||||
"""Represents a GNTP Notification Command"""
|
||||
_requiredHeaders = [
|
||||
'Application-Name',
|
||||
'Notification-Name',
|
||||
'Notification-Title'
|
||||
]
|
||||
|
||||
def __init__(self, data=None, app=None, name=None, title=None, password=None):
|
||||
_GNTPBase.__init__(self, 'NOTIFY')
|
||||
|
||||
def __init__(self,data=None,app=None,name=None,title=None,password=None):
|
||||
'''
|
||||
|
||||
@param data: (Optional) See decode()
|
||||
@param app: (Optional) Set Application-Name
|
||||
@param name: (Optional) Set Notification-Name
|
||||
@param title: (Optional) Set Notification Title
|
||||
@param password: (Optional) Password to use while encoding/decoding messages
|
||||
'''
|
||||
self.info['messagetype'] = 'NOTIFY'
|
||||
|
||||
if data:
|
||||
self.decode(data, password)
|
||||
self.decode(data,password)
|
||||
else:
|
||||
self.set_password(password)
|
||||
if app:
|
||||
@@ -405,103 +335,105 @@ class GNTPNotice(_GNTPBase):
|
||||
self.add_header('Notification-Name', name)
|
||||
if title:
|
||||
self.add_header('Notification-Title', title)
|
||||
|
||||
def decode(self, data, password):
|
||||
"""Decode existing GNTP Notification message
|
||||
|
||||
:param string data: Message to decode.
|
||||
"""
|
||||
self.add_origin_info()
|
||||
def decode(self,data,password):
|
||||
'''
|
||||
Decode existing GNTP Notification message
|
||||
@param data: Message to decode.
|
||||
'''
|
||||
self.raw = data
|
||||
parts = self.raw.split('\r\n\r\n')
|
||||
self.info = self._parse_info(data)
|
||||
self._validate_password(password)
|
||||
self.headers = self._parse_dict(parts[0])
|
||||
|
||||
for i, part in enumerate(parts):
|
||||
if i == 0:
|
||||
continue # Skip Header
|
||||
if part.strip() == '':
|
||||
continue
|
||||
|
||||
for i,part in enumerate(parts):
|
||||
if i==0: continue #Skip Header
|
||||
if part.strip()=='': continue
|
||||
notice = self._parse_dict(part)
|
||||
if notice.get('Identifier', False):
|
||||
notice['Data'] = self._decode_binary(part, notice)
|
||||
if notice.get('Identifier',False):
|
||||
notice['Data'] = self._decode_binary(part,notice)
|
||||
#open('notice.png','wblol').write(notice['Data'])
|
||||
self.resources[notice.get('Identifier')] = notice
|
||||
|
||||
self.resources[ notice.get('Identifier') ] = notice
|
||||
def encode(self):
|
||||
'''
|
||||
Encode a GNTP Notification Message
|
||||
@return: GNTP Notification Message ready to be sent
|
||||
'''
|
||||
self.validate()
|
||||
EOL = u'\r\n'
|
||||
|
||||
message = self._format_info() + EOL
|
||||
#Headers
|
||||
for k,v in self.headers.iteritems():
|
||||
message += u'%s: %s%s'%(k,v,EOL)
|
||||
|
||||
message += EOL
|
||||
return message
|
||||
|
||||
class GNTPSubscribe(_GNTPBase):
|
||||
"""Represents a GNTP Subscribe Command
|
||||
|
||||
:param string data: (Optional) See decode()
|
||||
:param string password: (Optional) Password to use while encoding/decoding messages
|
||||
"""
|
||||
_requiredHeaders = [
|
||||
'Subscriber-ID',
|
||||
'Subscriber-Name',
|
||||
]
|
||||
|
||||
def __init__(self, data=None, password=None):
|
||||
_GNTPBase.__init__(self, 'SUBSCRIBE')
|
||||
"""Represents a GNTP Subscribe Command"""
|
||||
def __init__(self,data=None,password=None):
|
||||
self.info['messagetype'] = 'SUBSCRIBE'
|
||||
self._requiredHeaders = [
|
||||
'Subscriber-ID',
|
||||
'Subscriber-Name',
|
||||
]
|
||||
if data:
|
||||
self.decode(data, password)
|
||||
self.decode(data,password)
|
||||
else:
|
||||
self.set_password(password)
|
||||
|
||||
self.add_origin_info()
|
||||
|
||||
class GNTPOK(_GNTPBase):
|
||||
"""Represents a GNTP OK Response
|
||||
|
||||
:param string data: (Optional) See _GNTPResponse.decode()
|
||||
:param string action: (Optional) Set type of action the OK Response is for
|
||||
"""
|
||||
"""Represents a GNTP OK Response"""
|
||||
_requiredHeaders = ['Response-Action']
|
||||
|
||||
def __init__(self, data=None, action=None):
|
||||
_GNTPBase.__init__(self, '-OK')
|
||||
def __init__(self,data=None,action=None):
|
||||
'''
|
||||
@param data: (Optional) See _GNTPResponse.decode()
|
||||
@param action: (Optional) Set type of action the OK Response is for
|
||||
'''
|
||||
self.info['messagetype'] = '-OK'
|
||||
if data:
|
||||
self.decode(data)
|
||||
if action:
|
||||
self.add_header('Response-Action', action)
|
||||
|
||||
self.add_origin_info()
|
||||
|
||||
class GNTPError(_GNTPBase):
|
||||
"""Represents a GNTP Error response
|
||||
|
||||
:param string data: (Optional) See _GNTPResponse.decode()
|
||||
:param string errorcode: (Optional) Error code
|
||||
:param string errordesc: (Optional) Error Description
|
||||
"""
|
||||
_requiredHeaders = ['Error-Code', 'Error-Description']
|
||||
|
||||
def __init__(self, data=None, errorcode=None, errordesc=None):
|
||||
_GNTPBase.__init__(self, '-ERROR')
|
||||
_requiredHeaders = ['Error-Code','Error-Description']
|
||||
def __init__(self,data=None,errorcode=None,errordesc=None):
|
||||
'''
|
||||
@param data: (Optional) See _GNTPResponse.decode()
|
||||
@param errorcode: (Optional) Error code
|
||||
@param errordesc: (Optional) Error Description
|
||||
'''
|
||||
self.info['messagetype'] = '-ERROR'
|
||||
if data:
|
||||
self.decode(data)
|
||||
if errorcode:
|
||||
self.add_header('Error-Code', errorcode)
|
||||
self.add_header('Error-Description', errordesc)
|
||||
|
||||
self.add_origin_info()
|
||||
def error(self):
|
||||
return (self.headers.get('Error-Code', None),
|
||||
self.headers.get('Error-Description', None))
|
||||
return self.headers['Error-Code'],self.headers['Error-Description']
|
||||
|
||||
|
||||
def parse_gntp(data, password=None):
|
||||
"""Attempt to parse a message as a GNTP message
|
||||
|
||||
:param string data: Message to be parsed
|
||||
:param string password: Optional password to be used to verify the message
|
||||
"""
|
||||
match = GNTP_INFO_LINE_SHORT.match(data)
|
||||
def parse_gntp(data,password=None):
|
||||
'''
|
||||
Attempt to parse a message as a GNTP message
|
||||
@param data: Message to be parsed
|
||||
@param password: Optional password to be used to verify the message
|
||||
'''
|
||||
match = re.match('GNTP/(?P<version>\d+\.\d+) (?P<messagetype>REGISTER|NOTIFY|SUBSCRIBE|\-OK|\-ERROR)',data,re.IGNORECASE)
|
||||
if not match:
|
||||
raise ParseError('INVALID_GNTP_INFO')
|
||||
info = match.groupdict()
|
||||
if info['messagetype'] == 'REGISTER':
|
||||
return GNTPRegister(data, password=password)
|
||||
return GNTPRegister(data,password=password)
|
||||
elif info['messagetype'] == 'NOTIFY':
|
||||
return GNTPNotice(data, password=password)
|
||||
return GNTPNotice(data,password=password)
|
||||
elif info['messagetype'] == 'SUBSCRIBE':
|
||||
return GNTPSubscribe(data, password=password)
|
||||
return GNTPSubscribe(data,password=password)
|
||||
elif info['messagetype'] == '-OK':
|
||||
return GNTPOK(data)
|
||||
elif info['messagetype'] == '-ERROR':
|
||||
|
||||
217
gntp/notifier.py
@@ -12,55 +12,10 @@ using GNTP
|
||||
import gntp
|
||||
import socket
|
||||
import logging
|
||||
import platform
|
||||
|
||||
__all__ = [
|
||||
'mini',
|
||||
'GrowlNotifier',
|
||||
]
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def mini(description, applicationName='PythonMini', noteType="Message",
|
||||
title="Mini Message", applicationIcon=None, hostname='localhost',
|
||||
password=None, port=23053, sticky=False, priority=None,
|
||||
callback=None, notificationIcon=None, identifier=None):
|
||||
"""Single notification function
|
||||
|
||||
Simple notification function in one line. Has only one required parameter
|
||||
and attempts to use reasonable defaults for everything else
|
||||
:param string description: Notification message
|
||||
|
||||
.. warning::
|
||||
For now, only URL callbacks are supported. In the future, the
|
||||
callback argument will also support a function
|
||||
"""
|
||||
growl = GrowlNotifier(
|
||||
applicationName=applicationName,
|
||||
notifications=[noteType],
|
||||
defaultNotifications=[noteType],
|
||||
applicationIcon=applicationIcon,
|
||||
hostname=hostname,
|
||||
password=password,
|
||||
port=port,
|
||||
)
|
||||
result = growl.register()
|
||||
if result is not True:
|
||||
return result
|
||||
|
||||
return growl.notify(
|
||||
noteType=noteType,
|
||||
title=title,
|
||||
description=description,
|
||||
icon=notificationIcon,
|
||||
sticky=sticky,
|
||||
priority=priority,
|
||||
callback=callback,
|
||||
identifier=identifier,
|
||||
)
|
||||
|
||||
|
||||
class GrowlNotifier(object):
|
||||
"""Helper class to simplfy sending Growl messages
|
||||
|
||||
@@ -72,35 +27,55 @@ class GrowlNotifier(object):
|
||||
:param string hostname: Remote host
|
||||
:param integer port: Remote port
|
||||
"""
|
||||
|
||||
applicationName = 'Python GNTP'
|
||||
notifications = []
|
||||
defaultNotifications = []
|
||||
applicationIcon = None
|
||||
passwordHash = 'MD5'
|
||||
socketTimeout = 3
|
||||
|
||||
def __init__(self, applicationName='Python GNTP', notifications=[],
|
||||
defaultNotifications=None, applicationIcon=None, hostname='localhost',
|
||||
password=None, port=23053):
|
||||
#GNTP Specific
|
||||
password = None
|
||||
hostname = 'localhost'
|
||||
port = 23053
|
||||
|
||||
self.applicationName = applicationName
|
||||
self.notifications = list(notifications)
|
||||
if defaultNotifications:
|
||||
def __init__(self, applicationName=None, notifications=None, defaultNotifications=None, applicationIcon=None, hostname=None, password=None, port=None):
|
||||
if applicationName:
|
||||
self.applicationName = applicationName
|
||||
assert self.applicationName, 'An application name is required.'
|
||||
|
||||
if notifications:
|
||||
self.notifications = list(notifications)
|
||||
assert self.notifications, 'A sequence of one or more notification names is required.'
|
||||
|
||||
if defaultNotifications is not None:
|
||||
self.defaultNotifications = list(defaultNotifications)
|
||||
else:
|
||||
self.defaultNotifications = self.notifications
|
||||
self.applicationIcon = applicationIcon
|
||||
elif not self.defaultNotifications:
|
||||
self.defaultNotifications = list(self.notifications)
|
||||
|
||||
self.password = password
|
||||
self.hostname = hostname
|
||||
self.port = int(port)
|
||||
if applicationIcon is not None:
|
||||
self.applicationIcon = self._checkIcon(applicationIcon)
|
||||
elif self.applicationIcon is not None:
|
||||
self.applicationIcon = self._checkIcon(self.applicationIcon)
|
||||
|
||||
#GNTP Specific
|
||||
if password:
|
||||
self.password = password
|
||||
|
||||
if hostname:
|
||||
self.hostname = hostname
|
||||
assert self.hostname, 'Requires valid hostname'
|
||||
|
||||
if port:
|
||||
self.port = int(port)
|
||||
assert isinstance(self.port, int), 'Requires valid port'
|
||||
|
||||
def _checkIcon(self, data):
|
||||
'''
|
||||
Check the icon to see if it's valid
|
||||
|
||||
If it's a simple URL icon, then we return True. If it's a data icon
|
||||
then we return False
|
||||
@param data:
|
||||
@todo Consider checking for a valid URL
|
||||
'''
|
||||
logger.debug('Checking icon')
|
||||
return data.startswith('http')
|
||||
return data
|
||||
|
||||
def register(self):
|
||||
"""Send GNTP Registration
|
||||
@@ -109,26 +84,23 @@ class GrowlNotifier(object):
|
||||
Before sending notifications to Growl, you need to have
|
||||
sent a registration message at least once
|
||||
"""
|
||||
logger.debug('Sending registration to %s:%s', self.hostname, self.port)
|
||||
logger.info('Sending registration to %s:%s', self.hostname, self.port)
|
||||
register = gntp.GNTPRegister()
|
||||
register.add_header('Application-Name', self.applicationName)
|
||||
for notification in self.notifications:
|
||||
enabled = notification in self.defaultNotifications
|
||||
register.add_notification(notification, enabled)
|
||||
if self.applicationIcon:
|
||||
if self._checkIcon(self.applicationIcon):
|
||||
register.add_header('Application-Icon', self.applicationIcon)
|
||||
else:
|
||||
id = register.add_resource(self.applicationIcon)
|
||||
register.add_header('Application-Icon', id)
|
||||
register.add_header('Application-Icon', self.applicationIcon)
|
||||
if self.password:
|
||||
register.set_password(self.password, self.passwordHash)
|
||||
self.add_origin_info(register)
|
||||
self.register_hook(register)
|
||||
return self._send('register', register)
|
||||
response = self._send('register', register.encode())
|
||||
if isinstance(response, gntp.GNTPOK):
|
||||
return True
|
||||
logger.error('Invalid response %s', response.error())
|
||||
return response.error()
|
||||
|
||||
def notify(self, noteType, title, description, icon=None, sticky=False,
|
||||
priority=None, callback=None, identifier=None):
|
||||
def notify(self, noteType, title, description, icon=None, sticky=False, priority=None):
|
||||
"""Send a GNTP notifications
|
||||
|
||||
.. warning::
|
||||
@@ -140,13 +112,8 @@ class GrowlNotifier(object):
|
||||
:param string icon: Icon URL path
|
||||
:param boolean sticky: Sticky notification
|
||||
:param integer priority: Message priority level from -2 to 2
|
||||
:param string callback: URL callback
|
||||
|
||||
.. warning::
|
||||
For now, only URL callbacks are supported. In the future, the
|
||||
callback argument will also support a function
|
||||
"""
|
||||
logger.debug('Sending notification [%s] to %s:%s', noteType, self.hostname, self.port)
|
||||
logger.info('Sending notification [%s] to %s:%s', noteType, self.hostname, self.port)
|
||||
assert noteType in self.notifications
|
||||
notice = gntp.GNTPNotice()
|
||||
notice.add_header('Application-Name', self.applicationName)
|
||||
@@ -159,23 +126,14 @@ class GrowlNotifier(object):
|
||||
if priority:
|
||||
notice.add_header('Notification-Priority', priority)
|
||||
if icon:
|
||||
if self._checkIcon(icon):
|
||||
notice.add_header('Notification-Icon', icon)
|
||||
else:
|
||||
id = notice.add_resource(icon)
|
||||
notice.add_header('Notification-Icon', id)
|
||||
|
||||
notice.add_header('Notification-Icon', self._checkIcon(icon))
|
||||
if description:
|
||||
notice.add_header('Notification-Text', description)
|
||||
if callback:
|
||||
notice.add_header('Notification-Callback-Target', callback)
|
||||
if identifier:
|
||||
notice.add_header('Notification-Coalescing-ID', identifier)
|
||||
|
||||
self.add_origin_info(notice)
|
||||
self.notify_hook(notice)
|
||||
|
||||
return self._send('notify', notice)
|
||||
response = self._send('notify', notice.encode())
|
||||
if isinstance(response, gntp.GNTPOK):
|
||||
return True
|
||||
logger.error('Invalid response %s', response.error())
|
||||
return response.error()
|
||||
|
||||
def subscribe(self, id, name, port):
|
||||
"""Send a Subscribe request to a remote machine"""
|
||||
@@ -185,63 +143,30 @@ class GrowlNotifier(object):
|
||||
sub.add_header('Subscriber-Port', port)
|
||||
if self.password:
|
||||
sub.set_password(self.password, self.passwordHash)
|
||||
response = self._send('subscribe', sub.encode())
|
||||
if isinstance(response, gntp.GNTPOK):
|
||||
return True
|
||||
logger.error('Invalid response %s', response.error())
|
||||
return response.error()
|
||||
|
||||
self.add_origin_info(sub)
|
||||
self.subscribe_hook(sub)
|
||||
|
||||
return self._send('subscribe', sub)
|
||||
|
||||
def add_origin_info(self, packet):
|
||||
"""Add optional Origin headers to message"""
|
||||
packet.add_header('Origin-Machine-Name', platform.node())
|
||||
packet.add_header('Origin-Software-Name', 'gntp.py')
|
||||
packet.add_header('Origin-Software-Version', gntp.__version__)
|
||||
packet.add_header('Origin-Platform-Name', platform.system())
|
||||
packet.add_header('Origin-Platform-Version', platform.platform())
|
||||
|
||||
def register_hook(self, packet):
|
||||
pass
|
||||
|
||||
def notify_hook(self, packet):
|
||||
pass
|
||||
|
||||
def subscribe_hook(self, packet):
|
||||
pass
|
||||
|
||||
def _send(self, messagetype, packet):
|
||||
def _send(self, type, data):
|
||||
"""Send the GNTP Packet"""
|
||||
|
||||
packet.validate()
|
||||
data = packet.encode()
|
||||
|
||||
#logger.debug('To : %s:%s <%s>\n%s', self.hostname, self.port, packet.__class__, data)
|
||||
#Less verbose
|
||||
logger.debug('To : %s:%s <%s>', self.hostname, self.port, packet.__class__)
|
||||
#logger.debug('To : %s:%s <%s>\n%s', self.hostname, self.port, type, data)
|
||||
#Less verbose please
|
||||
logger.debug('To : %s:%s <%s>', self.hostname, self.port, type)
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
s.settimeout(self.socketTimeout)
|
||||
s.connect((self.hostname, self.port))
|
||||
s.send(data)
|
||||
recv_data = s.recv(1024)
|
||||
while not recv_data.endswith("\r\n\r\n"):
|
||||
recv_data += s.recv(1024)
|
||||
response = gntp.parse_gntp(recv_data)
|
||||
s.send(data.encode('utf8', 'replace'))
|
||||
try:
|
||||
s.settimeout(10)
|
||||
except:
|
||||
pass
|
||||
response = gntp.parse_gntp(s.recv(1024))
|
||||
s.close()
|
||||
|
||||
#logger.debug('From : %s:%s <%s>\n%s', self.hostname, self.port, response.__class__, response)
|
||||
#Less verbose
|
||||
#Less verbose please
|
||||
logger.debug('From : %s:%s <%s>', self.hostname, self.port, response.__class__)
|
||||
|
||||
if type(response) == gntp.GNTPOK:
|
||||
return True
|
||||
if response.error()[0] == '404' and 'disabled' in response.error()[1]:
|
||||
# Ignore message saying that user has disabled this class
|
||||
return True
|
||||
logger.error('Invalid response: %s', response.error())
|
||||
return response.error()
|
||||
|
||||
if __name__ == '__main__':
|
||||
# If we're running this module directly we're likely running it as a test
|
||||
# so extra debugging is useful
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
mini('Testing mini notification')
|
||||
return response
|
||||
|
||||
BIN
icons/nzb.ico
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 2008-2012 The SABnzbd-Team <team@sabnzbd.org>
|
||||
# Copyright 2008-2011 The SABnzbd-Team <team@sabnzbd.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath=".."#-->
|
||||
<!--#set global $helpsubject="Configure-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu=""#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="configure-categories-0-7"#-->
|
||||
<!--#set global $helpsubject="configure-categories"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="categories"#-->
|
||||
@@ -72,7 +72,6 @@ $T('explain-relFolder') $defdir<br/>
|
||||
<option value="1" <!--#if $slot.priority == 1 then 'selected' else ''#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $slot.priority == 0 then 'selected' else ''#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $slot.priority == -1 then 'selected' else ''#-->>$T('pr-low')</option>
|
||||
<option value="-2" <!--#if $slot.priority == -2 then 'selected' else ''#-->>$T('pr-paused')</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
</td>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Folders-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure+Directories+V2"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="directories"#-->
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Notifications-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure+Email"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl" #-->
|
||||
|
||||
<!--#set global $submenu="email"#-->
|
||||
@@ -52,39 +52,11 @@ $T('explain-email_account')<br>
|
||||
<strong>$T('opt-email_pwd'):</strong><br>
|
||||
$T('explain-email_pwd')<br>
|
||||
<input type="password" size="35" name="email_pwd" value="$email_pwd">
|
||||
</fieldset>
|
||||
|
||||
<!--#if $have_growl or $have_ntfosd#-->
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('growlSettings')</legend>
|
||||
<!--#if $have_ntfosd#-->
|
||||
<label><input type="checkbox" name="ntfosd_enable" value="1" <!--#if $ntfosd_enable != "0" then "checked=1" else ""#--> /> <strong>$T('opt-ntfosd_enable'):</strong></label><br>
|
||||
$T('explain-ntfosd_enable')
|
||||
<br/>
|
||||
<br/>
|
||||
<!--#end if#-->
|
||||
<!--#if $have_growl#-->
|
||||
<label><input type="checkbox" name="growl_enable" value="1" <!--#if $growl_enable != "0" then "checked=1" else ""#--> /> <strong>$T('opt-growl_enable'):</strong></label><br>
|
||||
$T('explain-growl_enable')
|
||||
<br/>
|
||||
<br/>
|
||||
<strong>$T('opt-growl_server'):</strong><br>
|
||||
$T('explain-growl_server')<br>
|
||||
<input type="text" size="35" name="growl_server" value="$growl_server">
|
||||
<br>
|
||||
<br>
|
||||
<strong>$T('opt-growl_password'):</strong><br>
|
||||
$T('explain-growl_password')<br>
|
||||
<input type="password" size="35" name="growl_password" value="$growl_password">
|
||||
</fieldset>
|
||||
<!--#end if#-->
|
||||
<!--#end if#-->
|
||||
|
||||
</div>
|
||||
<input type="hidden" name="session" value="$session">
|
||||
</fieldset>
|
||||
</div>
|
||||
<p><input type="submit" value="$T('button-saveChanges')">
|
||||
<input type="button" onclick="if (confirm('$T('askTestEmail').replace("'","`") ')) { this.form.action='testmail?session=$session&'; this.form.submit(); return false;}" value="$T('link-testEmail')"/>
|
||||
<input type="button" onclick="this.form.action='testnotification?session=$session&'; this.form.submit(); return false;"value="$T('testNotify')"/>
|
||||
</p>
|
||||
</form>
|
||||
<!--#if $lastmail#-->
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+General-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure+General+V2"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="general"#-->
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Indexers-0-7"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="newzbin"#-->
|
||||
<!--#include $webdir + "/inc_cmenu.tmpl"#-->
|
||||
|
||||
<h2>NzbMatrix</h2>
|
||||
$T('explain-nzbmatrix')<br/><br/>
|
||||
|
||||
<form action="saveMatrix" method="post" autocomplete="off">
|
||||
<div class="EntryBlock">
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('accountInfo')</legend>
|
||||
<strong>$T('opt-username_matrix'):</strong><br>
|
||||
$T('explain-username_matrix')<br>
|
||||
<input type="text" name="matrix_username" value="$matrix_username">
|
||||
<br>
|
||||
<br>
|
||||
<strong>$T('opt-apikey_matrix'):</strong><br>
|
||||
$T('explain-apikey_matrix')<br>
|
||||
<input type="text" name="matrix_apikey" value="$matrix_apikey">
|
||||
<br/><br/>
|
||||
<input type="checkbox" name="matrix_del_bookmark" value="1" <!--#if $matrix_del_bookmark > 0 then "checked=1" else ""#--> /> <strong>$T('opt-newzbin_unbookmark'):</strong><br>
|
||||
$T('explain-newzbin_unbookmark')<br>
|
||||
|
||||
</fieldset>
|
||||
</div>
|
||||
<input type="hidden" name="session" value="$session">
|
||||
<p><input type="submit" value="$T('button-saveChanges')"></p>
|
||||
</form>
|
||||
|
||||
<!--#include $webdir + "/inc_bottom.tmpl"#-->
|
||||
87
interfaces/Classic/templates/config_newzbin.tmpl
Normal file
@@ -0,0 +1,87 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Index+Sites"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="newzbin"#-->
|
||||
<!--#include $webdir + "/inc_cmenu.tmpl"#-->
|
||||
|
||||
<h2>Newzbin</h2>
|
||||
$T('explain-newzbin')<br/><br/>
|
||||
<form action="saveNewzbin" method="post" autocomplete="off">
|
||||
<div class="EntryBlock">
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('accountInfo')</legend>
|
||||
<strong>$T('opt-username_newzbin'):</strong><br>
|
||||
$T('explain-username_newzbin')<br>
|
||||
<input type="text" name="username_newzbin" value="$username_newzbin">
|
||||
<br>
|
||||
<br>
|
||||
<strong>$T('opt-password_newzbin'):</strong><br>
|
||||
$T('explain-password_newzbin')<br>
|
||||
<input type="password" name="password_newzbin" value="$password_newzbin">
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div class="EntryBlock">
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('newzbinBookmarks')</legend>
|
||||
<label><input type="checkbox" name="newzbin_bookmarks" value="1" <!--#if $newzbin_bookmarks > 0 then "checked=1" else ""#--> <strong>$T('opt-newzbin_bookmarks'):</strong></label><br>
|
||||
$T('explain-newzbin_bookmarks')<br>
|
||||
<a href="getBookmarks?session=$session">$T('link-getBookmarks')</a>
|
||||
<br>
|
||||
<!--#if $bookmarks_list#-->
|
||||
<a href="hideBookmarks?session=$session">$T('link-HideBM')</a>
|
||||
<!--#else#-->
|
||||
<a href="showBookmarks?session=$session">$T('link-ShowBM')</a>
|
||||
<!--#end if#-->
|
||||
<br/>
|
||||
<br/>
|
||||
<label><input type="checkbox" name="newzbin_unbookmark" value="1" <!--#if $newzbin_unbookmark > 0 then "checked=1" else ""#--> /> <strong>$T('opt-newzbin_unbookmark'):</strong></label><br>
|
||||
$T('explain-newzbin_unbookmark')<br>
|
||||
<br/>
|
||||
<strong>$T('opt-bookmark_rate'):</strong><br>
|
||||
$T('explain-bookmark_rate')<br>
|
||||
<input type="text" name="bookmark_rate" value="$bookmark_rate">
|
||||
</fieldset>
|
||||
</div>
|
||||
<!--#if $bookmarks_list#-->
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('processedBM')</legend>
|
||||
<!--#for $msgid in $bookmarks_list#-->
|
||||
<a href="https://www.newzbin.com/browse/post/$msgid/" target="_blank">$msgid</a>
|
||||
<!--#end for#-->
|
||||
</fieldset>
|
||||
<!--#end if#-->
|
||||
<input type="hidden" name="session" value="$session">
|
||||
<p><input type="submit" value="$T('button-saveChanges')"></p>
|
||||
</form>
|
||||
|
||||
<hr/>
|
||||
|
||||
<h2>NzbMatrix</h2>
|
||||
$T('explain-nzbmatrix')<br/><br/>
|
||||
|
||||
<form action="saveMatrix" method="post" autocomplete="off">
|
||||
<div class="EntryBlock">
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('accountInfo')</legend>
|
||||
<strong>$T('opt-username_matrix'):</strong><br>
|
||||
$T('explain-username_matrix')<br>
|
||||
<input type="text" name="matrix_username" value="$matrix_username">
|
||||
<br>
|
||||
<br>
|
||||
<strong>$T('opt-apikey_matrix'):</strong><br>
|
||||
$T('explain-apikey_matrix')<br>
|
||||
<input type="text" name="matrix_apikey" value="$matrix_apikey">
|
||||
<br/><br/>
|
||||
<input type="checkbox" name="matrix_del_bookmark" value="1" <!--#if $matrix_del_bookmark > 0 then "checked=1" else ""#--> /> <strong>$T('opt-newzbin_unbookmark'):</strong><br>
|
||||
$T('explain-newzbin_unbookmark')<br>
|
||||
|
||||
</fieldset>
|
||||
</div>
|
||||
<input type="hidden" name="session" value="$session">
|
||||
<p><input type="submit" value="$T('button-saveChanges')"></p>
|
||||
</form>
|
||||
|
||||
<!--#include $webdir + "/inc_bottom.tmpl"#-->
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+RSS-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure+RSS+V2"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="rss"#-->
|
||||
@@ -73,7 +73,6 @@
|
||||
<table>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
<th>$T('rss-order')</th>
|
||||
<th>$T('rss-type')</th>
|
||||
<th>$T('rss-filter')</th>
|
||||
@@ -87,7 +86,6 @@
|
||||
<form action="upd_rss_filter" method="get">
|
||||
<tr class="odd">
|
||||
<td></td>
|
||||
<td><input type="checkbox" name="enabled" value="1" checked="checked" /></td>
|
||||
<td></td>
|
||||
<td>
|
||||
<select name="filter_type">
|
||||
@@ -154,10 +152,6 @@
|
||||
</td>
|
||||
|
||||
<form action="upd_rss_filter" method="get">
|
||||
<td>
|
||||
<input type="checkbox" name="enabled" value="1" <!--#if $filter[6] == '1' then 'checked="checked"' else ""#--> />
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<input type="text" size="3" name="new_index" value=$fnum>
|
||||
</td>
|
||||
@@ -214,7 +208,6 @@
|
||||
<input type="hidden" name="feed" value="$feed"/>
|
||||
<input type="hidden" name="session" value="$session">
|
||||
<input type="submit" value="$T('button-save')"/>
|
||||
<!--#if not $rss[$feed].filter_states[$fnum]#--> $T('Incorrect filter')<!--#end if#-->
|
||||
</td>
|
||||
</form>
|
||||
</tr>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Scheduling-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure+Scheduling+V2"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="scheduling"#-->
|
||||
@@ -31,14 +31,16 @@ $T('hour'):<br>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<br>$T('sch-frequency'): <br>
|
||||
<input type="checkbox" name="daysofweek" value="1">$T('monday')<br/>
|
||||
<input type="checkbox" name="daysofweek" value="2">$T('tuesday')<br/>
|
||||
<input type="checkbox" name="daysofweek" value="3">$T('wednesday')<br/>
|
||||
<input type="checkbox" name="daysofweek" value="4">$T('thursday')<br/>
|
||||
<input type="checkbox" name="daysofweek" value="5">$T('friday')<br/>
|
||||
<input type="checkbox" name="daysofweek" value="6">$T('saturday')<br/>
|
||||
<input type="checkbox" name="daysofweek" value="7">$T('sunday')<br/>
|
||||
|
||||
<select name="dayofweek">
|
||||
<option value="*" selected>$T('daily')
|
||||
<option value="1">$T('monday')
|
||||
<option value="2">$T('tuesday')
|
||||
<option value="3">$T('wednesday')
|
||||
<option value="4">$T('thursday')
|
||||
<option value="5">$T('friday')
|
||||
<option value="6">$T('saturday')
|
||||
<option value="7">$T('sunday')
|
||||
</select>
|
||||
<br>$T('sch-action'):<br>
|
||||
<select name="action">
|
||||
<!--#for $action in $actions#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Servers-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure+Servers+V2"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="servers"#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Sorting-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure+Sorting"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="sorting"#-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--#set global $topmenu="config"#-->
|
||||
<!--#set global $statpath="../.."#-->
|
||||
<!--#set global $helpsubject="Configure+Switches-0-7"#-->
|
||||
<!--#set global $helpsubject="Configure+Switches+V3"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<!--#set global $submenu="switches"#-->
|
||||
@@ -14,9 +14,6 @@
|
||||
<label><input type="checkbox" name="quick_check" value="1" <!--#if $quick_check > 0 then "checked=1" else ""#--> /> <strong>$T('opt-quick_check')</strong></label><br/>
|
||||
$T('explain-quick_check')<br>
|
||||
<br/>
|
||||
<label><input type="checkbox" name="pre_check" value="1" <!--#if $pre_check > 0 then "checked=1" else ""#--> /> <strong>$T('opt-pre_check')</strong></label><br/>
|
||||
$T('explain-pre_check')<br>
|
||||
<br/>
|
||||
<label><input type="checkbox" name="enable_unrar" value="1" <!--#if $enable_unrar > 0 then "checked=1" else ""#--> /> <strong>$T('opt-enable_unrar')</strong></label><br>
|
||||
$T('explain-enable_unrar')<br>
|
||||
<br>
|
||||
@@ -100,13 +97,6 @@
|
||||
</fieldset>
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('otherSwitches')</legend>
|
||||
<label><strong>$T('opt-max_art_tries')</strong></label><br>
|
||||
$T('explain-max_art_tries')<br>
|
||||
<input type="text" size=5" name="max_art_tries" value="$max_art_tries" />
|
||||
<br><br>
|
||||
<label><input type="checkbox" name="max_art_opt" value="1" <!--#if $max_art_opt > 0 then "checked=1" else ""#--> /> <strong>$T('opt-max_art_opt')</strong></label><br>
|
||||
$T('explain-max_art_opt')<br>
|
||||
<br>
|
||||
<label><input type="checkbox" name="auto_disconnect" value="1" <!--#if $auto_disconnect > 0 then "checked=1" else ""#--> /> <strong>$T('opt-auto_disconnect')</strong></label><br>
|
||||
$T('explain-auto_disconnect')<br>
|
||||
<br>
|
||||
@@ -139,6 +129,11 @@
|
||||
$T('explain-ampm')<br>
|
||||
<br/>
|
||||
<!--#end if#-->
|
||||
<!--#if $darwin#-->
|
||||
<label><input type="checkbox" name="growl_enable" value="1" <!--#if $growl_enable > 0 then "checked=1" else ""#--> /> <strong>$T('opt-growl_enable')</strong></label><br>
|
||||
$T('explain-growl_enable')<br>
|
||||
<br/>
|
||||
<!--#end if#-->
|
||||
<strong>$T('opt-ignore_samples'):</strong><br>
|
||||
$T('explain-ignore_samples')<br>
|
||||
<input class="radio" type="radio" name="ignore_samples" value="0" <!--#if $ignore_samples == 0 then 'checked="1"' else ""#--> /> $T('igsam-off')
|
||||
@@ -156,32 +151,6 @@
|
||||
</select>
|
||||
<br/>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="EntryFieldSet">
|
||||
<strong>$T('opt-quota_size'):</strong><br/>
|
||||
$T('explain-quota_size')<br/>
|
||||
<input type="text" name="quota_size" value="$quota_size"/>
|
||||
<br>
|
||||
<br>
|
||||
<strong>$T('opt-quota_period'):</strong><br>
|
||||
$T('explain-quota_period')<br>
|
||||
<select name="ssl_type">
|
||||
<option value="m" <!--#if $quota_period == 'm' then 'selected' else ''#--> >$T('month')</option>
|
||||
<option value="w" <!--#if $quota_period == 'w' then 'selected' else ''#--> >$T('week')</option>
|
||||
<option value="d" <!--#if $quota_period == 'd' then 'selected' else ''#--> >$T('day')</option>
|
||||
<option value="x" <!--#if $quota_period == 'x' then 'selected' else ''#--> >$T('manual')</option>
|
||||
</select>
|
||||
<br/><br/>
|
||||
<strong>$T('opt-quota_day'):</strong><br/>
|
||||
$T('explain-quota_day')<br/>
|
||||
<input type="text" name="quota_day" value="$quota_day"/>
|
||||
<br>
|
||||
<br>
|
||||
<legend>$T('swtag-quota')</legend>
|
||||
<label><input type="checkbox" name="quota_resume" value="1" <!--#if $quota_resume > 0 then "checked=1" else ""#--> /> <strong>$T('opt-quota_resume')</strong></label><br>
|
||||
$T('explain-quota_resume')<br>
|
||||
<br/>
|
||||
</fieldset>
|
||||
</div>
|
||||
<p><input type="submit" value="$T('button-saveChanges')"></p>
|
||||
</form>
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
<!--#set global $have_refresh=5#-->
|
||||
<!--#set global $topmenu="status"#-->
|
||||
<!--#set global $topmenu="connections"#-->
|
||||
<!--#set global $statpath=".."#-->
|
||||
<!--#set global $helpsubject="GUI+Status-0-7"#-->
|
||||
<!--#set global $helpsubject="GUI+Connections"#-->
|
||||
<!--#include $webdir + "/inc_top.tmpl"#-->
|
||||
|
||||
<span class="SubMenu">
|
||||
<!--#set $msg=$T('askTestEmail')#-->
|
||||
<!--#if $have_quota#-->
|
||||
<a href="./reset_quota?session=$session">$T('link-resetQuota')</a> |
|
||||
<!--#end if#-->
|
||||
<a href="./disconnect?session=$session">$T('link-forceDisc')</a> |
|
||||
<a href="./showlog?session=$session">$T('link-showLog')</a>
|
||||
$T('logging'):
|
||||
@@ -9,17 +9,14 @@
|
||||
<br>
|
||||
<!--#if int($cache_max)#-->
|
||||
<!--#set $msg=$T('ft-buffer@2')%($cache_art, $cache_size)#-->
|
||||
$msg
|
||||
<!--#end if#-->
|
||||
<!--#if $have_quota#-->
|
||||
| <strong>$T('quota-left'):</strong> $left_quota ⁄ $quota</strong>
|
||||
$msg<br>
|
||||
<!--#end if#-->
|
||||
<!--#if $new_release#-->
|
||||
<!--#set $msg=$T('ft-newRelease@1')%($new_release)#-->
|
||||
<b>$msg <a href="$new_rel_url/" target="_blank">SF.net</a></b><br>
|
||||
<!--#end if#-->
|
||||
<!--#if $have_warnings != "0"#-->
|
||||
<strong><a href="$statpath/status/">$T('ft-warning')($have_warnings)!</a></strong>
|
||||
<strong><a href="$statpath/connections/">$T('ft-warning')($have_warnings)!</a></strong>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
<!--#set $mbleftrnd = str(int(float($mbleft)))#-->
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
<a href="$cpath/general/">$T('cmenu-general')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="folders"#-->
|
||||
<!--#if $submenu=="directories"#-->
|
||||
<a class="current" href="./">$T('cmenu-folders')</a> |
|
||||
<!--#else#-->
|
||||
<a href="$cpath/folders/">$T('cmenu-folders')</a> |
|
||||
<a href="$cpath/directories/">$T('cmenu-folders')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="switches"#-->
|
||||
@@ -41,18 +41,16 @@
|
||||
<a href="$cpath/rss/">$T('cmenu-rss')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="notify"#-->
|
||||
<a class="current" href="./">$T('cmenu-notif')</a> |
|
||||
<!--#if $submenu=="email"#-->
|
||||
<a class="current" href="./">$T('cmenu-email')</a> |
|
||||
<!--#else#-->
|
||||
<a href="$cpath/notify/">$T('cmenu-notif')</a> |
|
||||
<a href="$cpath/email/">$T('cmenu-email')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if 0#-->
|
||||
<!--#if $submenu=="indexers"#-->
|
||||
<!--#if $submenu=="newzbin"#-->
|
||||
<a class="current" href="./">$T('cmenu-newzbin')</a> |
|
||||
<!--#else#-->
|
||||
<a href="$cpath/indexers/">$T('cmenu-newzbin')</a> |
|
||||
<!--#end if#-->
|
||||
<a href="$cpath/newzbin/">$T('cmenu-newzbin')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $submenu=="categories"#-->
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>$mbleft MB $T('queued') - SABnzbd $version</title>
|
||||
<link rel="stylesheet" type="text/css" href="$statpath/static/stylesheets/default.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="$statpath/static/stylesheets/defaultcolors.css"/>
|
||||
@@ -48,7 +47,7 @@
|
||||
<!--#if $topmenu=='connections'#-->
|
||||
<a class="current" href="$mypath/">$T('menu-cons')</a> |
|
||||
<!--#else#-->
|
||||
<a href="$statpath/status/">$T('menu-cons')</a> |
|
||||
<a href="$statpath/connections/">$T('menu-cons')</a> |
|
||||
<!--#end if#-->
|
||||
|
||||
<!--[if IE]>
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
<div class="EntryBlock">
|
||||
<form action="addID" method="get">
|
||||
<fieldset class="EntryFieldSet">
|
||||
<legend>$T('add') URL</legend>
|
||||
<legend>$T('add')
|
||||
<!--#if $varExists('newzbinDetails')#--> $T('reportId') / <!--#end if#-->URL</legend>
|
||||
<input type="text" name="id">
|
||||
<!--#if $cat_list#-->
|
||||
<select name="cat" >
|
||||
|
||||
@@ -103,7 +103,6 @@ $T('onQueueFinish'):
|
||||
<option value="set_priority?session=$session&nzo_id=$slot.nzo_id&priority=1" <!--#if $slot.priority == "High" then "selected" else ""#-->>$T('pr-high')</option>
|
||||
<option value="set_priority?session=$session&nzo_id=$slot.nzo_id&priority=0" <!--#if $slot.priority == "Normal" then "selected" else ""#-->>$T('pr-normal')</option>
|
||||
<option value="set_priority?session=$session&nzo_id=$slot.nzo_id&priority=-1" <!--#if $slot.priority == "Low" then "selected" else ""#-->>$T('pr-low')</option>
|
||||
<option value="set_priority?session=$session&nzo_id=$slot.nzo_id&priority=-4" <!--#if $slot.priority == "Stop" then "selected" else ""#-->>$T('pr-stop')</option>
|
||||
</select></form>
|
||||
<!--#end if#-->
|
||||
</td>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 52 KiB |
@@ -1,54 +0,0 @@
|
||||
|
||||
uniConfig for SABnzbd 0.7.x
|
||||
zoggy@sabnzbd.org
|
||||
|
||||
|
||||
========================================================
|
||||
LIBRARIES USED
|
||||
|
||||
jQuery
|
||||
* Project repository: https://github.com/jquery/jquery
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
|
||||
jQuery UI
|
||||
* Project repository: https://github.com/jquery/jquery-ui
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
|
||||
jQuery Form Plugin
|
||||
* Project repository: https://github.com/malsup/form
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
|
||||
jQuery Tools (tabs)
|
||||
* Project repository: https://github.com/jquerytools/jquerytools
|
||||
|
||||
Formalize
|
||||
* Project repository: https://github.com/nathansmith/formalize
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
|
||||
normalize.css
|
||||
* Project repository: https://github.com/necolas/normalize.css
|
||||
* Licensed under public domain
|
||||
|
||||
qTip2
|
||||
* Project repository: https://github.com/craga89/qtip2
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
|
||||
|
||||
========================================================
|
||||
IMAGES USED
|
||||
|
||||
/images/loading-*.gif
|
||||
- source: http://www.AjaxLoad.info
|
||||
|
||||
/images/flags/*
|
||||
- source: http://www.famfamfam.com/lab/icons/flags/
|
||||
@@ -1,14 +0,0 @@
|
||||
<!-- Content end -->
|
||||
</div>
|
||||
<script>
|
||||
function is_touch_device() {
|
||||
return !!('ontouchstart' in window) ? 1 : 0;
|
||||
}
|
||||
if (is_touch_device() === 1) {
|
||||
// touch device found
|
||||
\$('#content').css('overflow-y', 'inherit');
|
||||
\$('html').css('overflow-y', 'scroll');
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,156 +0,0 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>SABnzbd $version - $T('queued'): $mbleft $T('MB')</title>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="robots" content="noindex">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
#if $pane == "Config"#
|
||||
#set global $root = '../'#
|
||||
#else#
|
||||
#set global $root = '../../'#
|
||||
#end if#
|
||||
|
||||
<link rel="shortcut icon" href="${root}staticcfg/ico/favicon.ico">
|
||||
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="${root}staticcfg/ico/apple-touch-icon-144x144-precomposed.png">
|
||||
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="${root}staticcfg/ico/apple-touch-icon-114x114-precomposed.png">
|
||||
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="${root}staticcfg/ico/apple-touch-icon-72x72-precomposed.png">
|
||||
<link rel="apple-touch-icon-precomposed" href="${root}staticcfg/ico/apple-touch-icon-57x57-precomposed.png">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="${root}staticcfg/css/style.css" />
|
||||
<script src="${root}staticcfg/js/script.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
\$.Browser = {
|
||||
defaults: {
|
||||
title: 'Choose Directory',
|
||||
url: '${root}api?mode=browse&output=json&apikey=$session',
|
||||
autocompleteURL: '${root}api?mode=browse&output=json&compact=1&apikey=$session'
|
||||
}
|
||||
};
|
||||
var config_pane = "$pane";
|
||||
var help_uri = "$help_uri";
|
||||
var apikey = "$session";
|
||||
var confirmWithoutSavingPrompt = "$T('Plush-confirmWithoutSavingPrompt')";
|
||||
function config_success() {
|
||||
\$('.saveButton').each(function () {
|
||||
\$(this).removeAttr("disabled").attr("value", "$T('button-saveChanges')");
|
||||
});
|
||||
}
|
||||
function config_failure() {
|
||||
\$('.saveButton').each(function () {
|
||||
\$(this).removeAttr("disabled").attr("value", "$T('smpl-failed')");
|
||||
});
|
||||
}
|
||||
|
||||
\$(document).ready(function () {
|
||||
|
||||
#if $pane != "Servers"#
|
||||
\$('.col2 H3').click(function () { \$(this).parent().next().toggle() });
|
||||
#end if#
|
||||
|
||||
\$('.sabnzbd_restart').click(function () {
|
||||
\$('.sabnzbd_restart').each(function () {
|
||||
\$(this).attr("disabled", "disabled");
|
||||
});
|
||||
var msg = "$T('explain-Restart')";
|
||||
if (confirm(msg.replace(/\<br(\s*\/|)\>/g, '\n'))) {
|
||||
\$(this).attr("value", "$T('wizard-restarting')");
|
||||
location.href = '${root}config/restart?session=$session';
|
||||
}
|
||||
\$('.sabnzbd_restart').each(function () {
|
||||
\$(this).removeAttr("disabled");
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
\$('#fullform').ajaxForm({
|
||||
beforeSubmit: function () {
|
||||
\$('.saveButton').each(function () {
|
||||
\$(this).attr("disabled", "disabled").attr("value", "$T('smpl-saving')");
|
||||
});
|
||||
},
|
||||
success: function () {
|
||||
setTimeout(config_success, 1000);
|
||||
},
|
||||
error: function () {
|
||||
setTimeout(config_failure, 1000);
|
||||
},
|
||||
timeout: 3000
|
||||
});
|
||||
|
||||
\$("#sidebar-trigger").click(function () {
|
||||
if (\$("#sidebar-trigger").hasClass("trigger-left")) {
|
||||
\$("#sidebar").animate({marginLeft: "-150px", queue: false}, 250);
|
||||
\$("#sidebar-pane").animate({marginLeft: "-150px", queue: false}, 250);
|
||||
\$("#content").animate({left: "6px", queue: false}, 250);
|
||||
\$("#sidebar-trigger").removeClass("trigger-left").addClass("trigger-right");
|
||||
} else {
|
||||
\$("#sidebar").animate({marginLeft: "0px", queue: false}, 250);
|
||||
\$("#sidebar-pane").animate({marginLeft: "0px", queue: false}, 250);
|
||||
\$("#content").animate({left: "156px", queue: false}, 250);
|
||||
\$("#sidebar-trigger").removeClass("trigger-right").addClass("trigger-left");
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
</head>
|
||||
<body class="$pane">
|
||||
<div id="sidebar">
|
||||
<a href="${root}"><img src="${root}staticcfg/images/logo.png" width="120" height="45" id="logo" alt="[home]" /></a>
|
||||
<div id="tab-container">
|
||||
<a href="${root}config/">
|
||||
<div #if $pane == "Config" then 'class="active"' else ""#>$T('menu-config')</div>
|
||||
</a>
|
||||
<a href="${root}config/general/">
|
||||
<div #if $pane == "General" then 'class="active"' else ""#>$T('cmenu-general')</div>
|
||||
</a>
|
||||
<a href="${root}config/folders/">
|
||||
<div #if $pane == "Folders" then 'class="active"' else ""#>$T('cmenu-folders')</div>
|
||||
</a>
|
||||
<a href="${root}config/switches/">
|
||||
<div #if $pane == "Switches" then 'class="active"' else ""#>$T('cmenu-switches')</div>
|
||||
</a>
|
||||
<a href="${root}config/server/">
|
||||
<div #if $pane == "Servers" then 'class="active"' else ""#>$T('cmenu-servers')</div>
|
||||
</a>
|
||||
<a href="${root}config/scheduling/">
|
||||
<div #if $pane == "Scheduling" then 'class="active"' else ""#>$T('Plush-cmenu-scheduling')</div>
|
||||
</a>
|
||||
<a href="${root}config/notify/">
|
||||
<div #if $pane == "Email" then 'class="active"' else ""#>$T('cmenu-notif')</div>
|
||||
</a>
|
||||
<!--#if 0#-->
|
||||
<a href="${root}config/indexers/">
|
||||
<div #if $pane == "Index Sites" then 'class="active"' else ""#>$T('cmenu-newzbin')</div>
|
||||
</a>
|
||||
<!--#end if#-->
|
||||
<a href="${root}config/categories/">
|
||||
<div #if $pane == "Categories" then 'class="active"' else ""#>$T('cmenu-cat')</div>
|
||||
</a>
|
||||
<a href="${root}config/sorting/">
|
||||
<div #if $pane == "Sorting" then 'class="active"' else ""#>$T('cmenu-sorting')</div>
|
||||
</a>
|
||||
<a href="${root}config/special/">
|
||||
<div #if $pane == "Special" then 'class="active"' else ""#>$T('cmenu-special')</div>
|
||||
</a>
|
||||
<a href="${root}config/rss/">
|
||||
<div #if $pane == "RSS" then 'class="active"' else ""#>$T('cmenu-rss')</div>
|
||||
</a>
|
||||
<br/>
|
||||
<a href="$helpuri$help_uri" target="_blank">
|
||||
<div>$T('menu-help')</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="sidebar-pane"><div id="sidebar-trigger" class="trigger-left"></div></div>
|
||||
<div id="content">
|
||||
<!-- Content start -->
|
||||
@@ -1,34 +0,0 @@
|
||||
<!--#set global $pane="Config"#-->
|
||||
<!--#set global $help_uri="configure-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<div class="section padTable">
|
||||
<table id="infoTable">
|
||||
<tbody>
|
||||
<tr class="alt"><td class="infoTableHeader">$T('version'): </td><td class="infoTableCell">$version</td></tr>
|
||||
<tr><td class="infoTableHeader">$T('uptime'): </td><td class="infoTableCell">$uptime</td></tr>
|
||||
<tr class="alt"><td class="infoTableHeader">$T('confgFile'): </td><td class="infoTableCell">$configfn</td></tr>
|
||||
<tr><td class="infoTableHeader">$T('cache').capitalize(): </td><td class="infoTableCell"><!--#set $msg=$T('ft-buffer@2')%($cache_art, $cache_size)#-->$msg</td></tr>
|
||||
<tr class="alt"><td class="infoTableHeader">$T('parameters'): </td><td class="infoTableCell">$cmdline</td></tr>
|
||||
<tr><td class="infoTableHeader">$T('pythonVersion'): </td><td class="infoTableCell">$sys.version[:120]</td></tr>
|
||||
<tr class="infoTableSeperator alt"><td class="infoTableHeader">$T('homePage') </td><td class="infoTableCell"><a href="http://sabnzbd.org/" target="_blank">http://sabnzbd.org/</a></td></tr>
|
||||
<tr><td class="infoTableHeader">$T('menu-wiki') </td><td class="infoTableCell"><a href="http://wiki.sabnzbd.org/faq" target="_blank">http://wiki.sabnzbd.org/faq</a></td></tr>
|
||||
<tr class="alt"><td class="infoTableHeader">$T('menu-forums') </td><td class="infoTableCell"><a href="http://forums.sabnzbd.org/" target="_blank">http://forums.sabnzbd.org/</a></td></tr>
|
||||
<tr><td class="infoTableHeader">$T('source') </td><td class="infoTableCell"><a href="https://github.com/sabnzbd/sabnzbd" target="_blank">https://github.com/sabnzbd/sabnzbd</a></td></tr>
|
||||
<tr class="alt"><td class="infoTableHeader">$T('menu-irc') </td><td class="infoTableCell"><a href="irc://irc.synirc.net/#sabnzbd"><i>#sabnzbd</i> on <i>irc.synirc.net</i></a> $T('or') (<a href="http://sabnzbd.org/live-chat/" target="_blank">webchat</a>)</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="padding alt">
|
||||
<h5 class="copyright">Copyright © 2008-2012 The SABnzbd Team <<span style="color: #0000ff;">team@sabnzbd.org</span>></h5>
|
||||
<p class="copyright"><small>$T('yourRights')</small></p>
|
||||
</div>
|
||||
<!--#if $news_items#-->
|
||||
<div class="padding">
|
||||
<iframe frameborder=0 width=100% src="http://sabnzbdplus.sourceforge.net/version/news.html"></iframe>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,115 +0,0 @@
|
||||
<!--#set global $pane="Categories"#-->
|
||||
<!--#set global $help_uri="configure-categories-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
|
||||
<div class="section">
|
||||
<div class="padTable">
|
||||
<p>
|
||||
$T('explain-catTags') $T('explain-catTags2')<br/>
|
||||
</p>
|
||||
<div class="field-pair">
|
||||
<h5 class="darkred nomargin">$T('explain-relFolder'): <span class="path">$defdir</span></h5>
|
||||
</div>
|
||||
|
||||
<!--#set $odd = False#-->
|
||||
<!--#set $cur = 0#-->
|
||||
<!--#for $slot in $slotinfo#-->
|
||||
<!--#set $odd = not $odd#-->
|
||||
<!--#set $cur = $cur+1#-->
|
||||
|
||||
<form action="save" method="get">
|
||||
|
||||
<table class="catTable">
|
||||
|
||||
<!--#if $cur == 1#-->
|
||||
<tr>
|
||||
<th>$T('category')</th>
|
||||
<th>$T('priority')</th>
|
||||
<th>$T('mode')</th>
|
||||
<!--#if $script_list#--><th>$T('script')</th><!--#end if#-->
|
||||
<th>$T('catFolderPath')</th>
|
||||
<th>$T('catTags')</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
<!--#end if#-->
|
||||
|
||||
<tr class="<!--#if $odd then "alt" else ""#-->" <!--#if $slot.name == '*'#-->style="background-color: #FFFFE0;"<!--#end if#-->>
|
||||
|
||||
<td>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" value="$slot.name" name="name" />
|
||||
<!--#if $slot.name != '*'#-->
|
||||
<input type="text" name="newname" value="$slot.name" size="10" />
|
||||
<!--#else#-->
|
||||
<input type="text" name="newname" value="$T('default')" disabled="disabled" size="10" />
|
||||
<!--#end if#-->
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<select name="priority">
|
||||
<!--#if $slot.name != '*'#-->
|
||||
<option value="-100" <!--#if $slot.priority == -100 then 'selected="selected" class="selected"' else ""#-->>$T('default')</option>
|
||||
<!--#end if#-->
|
||||
<option value="2" <!--#if $slot.priority == 2 then 'selected="selected" class="selected"' else ""#-->>$T('pr-force')</option>
|
||||
<option value="1" <!--#if $slot.priority == 1 then 'selected="selected" class="selected"' else ""#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $slot.priority == 0 then 'selected="selected" class="selected"' else ""#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $slot.priority == -1 then 'selected="selected" class="selected"' else ""#-->>$T('pr-low')</option>
|
||||
<option value="-2" <!--#if $slot.priority == -2 then 'selected="selected" class="selected"' else ""#-->>$T('pr-paused')</option>
|
||||
</select>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<select name="pp">
|
||||
<!--#if $slot.name != '*'#-->
|
||||
<option value="" <!--#if $slot.pp == "" then 'selected="selected" class="selected"' else ""#-->>$T('default')</option>
|
||||
<!--#end if#-->
|
||||
<option value="0" <!--#if $slot.pp == "0" then 'selected="selected" class="selected"' else ""#-->>$T('pp-none')</option>
|
||||
<option value="1" <!--#if $slot.pp == "1" then 'selected="selected" class="selected"' else ""#-->>$T('pp-repair')</option>
|
||||
<option value="2" <!--#if $slot.pp == "2" then 'selected="selected" class="selected"' else ""#-->>$T('pp-unpack')</option>
|
||||
<option value="3" <!--#if $slot.pp == "3" then 'selected="selected" class="selected"' else ""#-->>$T('pp-delete')</option>
|
||||
</select>
|
||||
</td>
|
||||
|
||||
<!--#if $script_list#-->
|
||||
<td>
|
||||
<select name="script">
|
||||
<!--#for $sc in $script_list#-->
|
||||
<!--#if not ($sc == 'Default' and $slot.name == '*')#-->
|
||||
<option value="$sc" <!--#if $slot.script.lower() == $sc.lower() then 'selected="selected" class="selected"' else ""#-->>$Tspec($sc)</option>
|
||||
<!--#end if#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</td>
|
||||
<!--#end if#-->
|
||||
|
||||
<td><input type="text" name="dir" value="$slot.dir" size="30" /></td>
|
||||
<td><input type="text" name="newzbin" value="$slot.newzbin" size="30" /></td>
|
||||
|
||||
<td class="nowrap">
|
||||
<input type="submit" class="Save" value="<!--#if $cur == 2 then $T('button-add') else $T('button-save')#-->" />
|
||||
<!--#if $slot.name and $slot.name != '*'#-->
|
||||
<input type="button" class="delCat" value="$T('button-x')" />
|
||||
<!--#end if#-->
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<!--#end for#-->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
\$(document).ready(function(){
|
||||
\$('.delCat').click(function(){
|
||||
var theForm = \$(this).closest("form");
|
||||
theForm.attr("action", "delete").submit();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,118 +0,0 @@
|
||||
<!--#set global $pane="Folders"#-->
|
||||
<!--#set global $help_uri="configure-folders-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveDirectories" method="post" name="fullform" id="fullform">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('userFolders')</h3>
|
||||
<p>$T('explain-folderConfig')</p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<h5 class="darkred nomargin">$T('base-folder'): <span class="path">$my_home</span></h5>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="download_dir">$T('opt-download_dir')</label>
|
||||
<input type="text" name="download_dir" id="download_dir" value="$download_dir" size="45" />
|
||||
<span class="desc">$T('explain-download_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="download_free">$T('opt-download_free')</label>
|
||||
<input type="text" name="download_free" id="download_free" value="$download_free" size="8" />
|
||||
<span class="desc">$T('explain-download_free')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="complete_dir">$T('opt-complete_dir')</label>
|
||||
<input type="text" name="complete_dir" id="complete_dir" value="$complete_dir" size="45" />
|
||||
<span class="desc">$T('explain-complete_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair <!--#if $nt then "disabled" else "" #-->">
|
||||
<label class="config" for="permissions">$T('opt-permissions')</label>
|
||||
<input type="text" name="permissions" id="permissions" value="$permissions" size="8" <!--#if $nt then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-permissions')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="dirscan_dir">$T('opt-dirscan_dir')</label>
|
||||
<input type="text" name="dirscan_dir" id="dirscan_dir" value="$dirscan_dir" size="45" />
|
||||
<span class="desc">$T('explain-dirscan_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="dirscan_speed">$T('opt-dirscan_speed')</label>
|
||||
<input type="number" name="dirscan_speed" id="dirscan_speed" value="$dirscan_speed" size="8" min="0" max="3600" />
|
||||
<span class="desc">$T('explain-dirscan_speed')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="script_dir">$T('opt-script_dir')</label>
|
||||
<input type="text" name="script_dir" id="script_dir" value="$script_dir" size="45" />
|
||||
<span class="desc">$T('explain-script_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="email_dir">$T('opt-email_dir')</label>
|
||||
<input type="text" name="email_dir" id="email_dir" value="$email_dir" size="45" />
|
||||
<span class="desc">$T('explain-email_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="password_file">$T('opt-password_file')</label>
|
||||
<input type="text" name="password_file" id="password_file" value="$password_file" size="45" />
|
||||
<span class="desc">$T('explain-password_file')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('systemFolders')</h3>
|
||||
<p>$T('explain-folderConfig')</p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<h5 class="darkred nomargin">$T('base-folder'): <span class="path">$my_lcldata</span></h5>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="admin_dir">$T('opt-admin_dir')</label>
|
||||
<input type="text" name="admin_dir" id="admin_dir" value="$admin_dir" size="45" />
|
||||
<span class="desc">$T('explain-admin_dir1')</span>
|
||||
<span class="desc">$T('explain-admin_dir2')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="log_dir">$T('opt-log_dir')</label>
|
||||
<input type="text" name="log_dir" id="log_dir" value="$log_dir" size="45" />
|
||||
<span class="desc">$T('explain-log_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="nzb_backup_dir">$T('opt-nzb_backup_dir')</label>
|
||||
<input type="text" name="nzb_backup_dir" id="nzb_backup_dir" value="$nzb_backup_dir" size="45" />
|
||||
<span class="desc">$T('explain-nzb_backup_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="padding alt">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script>
|
||||
\$(document).ready(function(){
|
||||
\$('#download_dir').fileBrowser({ title: 'Select $T('opt-download_dir')' });
|
||||
\$('#complete_dir').fileBrowser({ title: 'Select $T('opt-complete_dir')' });
|
||||
\$('#dirscan_dir').fileBrowser({ title: 'Select $T('opt-dirscan_dir')' });
|
||||
\$('#script_dir').fileBrowser({ title: 'Select $T('opt-script_dir')' });
|
||||
\$('#email_dir').fileBrowser({ title: 'Select $T('opt-email_dir')' });
|
||||
});
|
||||
</script>
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,236 +0,0 @@
|
||||
<!--#set global $pane="General"#-->
|
||||
<!--#set global $help_uri="configure-general-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveGeneral" method="post" name="fullform" id="fullform" novalidate>
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('webServer')</h3>
|
||||
<p><b>$T('restartRequired')</b></p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="host">$T('opt-host')</label>
|
||||
<input type="url" name="host" id="host" value="$host" size="40" />
|
||||
<span class="desc">$T('explain-host')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port">$T('opt-port')</label>
|
||||
<input type="text" name="port" id="port" value="$port" size="8" />
|
||||
<span class="desc">$T('explain-port')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="username">$T('opt-web_username')</label>
|
||||
<input type="text" name="username" id="username" value="$username" size="30" />
|
||||
<span class="desc">$T('explain-web_username')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="password">$T('opt-web_password')</label>
|
||||
<input type="password" name="password" id="password" value="$password" size="30" />
|
||||
<span class="desc">$T('explain-web_password')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="web_dir">$T('opt-web_dir')</label>
|
||||
<select name="web_dir" id="web_dir">
|
||||
<!--#for $webline in $web_list#-->
|
||||
<!--#if $webline.lower() == $web_dir.lower()#-->
|
||||
<option value="$webline" selected="selected" class="selected">$webline</option>
|
||||
<!--#else#-->
|
||||
<option value="$webline">$webline</option>
|
||||
<!--#end if#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<span class="desc">$T('explain-web_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="web_dir2">$T('opt-web_dir2')</label>
|
||||
<select name="web_dir2" id="web_dir2">
|
||||
<!--#for $webline in $web_list2#-->
|
||||
<!--#if $webline.lower() == $web_dir2.lower()#-->
|
||||
<option value="$webline" selected="selected" class="selected">$webline</option>
|
||||
<!--#else#-->
|
||||
<option value="$webline">$webline</option>
|
||||
<!--#end if#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<span class="desc">$T('explain-web_dir2')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="language">$T('opt-language')</label>
|
||||
<select name="language" id="language" id="language" class="select">
|
||||
<!--#for $webline in $lang_list#-->
|
||||
<!--#if $webline[0].lower() == $language.lower()#-->
|
||||
<option value="$webline[0]" selected="selected" class="selected">$webline[1]</option>
|
||||
<!--#else#-->
|
||||
<option value="$webline[0]">$webline[1]</option>
|
||||
<!--#end if#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<span class="desc">$T('explain-language')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="disable_api_key">$T('opt-disableApikey')</label>
|
||||
<input type="checkbox" name="disable_api_key" id="disable_api_key" value="1" <!--#if int($disable_api_key) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-disableApikey')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="apikey">$T('opt-apikey')</label>
|
||||
<input type="text" id="apikey" value="$session" size="35" />
|
||||
<input type="button" value="$T('button-apikey')" id="generate_new_apikey" />
|
||||
<input type="button" value="$T('qr-code')" title="$T('explain-qr-code')" class="show_qrcode" rel="$session" />
|
||||
<span class="desc">$T('explain-apikey')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="nzbkey">$T('opt-nzbkey')</label>
|
||||
<input type="text" id="nzbkey" value="$nzb_key" size="35" />
|
||||
<input type="button" value="$T('button-apikey')" id="generate_new_nzbkey" />
|
||||
<input type="button" value="$T('qr-code')" title="$T('explain-qr-code')" class="show_qrcode" rel="$nzb_key" />
|
||||
<span class="desc">$T('explain-nzbkey')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('httpsSupport')</h3>
|
||||
<p><b>$T('restartRequired')</b></p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<h5 class="darkred nomargin">$T('base-folder'): <span class="path">$my_lcldata</span></h5>
|
||||
</div>
|
||||
<div class="field-pair alt <!--#if int($have_ssl) == 0 then "disabled" else ""#-->">
|
||||
<label class="config" for="enable_https">$T('opt-enable_https')</label>
|
||||
<input type="checkbox" name="enable_https" id="enable_https" value="1" <!--#if int($enable_https) > 0 then 'checked="checked"' else ""#--> <!--#if int($have_ssl) == 0 then "disabled" else ""#--> />
|
||||
<span class="desc">$T('explain-enable_https')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="https_port">$T('opt-https_port')</label>
|
||||
<input type="text" name="https_port" id="https_port" value="$https_port" size="8" />
|
||||
<span class="desc">$T('explain-https_port')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="https_cert">$T('opt-https_cert')</label>
|
||||
<input type="text" name="https_cert" id="https_cert" value="$https_cert" size="50" />
|
||||
<span class="desc">$T('explain-https_cert')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="https_key">$T('opt-https_key')</label>
|
||||
<input type="text" name="https_key" id="https_key" value="$https_key" size="50" />
|
||||
<span class="desc">$T('explain-https_key')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="https_chain">$T('opt-https_chain')</label>
|
||||
<input type="text" name="https_chain" id="https_chain" value="$https_chain" size="50" />
|
||||
<span class="desc">$T('explain-https_chain')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('tuning')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="bandwidth_limit">$T('opt-bandwidth_limit')</label>
|
||||
<input type="number" name="bandwidth_limit" id="bandwidth_limit" value="$bandwidth_limit" size="8" step="1024" min="0" />
|
||||
<span class="desc">$T('explain-bandwidth_limit')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="cache_limit">$T('opt-cache_limitstr')</label>
|
||||
<input type="text" name="cache_limit" id="cache_limit" value="$cache_limit" size="8" />
|
||||
<span class="desc">$T('explain-cache_limitstr')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="cleanup_list">$T('opt-cleanup_list')</label>
|
||||
<input type="text" name="cleanup_list" id="cleanup_list" value="$cleanup_list" size="50"/>
|
||||
<span class="desc">$T('explain-cleanup_list')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="padding alt">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script>
|
||||
\$(document).ready(function(){
|
||||
\$('#apikey, #nzbkey').click(function () { \$(this).select() });
|
||||
\$('#generate_new_apikey').click(function () {
|
||||
if (confirm("$T('Plush-confirm')")) {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "../../tapi",
|
||||
data: {mode:'config', name:'set_apikey', apikey: \$('#apikey').val()},
|
||||
success: function(msg){
|
||||
\$('#apikey').val(msg);
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
\$('#generate_new_nzbkey').click(function () {
|
||||
if (confirm("$T('Plush-confirm')")) {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "../../tapi",
|
||||
data: {mode:'config', name:'set_nzbkey', apikey: \$('#apikey').val()},
|
||||
success: function(msg){
|
||||
\$('#nzbkey').val(msg);
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
\$('.show_qrcode').each(function () {
|
||||
var qrkey = \$(this).attr('rel'),
|
||||
qrcode = \$('<img />', {
|
||||
src: 'https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=' + qrkey,
|
||||
alt: 'loading...',
|
||||
width: 300,
|
||||
height: 300
|
||||
});
|
||||
\$(this).qtip( {
|
||||
content: {
|
||||
text: qrcode
|
||||
},
|
||||
position: {
|
||||
my: 'center',
|
||||
at: 'center',
|
||||
target: \$(window)
|
||||
},
|
||||
show: {
|
||||
event: 'click',
|
||||
solo: true,
|
||||
modal: true
|
||||
},
|
||||
hide: false,
|
||||
style: 'ui-tooltip-light ui-tooltip-rounded ui-tooltip-shadow ui-tooltip-qrcode'
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,79 +0,0 @@
|
||||
<!--#set global $pane="Index Sites"#-->
|
||||
<!--#set global $help_uri="configure-indexers-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveNewzbin" method="post" name="fullform" id="fullform">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>NzbMatrix $T('accountInfo')</h3>
|
||||
<p>$T('explain-nzbmatrix')</p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="matrix_username">$T('opt-username_matrix')</label>
|
||||
<input type="text" name="matrix_username" id="matrix_username" value="$matrix_username" size="30" />
|
||||
<span class="desc">$T('explain-username_matrix')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="matrix_apikey">$T('opt-apikey_matrix')</label>
|
||||
<input type="text" name="matrix_apikey" id="matrix_apikey" value="$matrix_apikey" size="35" />
|
||||
<span class="desc">$T('explain-apikey_matrix')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="matrix_del_bookmark">$T('opt-newzbin_unbookmark')</label>
|
||||
<input type="checkbox" name="matrix_del_bookmark" id="matrix_del_bookmark" value="1" <!--#if int($matrix_del_bookmark) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-newzbin_unbookmark')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="padding alt">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script>
|
||||
\$(document).ready(function(){
|
||||
\$('#matrix_apikey').click(function(){ \$(this).select() });
|
||||
\$('#getBookmarks2').click(function(){ window.location='getBookmarks?session='+apikey; });
|
||||
\$('#hideBookmarks').click(function(){ window.location='hideBookmarks?session='+apikey; });
|
||||
\$('#showBookmarks').click(function(){ window.location='showBookmarks?session='+apikey; });
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
\$(document).ready(function(){
|
||||
\$('#getBookmarks').click(function(event){
|
||||
\$.ajax({
|
||||
type: "GET",
|
||||
url: "../../tapi",
|
||||
data: {mode: 'newzbin', name: 'get_bookmarks', output: 'json', apikey: '$session' },
|
||||
beforeSend: function(){
|
||||
\$('#getBookmarks').attr("disabled", "disabled");
|
||||
\$('#getBookmarks-result').removeClass("success failure").addClass("loading");
|
||||
},
|
||||
complete: function(){
|
||||
\$('#getBookmarks').removeAttr("disabled");
|
||||
\$('#getBookmarks-result').removeClass("loading");
|
||||
},
|
||||
success: function(data){
|
||||
if(data.status == true)
|
||||
\$('#getBookmarks-result').addClass("success");
|
||||
else {
|
||||
\$('#getBookmarks-result').addClass("failure")
|
||||
alert(data.error);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,189 +0,0 @@
|
||||
<!--#set global $pane="Email"#-->
|
||||
<!--#set global $help_uri="configure-notifications-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveEmail" method="post" name="fullform" id="fullform" novalidate>
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('emailOptions')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="email_endjob_radio">$T('opt-email_endjob')</label>
|
||||
<select name="email_endjob" id="email_endjob">
|
||||
<option value="0" <!--#if int($email_endjob) == 0 then 'selected="selected" class="selected"' else ""#--> >$T('email-never')</option>
|
||||
<option value="1" <!--#if int($email_endjob) == 1 then 'selected="selected" class="selected"' else ""#--> >$T('email-always')</option>
|
||||
<option value="2" <!--#if int($email_endjob) == 2 then 'selected="selected" class="selected"' else ""#--> >$T('email-errorOnly')</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="email_full">$T('opt-email_full')</label>
|
||||
<input type="checkbox" name="email_full" id="email_full" value="1" <!--#if int($email_full) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-email_full')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="email_rss">$T('opt-email_rss')</label>
|
||||
<input type="checkbox" name="email_rss" id="email_rss" value="1" <!--#if int($email_rss) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-email_rss')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="email_dir">$T('opt-email_dir')</label>
|
||||
<input type="text" name="email_dir" id="email_dir" value="$email_dir" size="45" />
|
||||
<span class="desc">$T('explain-email_dir')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('emailAccount')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="email_server">$T('opt-email_server')</label>
|
||||
<input type="text" name="email_server" id="email_server" value="$email_server" size="40" />
|
||||
<span class="desc">$T('explain-email_server')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="email_to">$T('opt-email_to')</label>
|
||||
<input type="email" name="email_to" id="email_to" value="$email_to" size="40" />
|
||||
<span class="desc">$T('explain-email_to')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="email_from">$T('opt-email_from')</label>
|
||||
<input type="email" name="email_from" id="email_from" value="$email_from" size="40" />
|
||||
<span class="desc">$T('explain-email_from')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="email_account">$T('opt-email_account')</label>
|
||||
<input type="email" name="email_account" id="email_account" value="$email_account" size="30" />
|
||||
<span class="desc">$T('explain-email_account')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="email_pwd">$T('opt-email_pwd')</label>
|
||||
<input type="password" name="email_pwd" id="email_pwd" value="$email_pwd" size="30" />
|
||||
<span class="desc">$T('explain-email_pwd')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('link-testEmail')" id="test_email" rel="$T('askTestEmail')" />
|
||||
<span id="testmail-result" class="icon path darkred"> </span>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('growlSettings')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="notify_classes">$T('opt-notify_classes')</label>
|
||||
<select name="notify_classes" multiple="multiple" class="multiple_cats">
|
||||
<!--#for $item in $notify_list#-->
|
||||
<option value="$item" <!--#if $item in $notify_classes then 'selected="selected"' else ""#--> >$T($notify_texts[$item])</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<span class="desc">$T('explain-notify_classes')</span>
|
||||
</div>
|
||||
<div class="field-pair <!--#if not $have_ncenter then "disabled" else "" #-->">
|
||||
<label class="config" for="ncenter_enable">$T('opt-ncenter_enable')</label>
|
||||
<input type="checkbox" name="ncenter_enable" id="ncenter_enable" value="1" <!--#if int($ncenter_enable) > 0 then 'checked="checked"' else ""#--> <!--#if not $have_ncenter then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-ncenter_enable')</span>
|
||||
</div>
|
||||
<div class="field-pair alt <!--#if not $have_ntfosd then "disabled" else "" #-->">
|
||||
<label class="config" for="ntfosd_enable">$T('opt-ntfosd_enable')</label>
|
||||
<input type="checkbox" name="ntfosd_enable" id="ntfosd_enable" value="1" <!--#if int($ntfosd_enable) > 0 then 'checked="checked"' else ""#--> <!--#if not $have_ntfosd then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-ntfosd_enable')</span>
|
||||
</div>
|
||||
<div class="field-pair" >
|
||||
<label class="config" for="growl_enable">$T('opt-growl_enable')</label>
|
||||
<input type="checkbox" name="growl_enable" id="growl_enable" value="1" <!--#if int($growl_enable) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-growl_enable')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="growl_server">$T('opt-growl_server')</label>
|
||||
<input type="text" name="growl_server" id="growl_server" value="$growl_server" size="40" />
|
||||
<span class="desc">$T('explain-growl_server')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="growl_password">$T('opt-growl_password')</label>
|
||||
<input type="password" name="growl_password" id="growl_password" value="$growl_password" size="30" />
|
||||
<span class="desc">$T('explain-growl_password')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('testNotify')" id="test_notification" />
|
||||
<span id="testnotice-result" class="icon path darkred"> </span>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="padding alt">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script>
|
||||
\$(document).ready(function(){
|
||||
\$('#email_dir').fileBrowser({ title: 'Select $T('opt-email_dir')' });
|
||||
\$('#test_email').click(function () {
|
||||
if (confirm(\$('#test_email').attr('rel'))) {
|
||||
\$.ajax({
|
||||
type: "GET",
|
||||
url: "../../tapi",
|
||||
data: {mode: 'test_email', apikey: '$session', output: 'json' },
|
||||
beforeSend: function () {
|
||||
\$('#test_email').attr("disabled", "disabled");
|
||||
\$('#testmail-result').removeClass("success failure").addClass("loading").html('$T('post-Verifying')');
|
||||
},
|
||||
complete: function () {
|
||||
\$('#test_email').removeAttr("disabled");
|
||||
\$('#testmail-result').removeClass("loading");
|
||||
},
|
||||
success: function (data) {
|
||||
if (data.status == true) {
|
||||
\$('#testmail-result').addClass("success").html('$T('smpl-emailsent')');
|
||||
} else {
|
||||
\$('#testmail-result').addClass("failure").html(data.error);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
\$('#test_notification').click(function () {
|
||||
\$.ajax({
|
||||
type: "GET",
|
||||
url: "../../tapi",
|
||||
data: {mode: 'test_notif', apikey: '$session', output: 'json' },
|
||||
beforeSend: function () {
|
||||
\$('#test_notification').attr("disabled", "disabled");
|
||||
\$('#testnotice-result').removeClass("success failure").addClass("loading").html('$T('post-Verifying')');
|
||||
},
|
||||
complete: function () {
|
||||
\$('#test_notification').removeAttr("disabled");
|
||||
\$('#testnotice-result').removeClass("loading");
|
||||
},
|
||||
success: function (data) {
|
||||
if (data.status == true) {
|
||||
\$('#testnotice-result').addClass("success").html('$T('smpl-notesent')');
|
||||
} else {
|
||||
\$('#testnotice-result').addClass("failure").html(data.error);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,575 +0,0 @@
|
||||
<!--#set global $pane="RSS"#-->
|
||||
<!--#set global $help_uri="configure-rss-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<!--#if not $active_feed#-->
|
||||
<div class="section">
|
||||
<div class="padTable">
|
||||
|
||||
<p>$T('explain-RSS')</p>
|
||||
|
||||
<form action="add_rss_feed" method="post" novalidate>
|
||||
<input type="hidden" name="session" value="$session">
|
||||
<table class="catTable">
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th>$T('name')</th>
|
||||
<th>$T('feed') URL</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td><input type="checkbox" name="enable" value="1" /></td>
|
||||
<td><input type="text" name="feed" size="20" value="$feed" placeholder="unique feed name" /></td>
|
||||
<td><input type="url" name="uri" size="35" /></td>
|
||||
<td class="nowrap">
|
||||
<input type="submit" class="Save" value="$T('button-add')" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<br/>
|
||||
|
||||
<form action="save_rss_feed" method="post" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<table id="subscriptions">
|
||||
<tbody>
|
||||
|
||||
<!--#set $feeds = sorted($rss.keys(), cmp=lambda x,y: cmp(x.lower(), y.lower()))#--><!--#slurp#-->
|
||||
<!--#set $odd = False#--><!--#slurp#-->
|
||||
<!--#for $feed_item in $feeds#--><!--#slurp#-->
|
||||
<!--#set $odd = not $odd#--><!--#slurp#-->
|
||||
|
||||
<tr class="data-row <!--#if $odd then "alt" else ""#-->" >
|
||||
<td class="chk">
|
||||
<input type="checkbox" class="toggleFeedCheckbox" name="enable" value="1" <!--#if int($rss[$feed_item]['enable']) != 0 then 'checked="checked"' else ""#--> rel="$feed_item" />
|
||||
</td>
|
||||
<td class="title">
|
||||
<div class="subscription-title">
|
||||
<a href="?feed=$rss[$feed_item]['link']" class="path feed">
|
||||
<div class="favicon" style="background-image: url("http://www.google.com/s2/favicons?domain=$rss[$feed_item]['baselink']&alt=feed");"></div>
|
||||
<span class="<!--#if int($rss[$feed_item]['enable']) != 0 then 'feed_enabled"' else "feed_disabled"#-->">$feed_item</span>
|
||||
</a>
|
||||
</div>
|
||||
<!-- <input type="text" name="newfeed" value="$feed_item" size="25" readonly="readonly" class="readonly" /> -->
|
||||
</td>
|
||||
<td class="controls">
|
||||
<input type="button" class="testFeed" value="$T('Read')" rel="$feed_item" />
|
||||
<input type="hidden" name="uri" value="$rss[$feed_item]['uri']" size="75" />
|
||||
<input type="button" class="editFeed" value="$T('Edit') URL" rel="$feed_item" />
|
||||
<input type="button" class="delFeed" value="$T('button-x')" rel="$feed_item" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="feed-row <!--#if $odd then "alt" else ""#-->">
|
||||
<td></td>
|
||||
<td colspan="2">
|
||||
<div>$rss[$feed_item]['uri']</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!--#end for#-->
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<!--#if $feeds#-->
|
||||
<br/>
|
||||
|
||||
<form action="rss_now" method="post" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="submit" class="readAll" value="$T('button-rssNow')" />
|
||||
</form>
|
||||
<!--#end if#-->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<form action="save_rss_rate" method="post">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config narrow" for="rss_rate">$T('opt-rss_rate')</label>
|
||||
<input type="number" name="rss_rate" id="rss_rate" value="$rss_rate" size="8" min="15" max="1440" />
|
||||
<input type="submit" value="$T('button-save')" />
|
||||
<span class="desc narrow">$T('explain-rss_rate')</span>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!--#end if#-->
|
||||
|
||||
<!--#if $active_feed#-->
|
||||
<!--#set $feed = $active_feed#-->
|
||||
|
||||
<div class="section">
|
||||
<div class="padTable">
|
||||
<h2 class="nomargin activeRSS"><a href="${root}config/rss/">$T('cmenu-rss')</a> » <a href="$rss[$active_feed]['uri']" onclick="window.open(this.href); return false;">$active_feed</a></h2>
|
||||
<!--#if $error#-->
|
||||
<h3 class="darkred">$error</h3>
|
||||
<!--#end if#-->
|
||||
|
||||
<form action="upd_rss_feed" method="post">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="feed" value="$feed" />
|
||||
<input type="hidden" name="uri" value="$rss[$feed]['uri']" />
|
||||
<table class="catTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th>$T('rss-order')</th>
|
||||
<th>$T('rss-type')</th>
|
||||
<th>$T('rss-filter')</th>
|
||||
<!--#if $rss[$feed]['pick_cat']#-->
|
||||
<th>$T('category')</th>
|
||||
<!--#end if#-->
|
||||
<th>$T('priority')</th>
|
||||
<th>$T('mode')</th>
|
||||
<!--#if $rss[$feed]['pick_script']#-->
|
||||
<th>$T('script')</th>
|
||||
<!--#end if#-->
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<!-- default / global filter -->
|
||||
<tbody>
|
||||
<tr class="default">
|
||||
<td>
|
||||
<input type="checkbox" disabled="disabled" class="hidden" />
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" disabled="disabled" size="1" class="hidden" />
|
||||
</td>
|
||||
<td>
|
||||
<select name="filter_type" disabled="disabled" class="hidden" >
|
||||
<option value="A" selected="selected"> $T('rss-accept')</option>
|
||||
<option value="M"> $T('rss-must')</option>
|
||||
<option value="R"> $T('rss-reject')</option>
|
||||
<option value="C"> $T('rss-mustcat')</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" disabled="disabled" value="" size="25" class="hidden" />
|
||||
</td>
|
||||
<!--#if $rss[$feed]['pick_cat']#-->
|
||||
<td>
|
||||
<select name="cat">
|
||||
<!--#for $ct in $cat_list#-->
|
||||
<option value="$ct" <!--#if $ct == $rss[$feed]['cat'] then 'selected="selected"' else ""#-->>$Tspec($ct)</option><!--#slurp#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</td>
|
||||
<!--#end if#-->
|
||||
<td>
|
||||
<select name="priority">
|
||||
<option value="-100" <!--#if $rss[$feed]['priority'] == -100 then 'selected="selected"' else ''#-->>$T('default')</option>
|
||||
<option value="2" <!--#if $rss[$feed]['priority'] == 2 then 'selected="selected"' else ''#-->>$T('pr-force')</option>
|
||||
<option value="1" <!--#if $rss[$feed]['priority'] == 1 then 'selected="selected"' else ''#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $rss[$feed]['priority'] == 0 then 'selected="selected"' else ''#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $rss[$feed]['priority'] == -1 then 'selected="selected"' else ''#-->>$T('pr-low')</option>
|
||||
<option value="-2" <!--#if $rss[$feed]['priority'] == -2 then 'selected="selected"' else ''#-->>$T('pr-paused')</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<select name="pp">
|
||||
<option value="" <!--#if $rss[$feed]['pp'] == "" then 'selected="selected"' else ''#-->>$T('default')</option>
|
||||
<option value="0" <!--#if $rss[$feed]['pp'] == "0" then 'selected="selected"' else ''#-->>$T('pp-none')</option>
|
||||
<option value="1" <!--#if $rss[$feed]['pp'] == "1" then 'selected="selected"' else ''#-->>$T('pp-repair')</option>
|
||||
<option value="2" <!--#if $rss[$feed]['pp'] == "2" then 'selected="selected"' else ''#-->>$T('pp-unpack')</option>
|
||||
<option value="3" <!--#if $rss[$feed]['pp'] == "3" then 'selected="selected"' else ''#-->>$T('pp-delete')</option>
|
||||
</select>
|
||||
</td>
|
||||
<!--#if $rss[$feed]['pick_script']#-->
|
||||
<td>
|
||||
<select name="script">
|
||||
<!--#for $sc in $script_list#-->
|
||||
<option value="$sc" <!--#if $sc == $rss[$feed]['script'] then 'selected="selected"' else ""#-->>$Tspec($sc)</option><!--#slurp#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</td>
|
||||
<!--#end if#-->
|
||||
<td>
|
||||
<input type="submit" class="Save" value="$T('button-save')" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<!-- add new filter -->
|
||||
<form action="upd_rss_filter" method="post">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="index" value="$rss[$feed]['filtercount']" />
|
||||
<input type="hidden" name="feed" value="$feed" />
|
||||
<table class="catTable">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" name="enabled" value="1" checked="checked" />
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="new_index" size="1" />
|
||||
</td>
|
||||
<td>
|
||||
<select name="filter_type">
|
||||
<option value="A" selected="selected"> $T('rss-accept')</option>
|
||||
<option value="M"> $T('rss-must')</option>
|
||||
<option value="R"> $T('rss-reject')</option>
|
||||
<option value="C"> $T('rss-mustcat')</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="filter_text" value="" size="25" />
|
||||
</td>
|
||||
<!--#if $rss[$feed]['pick_cat']#-->
|
||||
<td>
|
||||
<select name="cat">
|
||||
<!--#for $ct in $cat_list#-->
|
||||
<option value="$ct" <!--#if $ct == 'Default' then 'selected="selected"' else ""#-->>$Tspec($ct)</option><!--#slurp#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</td>
|
||||
<!--#end if#-->
|
||||
<td>
|
||||
<select name="priority">
|
||||
<option value="-100" selected="selected">$T('default')</option>
|
||||
<option value="2">$T('pr-force')</option>
|
||||
<option value="1">$T('pr-high')</option>
|
||||
<option value="0">$T('pr-normal')</option>
|
||||
<option value="-1">$T('pr-low')</option>
|
||||
<option value="-2">$T('pr-paused')</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<select name="pp">
|
||||
<option value="" selected="selected">$T('default')</option>
|
||||
<option value="0">$T('pp-none')</option>
|
||||
<option value="1">$T('pp-repair')</option>
|
||||
<option value="2">$T('pp-unpack')</option>
|
||||
<option value="3">$T('pp-delete')</option>
|
||||
</select>
|
||||
</td>
|
||||
<!--#if $rss[$feed]['pick_script']#-->
|
||||
<td>
|
||||
<select name="script">
|
||||
<!--#for $sc in $script_list#-->
|
||||
<option value="$sc" <!--#if $sc == 'Default' then 'selected="selected"' else ""#-->>$Tspec($sc)</option><!--#slurp#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</td>
|
||||
<!--#end if#-->
|
||||
<td>
|
||||
<input type="submit" class="Save" value="$T('button-add')" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<!--#set $odd = False#--><!--#slurp#-->
|
||||
<!--#set $fnum = 0#--><!--#slurp#-->
|
||||
<!--#for $filter in $rss[$feed].filters#--><!--#slurp#-->
|
||||
<!--#set $odd = not $odd#--><!--#slurp#-->
|
||||
|
||||
<form action="upd_rss_filter" method="post">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="index" value="$fnum" />
|
||||
<input type="hidden" name="feed" value="$feed" />
|
||||
<table class="catTable">
|
||||
<tbody>
|
||||
<tr class="<!--#if $odd then "alt" else ""#-->">
|
||||
<td>
|
||||
<input type="checkbox" name="enabled" value="1" <!--#if $filter[6] == '1' then 'checked="checked"' else ""#--> />
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="new_index" value="$fnum" size="1" />
|
||||
</td>
|
||||
<td>
|
||||
<select name="filter_type">
|
||||
<option value="A" <!--#if $filter[3] == "A" then 'selected="selected"' else ""#-->> $T('rss-accept')</option>
|
||||
<option value="M" <!--#if $filter[3] == "M" then 'selected="selected"' else ""#-->> $T('rss-must')</option>
|
||||
<option value="R" <!--#if $filter[3] == "R" then 'selected="selected"' else ""#-->> $T('rss-reject')</option>
|
||||
<option value="C" <!--#if $filter[3] == "C" then 'selected="selected"' else ""#-->> $T('rss-mustcat')</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="filter_text" value="$filter[4]" size="25" />
|
||||
</td>
|
||||
<!--#if $rss[$feed]['pick_cat']#-->
|
||||
<td>
|
||||
<select name="cat">
|
||||
<!--#for $ct in $cat_list#-->
|
||||
<option value="$ct" <!--#if $ct == $filter[0] then 'selected="selected"' else ""#-->>$Tspec($ct)</option><!--#slurp#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</td>
|
||||
<!--#end if#-->
|
||||
<td>
|
||||
<select name="priority">
|
||||
<option value="-100" <!--#if $filter[5] == "-100" then 'selected="selected"' else ""#-->>$T('default')</option>
|
||||
<option value="2" <!--#if $filter[5] == "2" then 'selected="selected"' else ""#-->>$T('pr-force')</option>
|
||||
<option value="1" <!--#if $filter[5] == "1" then 'selected="selected"' else ""#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $filter[5] == "0" then 'selected="selected"' else ""#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $filter[5] == "-1" then 'selected="selected"' else ""#-->>$T('pr-low')</option>
|
||||
<option value="-2" <!--#if $filter[5] == "-2" then 'selected="selected"' else ""#-->>$T('pr-paused')</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<select name="pp">
|
||||
<option value="" <!--#if $filter[1] == "" then 'selected="selected"' else ""#-->>$T('default')</option>
|
||||
<option value="0" <!--#if $filter[1] == "0" then 'selected="selected"' else ""#-->>$T('pp-none')</option>
|
||||
<option value="1" <!--#if $filter[1] == "1" then 'selected="selected"' else ""#-->>$T('pp-repair')</option>
|
||||
<option value="2" <!--#if $filter[1] == "2" then 'selected="selected"' else ""#-->>$T('pp-unpack')</option>
|
||||
<option value="3" <!--#if $filter[1] == "3" then 'selected="selected"' else ""#-->>$T('pp-delete')</option>
|
||||
</select>
|
||||
</td>
|
||||
<!--#if $rss[$feed]['pick_script']#-->
|
||||
<td>
|
||||
<select name="script">
|
||||
<!--#for $sc in $script_list#-->
|
||||
<option value="$sc" <!--#if $sc == $filter[2] then 'selected="selected"' else ""#-->>$Tspec($sc)</option><!--#slurp#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</td>
|
||||
<!--#end if#-->
|
||||
<td>
|
||||
<input type="submit" class="Save" value="$T('button-save')" />
|
||||
<input type="button" class="delFilter" value="$T('button-x')" />
|
||||
<!--#if not $rss[$feed].filter_states[$fnum]#--> $T('Incorrect filter')<!--#end if#-->
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<!--#set $fnum = $fnum+1#-->
|
||||
<!--#end for#-->
|
||||
|
||||
<form action="download_rss_feed" method="post">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="feed" value="$feed" />
|
||||
<div class="padding">
|
||||
<input type="button" class="testFeed" value="$T('button-preFeed')" rel="$feed" />
|
||||
<input type="submit" value="$T('button-forceFeed')" />
|
||||
<input type="button" class="cleanFeed" value="$T('button-clear') $T('link-download')" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<div style="padding-left: 10px; border-bottom: 1px solid #DFDEDE;">
|
||||
<ul class="tabs">
|
||||
<li><a href="#">$T('rss-matched') <span class="count"><!--#echo len($matched)#--></span></a></li>
|
||||
<li><a href="#">$T('rss-notMatched') <span class="count"><!--#echo len($unmatched)#--></span></a></li>
|
||||
<li><a href="#">$T('rss-done') <span class="count"><!--#echo len($downloaded)#--></span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="tab-content padTable">
|
||||
<!--#if $matched#-->
|
||||
<table class="catTable">
|
||||
|
||||
<!--#set $odd = False#--><!--#slurp#-->
|
||||
<!--#set $cur = 0#--><!--#slurp#-->
|
||||
<!--#for $job in $matched#--><!--#slurp#-->
|
||||
<!--#set $odd = not $odd#--><!--#slurp#-->
|
||||
<!--#set $cur = $cur+1#--><!--#slurp#-->
|
||||
|
||||
<!--#if $cur == 1#-->
|
||||
<thead>
|
||||
<tr>
|
||||
<th>$T('link-download')</th>
|
||||
<th>$T('rss-skip')</th>
|
||||
<th>$T('rss-filter')</th>
|
||||
<th>$T('sort-title')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!--#end if#-->
|
||||
<tr class="infoTableSeperator <!--#if $odd then "alt" else ""#-->">
|
||||
<td>
|
||||
<form action="download" method="get">
|
||||
<input type="hidden" value="$feed" name="feed" />
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="url" value="$job[0]" />
|
||||
<input type="hidden" name="nzbname" value="$job[4]" />
|
||||
<input type="submit" value="$T('link-download')" />
|
||||
</form>
|
||||
</td>
|
||||
<td class="align-center">$job[2]</td>
|
||||
<td class="align-center">
|
||||
<span>$job[3]</span>
|
||||
</td>
|
||||
<td>$job[1]</td>
|
||||
</tr>
|
||||
<!--#end for#-->
|
||||
</table>
|
||||
|
||||
<!--#else#-->
|
||||
$T('none')
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
|
||||
<div class="tab-content padTable">
|
||||
<!--#if $unmatched#-->
|
||||
<table class="catTable">
|
||||
|
||||
<!--#set $odd = False#--><!--#slurp#-->
|
||||
<!--#set $cur = 0#--><!--#slurp#-->
|
||||
<!--#for $job in $unmatched#--><!--#slurp#-->
|
||||
<!--#set $odd = not $odd#--><!--#slurp#-->
|
||||
<!--#set $cur = $cur+1#--><!--#slurp#-->
|
||||
|
||||
<!--#if $cur == 1#-->
|
||||
<thead>
|
||||
<tr>
|
||||
<th>$T('link-download')</th>
|
||||
<th>$T('rss-skip')</th>
|
||||
<th>$T('rss-filter')</th>
|
||||
<th>$T('sort-title')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!--#end if#-->
|
||||
<tr class="infoTableSeperator <!--#if $odd then "alt" else ""#-->">
|
||||
<td>
|
||||
<form action="download" method="get">
|
||||
<input type="hidden" value="$feed" name="feed" />
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="url" value="$job[0]" />
|
||||
<input type="hidden" name="nzbname" value="$job[4]" />
|
||||
<input type="submit" value="$T('link-download')" />
|
||||
</form>
|
||||
</td>
|
||||
<td class="align-center">$job[2]</td>
|
||||
<td class="align-center">
|
||||
<span>$job[3]</span>
|
||||
</td>
|
||||
<td>$job[1]</td>
|
||||
</tr>
|
||||
<!--#end for#-->
|
||||
</table>
|
||||
|
||||
<!--#else#-->
|
||||
$T('none')
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
|
||||
|
||||
<div class="tab-content padTable">
|
||||
<!--#if $downloaded#-->
|
||||
<form action="clean_rss_jobs" method="post">
|
||||
<input type="hidden" value="$feed" name="feed" />
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<table class="catTable">
|
||||
|
||||
<!--#set $odd = False#--><!--#slurp#-->
|
||||
<!--#set $cur = 0#--><!--#slurp#-->
|
||||
<!--#for $job in $downloaded#--><!--#slurp#-->
|
||||
<!--#set $odd = not $odd#--><!--#slurp#-->
|
||||
<!--#set $cur = $cur+1#--><!--#slurp#-->
|
||||
|
||||
<!--#if $cur == 1#-->
|
||||
<thead>
|
||||
<tr>
|
||||
<th>$T('sort-title')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!--#end if#-->
|
||||
<tr class="infoTableSeperator <!--#if $odd then "alt" else ""#-->">
|
||||
<td>$job</td>
|
||||
</tr>
|
||||
<!--#end for#-->
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<!--#else#-->
|
||||
$T('none')
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
|
||||
<!--#end if#-->
|
||||
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script>
|
||||
function urlencode(str) {
|
||||
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
|
||||
}
|
||||
|
||||
\$(document).ready(function(){
|
||||
\$('.editFeed').click(function(){
|
||||
var oldURI = \$(this).prev().val();
|
||||
var newURI = prompt("$T('feed') URL", oldURI );
|
||||
if(newURI != "" && newURI !== null) {
|
||||
var whichFeed = \$(this).attr("rel");
|
||||
\$.ajax({
|
||||
type: "POST",
|
||||
url: "save_rss_feed",
|
||||
data: {feed: whichFeed, uri: newURI, session: "$session" }
|
||||
}).done(function( msg ) {
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
\$('.delFeed').click(function(e){
|
||||
e.preventDefault();
|
||||
if ( confirm("$T('confirm')") ) {
|
||||
var whichFeed = \$(this).attr("rel");
|
||||
\$.ajax({
|
||||
type: "POST",
|
||||
url: "del_rss_feed",
|
||||
data: {feed: whichFeed, session: "$session" }
|
||||
}).done(function( msg ) {
|
||||
location.reload();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
\$('.testFeed').click(function(){
|
||||
var whichFeed = \$(this).attr("rel");
|
||||
\$.ajax({
|
||||
type: "POST",
|
||||
url: "test_rss_feed",
|
||||
data: {feed: whichFeed, session: "$session" }
|
||||
}).done(function( msg ) {
|
||||
location = '?feed=' + urlencode(whichFeed);
|
||||
// location.reload();
|
||||
});
|
||||
});
|
||||
|
||||
\$('.toggleFeedCheckbox').click(function(){
|
||||
var whichFeed = \$(this).attr("rel");
|
||||
\$.ajax({
|
||||
type: "POST",
|
||||
url: "toggle_rss_feed",
|
||||
data: {feed: whichFeed, session: "$session" }
|
||||
}).done(function() {
|
||||
location.reload();
|
||||
});
|
||||
});
|
||||
|
||||
\$('.cleanFeed').click(function(){
|
||||
var theForm = \$(this).closest("form");
|
||||
theForm.attr("action", "clean_rss_jobs").submit();
|
||||
});
|
||||
\$('.delFilter').click(function(){
|
||||
var theForm = \$(this).closest("form");
|
||||
theForm.attr("action", "del_rss_filter").submit();
|
||||
});
|
||||
\$(function() {
|
||||
\$("ul.tabs").tabs("div.tab-content");
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,100 +0,0 @@
|
||||
<!--#set global $pane="Scheduling"#-->
|
||||
<!--#set global $help_uri="configure-scheduling-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<%
|
||||
import time
|
||||
t = time.localtime()
|
||||
hour = t[3]
|
||||
if hour != 23:
|
||||
hour += 1
|
||||
else:
|
||||
hour = 0
|
||||
%>
|
||||
|
||||
<div class="colmask">
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('addSchedule')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<form action="addSchedule" method="post">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="hour">$T('hour').capitalize() : $T('minute').capitalize()</label>
|
||||
<select name="hour" id="hour">
|
||||
<!--#for $i in range(24)#-->
|
||||
<option value="$i" <!--#if hour == i then 'selected="selected"' else ""#--> > $str($i).zfill(2) </option>
|
||||
<!--#end for#-->
|
||||
</select> <b>:</b> <select name="minute" id="minute">
|
||||
<!--#for $i in range(60)#-->
|
||||
<option value="$i"> $str($i).zfill(2) </option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="daysofweek">$T('sch-frequency')</label>
|
||||
<div class="checkbox-days">
|
||||
<p><input type="checkbox" name="daysofweek" value="1"><label>$T('monday')</label></p>
|
||||
<p><input type="checkbox" name="daysofweek" value="2"><label>$T('tuesday')</label></p>
|
||||
<p><input type="checkbox" name="daysofweek" value="3"><label>$T('wednesday')</label></p>
|
||||
<p><input type="checkbox" name="daysofweek" value="4"><label>$T('thursday')</label></p>
|
||||
<p><input type="checkbox" name="daysofweek" value="5"><label>$T('friday')</label></p>
|
||||
<p><input type="checkbox" name="daysofweek" value="6"><label>$T('saturday')</label></p>
|
||||
<p><input type="checkbox" name="daysofweek" value="7"><label>$T('sunday')</label></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="action">$T('sch-action')</label>
|
||||
<select name="action" id="action">
|
||||
<!--#for $action in $actions#-->
|
||||
<option value="$action">$actions_lng[$action]</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="arguments">$T('sch-arguments')</label>
|
||||
<input type="text" name="arguments" id="arguments" value="" size="20" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-addSchedule')" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
</form>
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('currentSchedules')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<!--#if $schedlines#-->
|
||||
<!--#set $schednum = 0#-->
|
||||
<!--#set $odd = True#-->
|
||||
<!--#for $line in $schedlines#-->
|
||||
<!--#set $odd = not $odd#-->
|
||||
<form action="delSchedule" method="post">
|
||||
<input type="hidden" name="session" id="session" value="$session">
|
||||
<input type="hidden" name="line" id="line" value="$line"/>
|
||||
<div class="field-pair infoTableSeperator<!--#if $odd then "" else " alt"#-->">
|
||||
<input class="float-left" type="submit" value="$T('button-x')" />
|
||||
<div class="scheduleEntry">
|
||||
<span class="time">$taskinfo[$schednum][1]:$taskinfo[$schednum][2]</span><span class="frequency">$taskinfo[$schednum][3]</span> <span class="darkred">$taskinfo[$schednum][4]</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<!--#set $schednum = $schednum+1#-->
|
||||
<!--#end for#-->
|
||||
<!--#else#-->
|
||||
<div class="field-pair">
|
||||
<label class="config">$T('none')</label>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,220 +0,0 @@
|
||||
<!--#set global $pane="Servers"#-->
|
||||
<!--#set global $help_uri="configure-servers-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="addServer" method="post" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<div id="addServer">
|
||||
<div class="padding alt">
|
||||
<input type="button" value="$T('button-addServer')" id="addServerButton" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="addServerContent" style="display: none;">
|
||||
<div class="col2">
|
||||
<h3>$T('addServer')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="enable">$T('srv-enable')</label>
|
||||
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
|
||||
<span class="desc">$T('srv-enable')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host" size="40" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="port">$T('srv-port')</label>
|
||||
<input type="text" name="port" id="port" size="8" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="username">$T('srv-username')</label>
|
||||
<input type="text" name="username" id="username" size="30" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="password">$T('srv-password')</label>
|
||||
<input type="password" name="password" id="password" size="30" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections" size="8" min="0" max="100" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="retention">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention" size="8" min="0" /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="timeout">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout" size="8" min="30" /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
<div class="field-pair alt <!--#if int($have_ssl) == 0 then "disabled" else ""#-->">
|
||||
<label class="config" for="ssl">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl" value="1" <!--#if int($have_ssl) == 0 then "disabled=\"disabled\"" else ""#--> />
|
||||
<span class="desc">$T('srv-ssl')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="fillserver">$T('srv-fillserver')</label>
|
||||
<input type="checkbox" name="fillserver" id="fillserver" value="1" />
|
||||
<span class="desc">$T('srv-fillserver')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="optional">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional" value="1" />
|
||||
<span class="desc">$T('srv-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-addServer')" />
|
||||
<input type="button" value="$T('button-testServer')" class="testServer" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
</form>
|
||||
|
||||
<!--#set $slist = $servers.keys()#-->
|
||||
<!--#$slist.sort()#-->
|
||||
<!--#set $cur = 0#-->
|
||||
<!--#for $server in $slist#-->
|
||||
<!--#set $cur = $cur + 1#-->
|
||||
|
||||
<form action="saveServer" method="post" id="fullform" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="server" value="$server" />
|
||||
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$servers[$server]['name']</h3>
|
||||
<p>
|
||||
<table><tr>
|
||||
<td><input type="checkbox" class="toggleServerCheckbox" name="q_enable" value="1" <!--#if int($servers[$server]['enable']) != 0 then 'checked="checked"' else ""#--> rel="$server" /></td>
|
||||
<td> $T('enabled')</td>
|
||||
</tr></table>
|
||||
</p>
|
||||
<input type="button" value="$T('button-clrServer')" class="clrServer" />
|
||||
<input type="button" value="$T('showDetails')" class="showserver" />
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1" style="display:none;">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="enable$cur">$T('srv-enable')</label>
|
||||
<input type="checkbox" name="enable" id="enable$cur" value="1" <!--#if int($servers[$server]['enable']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('srv-enable')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host$cur">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host$cur" value="$servers[$server]['host']" size="40" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="port$cur">$T('srv-port')</label>
|
||||
<input type="text" name="port" id="port$cur" value="$servers[$server]['port']" size="8" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="username$cur">$T('srv-username')</label>
|
||||
<input type="text" name="username" id="username$cur" value="$servers[$server]['username']" size="30" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="password$cur">$T('srv-password')</label>
|
||||
<input type="password" name="password" id="password$cur" value="$servers[$server]['password']" size="30" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections$cur">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections$cur" value="$servers[$server]['connections']" size="8" min="0" max="100" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="retention$cur">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention$cur" value="$servers[$server]['retention']" size="8" min="0" /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="timeout$cur">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout$cur" value="$servers[$server]['timeout']" size="8" min="30" /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
<div class="field-pair alt <!--#if int($have_ssl) == 0 then "disabled" else ""#-->">
|
||||
<label class="config" for="ssl$cur">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl$cur" value="1" <!--#if int($servers[$server]['ssl']) != 0 and int($have_ssl) == 1 then 'checked="checked"' else ""#--> <!--#if int($have_ssl) == 0 then "disabled=\"disabled\"" else ""#--> />
|
||||
<span class="desc">$T('srv-ssl')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="fillserver$cur">$T('srv-fillserver')</label>
|
||||
<input type="checkbox" name="fillserver" id="fillserver$cur" value="1" <!--#if int($servers[$server]['fillserver']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('srv-fillserver')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="optional$cur">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional$cur" value="1" <!--#if int($servers[$server]['optional']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('srv-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-testServer')" class="testServer" />
|
||||
<input type="button" value="$T('button-delServer')" class="delServer" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
<div class="col2" style="display:block;">
|
||||
<!--#if 'amounts' in $servers[$server]#-->
|
||||
<b>$T('srv-bandwidth'):</b><br/>
|
||||
$T('total'): $(servers[$server]['amounts'][0])B<br/>
|
||||
$T('today'): $(servers[$server]['amounts'][3])B<br/>
|
||||
$T('thisWeek'): $(servers[$server]['amounts'][2])B<br/>
|
||||
$T('thisMonth'): $(servers[$server]['amounts'][1])B
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
</div><!-- /section -->
|
||||
</form>
|
||||
<!--#end for#-->
|
||||
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script>
|
||||
\$(document).ready(function(){
|
||||
\$('.showserver').click(function () {
|
||||
\$(this).parent().next().toggle();
|
||||
\$(this).parent().next().next().toggle();
|
||||
if (\$(this).attr("value") == "$T('showDetails')") {
|
||||
\$(this).attr("value", "$T('hideDetails')");
|
||||
} else {
|
||||
\$(this).attr("value", "$T('showDetails')");
|
||||
}
|
||||
});
|
||||
\$('#addServerButton').click(function(){
|
||||
\$('#addServer').hide();
|
||||
\$('#addServerContent').show();
|
||||
});
|
||||
\$('.testServer').click(function(event){
|
||||
\$(this).attr("disabled", "disabled")
|
||||
\$.ajax({
|
||||
type: "POST",
|
||||
url: "../../tapi",
|
||||
data: "mode=config&name=test_server&" + \$(this).parents('form:first').serialize() + "&apikey=" + \$('#apikey').val(),
|
||||
success: function(msg){
|
||||
alert(msg);
|
||||
\$(event.target).removeAttr("disabled")
|
||||
}
|
||||
});
|
||||
});
|
||||
\$('.delServer').click(function(){
|
||||
if( confirm("$T('Plush-confirm')") )
|
||||
\$(this).parents('form:first').attr('action','delServer').submit();
|
||||
return false;
|
||||
});
|
||||
\$('.clrServer').click(function(){
|
||||
if( confirm("$T('Plush-confirm')") )
|
||||
\$(this).parents('form:first').attr('action','clrServer').submit();
|
||||
return false;
|
||||
});
|
||||
\$('.toggleServerCheckbox').click(function(){
|
||||
var whichServer = \$(this).attr("rel");
|
||||
\$.ajax({
|
||||
type: "POST",
|
||||
url: "toggleServer",
|
||||
data: {server: whichServer, session: "$session" }
|
||||
}).done(function() {
|
||||
location.reload();
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,543 +0,0 @@
|
||||
<!--#set global $pane="Sorting"#-->
|
||||
<!--#set global $help_uri="configure-sorting-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveSorting" method="post" name="fullform" id="fullform">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<input id="complete_dir" type="hidden" value="$complete_dir" />
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('seriesSorting')</h3>
|
||||
<p>
|
||||
<b>$T('affectedCat')</b><br/>
|
||||
<select name="tv_cat" multiple="multiple" class="multiple_cats">
|
||||
<!--#for $ct in $cat_list#-->
|
||||
<option value="$ct" <!--#if $ct in $tv_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<h5 class="darkred nomargin">$T('ft-download'): <span class="path">$complete_dir</span></h5>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config wide" for="enable_tv_sorting">$T('opt-tvsort')</label>
|
||||
<input type="checkbox" name="enable_tv_sorting" id="enable_tv_sorting" value="1" <!--#if int($enable_tv_sorting) > 0 then 'checked="checked"' else ""#--> />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="tvfoldername">$T('sortString')</label>
|
||||
<input type="text" id="tvfoldername" name="tv_sort_string" value="$tv_sort_string" size="50" />
|
||||
<input type="button" value="$T('button-clear')" class="clearBtn" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config">$T('presetSort')</label>
|
||||
<div class="presets float-left">
|
||||
<input type="button" onclick="tvSet('%sn/Season %s/%sn - %sx%0e - %en.%ext')" value="$T('button-Season1x05')" />
|
||||
<input type="button" onclick="tvSet('%sn/Season %s/%sn - S%0sE%0e - %en.%ext')" value="$T('button-SeasonS01E05')" /><br/>
|
||||
<input type="button" onclick="tvSet('%sn/%sx%0e - %en/%sn - %sx%0e - %en.%ext')" value="$T('button-Ep1x05')" />
|
||||
<input type="button" onclick="tvSet('%sn/S%0sE%0e - %en/%sn - S%0sE%0e - %en.%ext')" value="$T('button-EpS01E05')" />
|
||||
</div>
|
||||
</div>
|
||||
<div id="previewtv" class="example">
|
||||
<div class="field-pair">
|
||||
<label class="config" for="tvsamplename">Test Data</label>
|
||||
<input type="text" id="tvsamplename" name="tvsamplename" placeholder="$T('show-name') S01E05 - $T('ep-name') [DTS]" size="50" />
|
||||
<input type="button" value="$T('button-clear')" class="clearBtn" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config">$T('sortResult')</label>
|
||||
<span class="desc path" id="previewtv-result"> </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config">$T('sort-legenda')</label>
|
||||
<input type="button" value="$T('sort-legenda')" onclick="jQuery(this).hide(); jQuery('#Key1').show();" />
|
||||
<table id="Key1" class="Key">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="align-right">$T('sort-meaning')</th>
|
||||
<th>$T('sort-pattern')</th>
|
||||
<th>$T('sort-result')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('show-name'):</b></td>
|
||||
<td>%sn</td>
|
||||
<td>$T('show-sp-name')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%s.n</td>
|
||||
<td>$T('show-dot-name')</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>%s_n</td>
|
||||
<td>$T('show-us-name')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('show-name'):</b></td>
|
||||
<td>%sN</td>
|
||||
<td>$T('show-sp-name') ($T('case-adjusted'))</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>%s.N</td>
|
||||
<td>$T('show-dot-name') ($T('case-adjusted'))</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%s_N</td>
|
||||
<td>$T('show-us-name') ($T('case-adjusted'))</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('show-seasonNum'):</b></td>
|
||||
<td>%s</td>
|
||||
<td>1</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%0s</td>
|
||||
<td>01</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('show-epNum'):</b></td>
|
||||
<td>%e</td>
|
||||
<td>5</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%0e</td>
|
||||
<td>05</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('ep-name'):</b></td>
|
||||
<td>%en</td>
|
||||
<td>$T('ep-sp-name')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%e.n</td>
|
||||
<td>$T('ep-dot-name')</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>%e_n</td>
|
||||
<td>$T('ep-us-name')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('fileExt'):</b></td>
|
||||
<td>%ext</td>
|
||||
<td>avi</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('orgFilename'):</b></td>
|
||||
<td>%fn</td>
|
||||
<td>$T("sort-File")</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('orgDirname'):</b></td>
|
||||
<td>%dn</td>
|
||||
<td>$T("sort-Folder")</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('lowercase'):</b></td>
|
||||
<td>{$T('TEXT')}</td>
|
||||
<td>$T('text')</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('genericSort')</h3>
|
||||
<p>
|
||||
<b>$T('affectedCat')</b><br/>
|
||||
<select name="movie_cat" multiple="multiple" class="multiple_cats">
|
||||
<!--#for $ct in $cat_list#-->
|
||||
<option value="$ct" <!--#if $ct in $movie_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<h5 class="darkred nomargin">$T('ft-download'): <span class="path">$complete_dir</span></h5>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config wide" for="enable_movie_sorting">$T('opt-movieSort')</label>
|
||||
<input type="checkbox" name="enable_movie_sorting" id="enable_movie_sorting" value="1" <!--#if int($enable_movie_sorting) > 0 then 'checked="checked"' else ""#--> />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config wide" for="movie_extra_folder">$T('opt-movieExtra')</label>
|
||||
<input type="checkbox" name="movie_extra_folder" id="movie_extra_folder" value="1" <!--#if int($movie_extra_folder) > 0 then 'checked="checked"' else ""#--> />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="moviefoldername">$T('sortString')</label>
|
||||
<input type="text" name="movie_sort_string" id="moviefoldername" value="$movie_sort_string" size="50" />
|
||||
<input type="button" value="$T('button-clear')" class="clearBtn" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="movieextra">$T('multiPartLabel')</label>
|
||||
<input type="text" name="movie_sort_extra" id="movieextra" value="$movie_sort_extra" size="50" />
|
||||
<input type="button" value="$T('button-clear')" class="clearBtn" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config">$T('presetSort')</label>
|
||||
<div class="presets float-left">
|
||||
<input type="button" onclick="movieSet('%title (%y)/%title (%y).%ext',' CD%1');movieExtraFolder(false)" value="$T('button-inFolders')" />
|
||||
<input type="button" onclick="movieSet('%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="$T('button-noFolders')" />
|
||||
<input type="button" onclick="movieSet('%0decade/%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="Decades 1" />
|
||||
</div>
|
||||
</div>
|
||||
<div id="previewmovie" class="example">
|
||||
<div class="field-pair">
|
||||
<label class="config" for="moviesamplename">Test Data</label>
|
||||
<input type="text" id="moviesamplename" name="moviesamplename" placeholder="$T('movie-sp-name') (2009)" size="50" />
|
||||
<input type="button" value="$T('button-clear')" class="clearBtn" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config">$T('sortResult')</label>
|
||||
<span class="desc path" id="previewmovie-result"> </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config">$T('sort-legenda')</label>
|
||||
<input type="button" value="$T('sort-legenda')" onclick="jQuery(this).hide(); jQuery('#Key2').show();" />
|
||||
<table id="Key2" class="Key">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="align-right">$T('sort-meaning')</th>
|
||||
<th>$T('sort-pattern')</th>
|
||||
<th>$T('sort-result')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('sort-title'):</b></td>
|
||||
<td>%title</td>
|
||||
<td>$T('movie-sp-name')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%.title</td>
|
||||
<td>$T('movie-dot-name')</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>%_title</td>
|
||||
<td>$T('movie-us-name')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('year'):</b></td>
|
||||
<td>%y</td>
|
||||
<td>2009</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('extension'):</b></td>
|
||||
<td>%ext</td>
|
||||
<td>avi</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('decade'):</b></td>
|
||||
<td>%decade</td>
|
||||
<td>00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>%0decade</td>
|
||||
<td>2000</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('orgFilename'):</b></td>
|
||||
<td>%fn</td>
|
||||
<td>$T('sort-File')</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('orgDirname'):</b></td>
|
||||
<td>%dn</td>
|
||||
<td>$T("sort-Folder")</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('lowercase'):</b></td>
|
||||
<td>{$T('TEXT')}</td>
|
||||
<td>$T('text')</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class="align-right"><b>$T('multiPartLabel')</b></th>
|
||||
<th>$T('sort-pattern')</th>
|
||||
<th>$T('sort-result')</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('partNumber'):</b></td>
|
||||
<td>%1</td>
|
||||
<td>1</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('dateSorting')</h3>
|
||||
<p>
|
||||
<b>$T('affectedCat')</b><br/>
|
||||
<select name="date_cat" multiple="multiple" class="multiple_cats">
|
||||
<!--#for $ct in $cat_list#-->
|
||||
<option value="$ct" <!--#if $ct in $date_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</p>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<h5 class="darkred nomargin">$T('ft-download'): <span class="path">$complete_dir</span></h5>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config wide" for="enable_date_sorting">$T('opt-dateSort')</label>
|
||||
<input type="checkbox" name="enable_date_sorting" id="enable_date_sorting" value="1" <!--#if int($enable_date_sorting) > 0 then 'checked="checked"' else ""#--> />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="datefoldername">$T('sortString')</label>
|
||||
<input type="text" name="date_sort_string" id="datefoldername" value="$date_sort_string" size="50" />
|
||||
<input type="button" value="$T('button-clear')" class="clearBtn" />
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config">$T('presetSort')</label>
|
||||
<div class="presets float-left">
|
||||
<input type="button" onclick="dateSet('%t/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-ShowNameF')" />
|
||||
<input type="button" onclick="dateSet('%y-%0m/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-YMF')" />
|
||||
<input type="button" onclick="dateSet('%y-%0m-%0d/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-DailyF')" />
|
||||
</div>
|
||||
</div>
|
||||
<div id="previewdate" class="example">
|
||||
<div class="field-pair">
|
||||
<label class="config" for="datesamplename">Test Data</label>
|
||||
<input type="text" id="datesamplename" name="datesamplename" placeholder="$T('show-name') 2009-01-02" size="50" />
|
||||
<input type="button" value="$T('button-clear')" class="clearBtn" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config">$T('sortResult')</label>
|
||||
<span class="desc path" id="previewdate-result"> </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config">$T('sort-legenda')</label>
|
||||
<input type="button" value="$T('sort-legenda')" onclick="jQuery(this).hide(); jQuery('#Key3').show();" />
|
||||
<table id="Key3" class="Key">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="align-right">$T('sort-meaning')</th>
|
||||
<th>$T('sort-pattern')</th>
|
||||
<th>$T('sort-result')</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('show-name'):</b></td>
|
||||
<td>%t</td>
|
||||
<td>$T('show-sp-name')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%.t</td>
|
||||
<td>$T('show-dot-name')</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>%_t</td>
|
||||
<td>$T('show-us-name')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('year'):</b></td>
|
||||
<td>%y</td>
|
||||
<td>2009</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('month'):</b></td>
|
||||
<td>%m</td>
|
||||
<td>1</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%0m</td>
|
||||
<td>01</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('day-of-month'):</b></td>
|
||||
<td>%d</td>
|
||||
<td>2</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%0d</td>
|
||||
<td>02</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('decade'):</b></td>
|
||||
<td>%decade</td>
|
||||
<td>00</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td> </td>
|
||||
<td>%0decade</td>
|
||||
<td>2000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="align-right"><b>$T('orgFilename'):</b></td>
|
||||
<td>%fn</td>
|
||||
<td>$T('sort-File')</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="align-right"><b>$T('lowercase'):</b></td>
|
||||
<td>{$T('TEXT')}</td>
|
||||
<td>$T('text')</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="padding alt">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script>
|
||||
// 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;
|
||||
return function(callback, ms){
|
||||
clearTimeout (timer);
|
||||
timer = setTimeout(callback, ms);
|
||||
}
|
||||
})();
|
||||
|
||||
function tvSet(val) {
|
||||
\$('#tvfoldername').val(val);
|
||||
new_previewtv();
|
||||
}
|
||||
|
||||
function movieSet(val, val2) {
|
||||
\$('#moviefoldername').val(val);
|
||||
\$('#movieextra').val(val2);
|
||||
new_previewmovie();
|
||||
}
|
||||
|
||||
function movieExtraFolder(value) {
|
||||
\$('#movie_extra_folder').attr("checked", value);
|
||||
}
|
||||
|
||||
function dateSet(val) {
|
||||
\$('#datefoldername').val(val);
|
||||
new_previewdate();
|
||||
}
|
||||
|
||||
function new_previewtv() {
|
||||
var \$tvsortstring = \$('#tvfoldername').val();
|
||||
if(\$tvsortstring.length > 2) {
|
||||
typewatch(function () {
|
||||
\$('#previewtv').show();
|
||||
\$('#previewtv-result').addClass("loading");
|
||||
\$.ajax({
|
||||
type: "GET",
|
||||
url: "../../tapi",
|
||||
data: {mode:'eval_sort', value: 'series', name: \$('#tvsamplename').val(), title: \$tvsortstring, apikey: '$session', output: 'json' },
|
||||
success: function(data){
|
||||
\$('#previewtv-result').removeClass("loading failure").html(data.result);
|
||||
},
|
||||
error: function(data){ \$('#previewtv-result').removeClass("loading").addClass("failure").html('need more information to process'); }
|
||||
});
|
||||
}, 500);
|
||||
}
|
||||
else
|
||||
\$('#previewtv').hide();
|
||||
}
|
||||
|
||||
function new_previewmovie() {
|
||||
var \$moviesortstring = \$('#moviefoldername').val();
|
||||
if(\$moviesortstring.length > 2) {
|
||||
typewatch(function () {
|
||||
\$('#previewmovie').show();
|
||||
\$('#previewmovie-result').addClass("loading");
|
||||
\$.ajax({
|
||||
type: "GET",
|
||||
url: "../../tapi",
|
||||
data: {mode:'eval_sort', value: 'generic', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
|
||||
success: function(data){
|
||||
\$('#previewmovie-result').removeClass("loading failure").html(data.result);
|
||||
},
|
||||
error: function(data){ \$('#previewmovie-result').removeClass("loading").addClass("failure").html('need more information to process'); }
|
||||
});
|
||||
}, 500);
|
||||
}
|
||||
else
|
||||
\$('#previewmovie').hide();
|
||||
}
|
||||
|
||||
function new_previewdate() {
|
||||
var \$datesortstring = \$('#datefoldername').val();
|
||||
if(\$datesortstring.length > 2) {
|
||||
typewatch(function () {
|
||||
\$('#previewdate').show();
|
||||
\$('#previewdate-result').addClass("loading");
|
||||
\$.ajax({
|
||||
type: "GET",
|
||||
url: "../../tapi",
|
||||
data: {mode:'eval_sort', value: 'date', name: \$('#datesamplename').val(), title: \$datesortstring, apikey: '$session', output: 'json' },
|
||||
success: function(data){
|
||||
\$('#previewdate-result').removeClass("loading failure").html(data.result);
|
||||
},
|
||||
error: function(data){ \$('#previewdate-result').removeClass("loading").addClass("failure").html('need more information to process'); }
|
||||
});
|
||||
}, 500);
|
||||
}
|
||||
else
|
||||
\$('#previewdate').hide();
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
\$(document).ready(function(){
|
||||
new_previewtv();
|
||||
new_previewmovie();
|
||||
new_previewdate();
|
||||
|
||||
\$('#tvfoldername, #tvsamplename').bind("keyup focus", new_previewtv);
|
||||
\$('#moviefoldername, #movieextra, #moviesamplename').bind("keyup focus", new_previewmovie);
|
||||
\$('#datefoldername, #datesamplename').bind("keyup focus", new_previewdate);
|
||||
\$('.clearBtn').click(function(){
|
||||
\$(this).prev().val('').focus();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,59 +0,0 @@
|
||||
<!--#set global $pane="Special"#-->
|
||||
<!--#set global $help_uri="configure+special-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveSpecial" method="post" name="fullform" id="fullform">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<div class="padTable">
|
||||
<h3 class="darkred nomargin">$T('explain-special')</h3>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('sptag-boolean')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<!--#set $odd = False#-->
|
||||
<!--#for $option in $switches#-->
|
||||
<!--#set $odd = not $odd#-->
|
||||
<div class="field-pair <!--#if $odd then "alt" else ""#-->">
|
||||
<label class="config wide" for="$option[0]">$option[0] ( <span class="path"><!--#if $option[2] then $T('on') else $T('off')#--></span> )</label>
|
||||
<input type="checkbox" name="$option[0]" id="$option[0]" value="1" <!--#if int($option[1]) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc"> </span>
|
||||
</div>
|
||||
<!--#end for#-->
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('sptag-entries')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<!--#set $odd = False#-->
|
||||
<!--#for $option in $entries#-->
|
||||
<!--#set $odd = not $odd#-->
|
||||
<div class="field-pair <!--#if $odd then "alt" else ""#-->">
|
||||
<label class="config narrow" for="$option[0]">$option[0] ( <span class="path">$option[2]</span> )</label>
|
||||
<input type="text" name="$option[0]" id="$option[0]" value="$option[1]" />
|
||||
</div>
|
||||
<!--#end for#-->
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="padding alt">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,306 +0,0 @@
|
||||
<!--#set global $pane="Switches"#-->
|
||||
<!--#set global $help_uri="configure-switches-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveSwitches" method="post" name="fullform" id="fullform">
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('swtag-general')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="check_new_rel">$T('opt-check_new_rel')</label>
|
||||
<select name="check_new_rel" id="check_new_rel">
|
||||
<option value="0" <!--#if $check_new_rel == 0 then 'selected="selected" class="selected"' else ""#--> >$T('off')</option>
|
||||
<option value="1" <!--#if $check_new_rel == 1 then 'selected="selected" class="selected"' else ""#--> >$T('on')</option>
|
||||
<option value="2" <!--#if $check_new_rel == 2 then 'selected="selected" class="selected"' else ""#--> >$T('also-test')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-check_new_rel')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="auto_browser">$T('opt-auto_browser')</label>
|
||||
<input type="checkbox" name="auto_browser" id="auto_browser" value="1" <!--#if int($auto_browser) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-auto_browser')</span>
|
||||
</div>
|
||||
<div class="field-pair alt <!--#if not $have_ampm then "disabled" else "" #-->">
|
||||
<label class="config" for="ampm">$T('opt-ampm')</label>
|
||||
<input type="checkbox" name="ampm" id="ampm" value="1" <!--#if int($ampm) > 0 then 'checked="checked"' else ""#--> <!--#if not $have_ampm then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-ampm')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('swtag-server')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="max_art_tries">$T('opt-max_art_tries')</label>
|
||||
<input type="number" name="max_art_tries" id="max_art_tries" value="$max_art_tries" size="8" min="2" />
|
||||
<span class="desc">$T('explain-max_art_tries')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="max_art_opt">$T('opt-max_art_opt')</label>
|
||||
<input type="checkbox" name="max_art_opt" id="max_art_opt" value="1" <!--#if int($max_art_opt) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-max_art_opt')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="auto_disconnect">$T('opt-auto_disconnect')</label>
|
||||
<input type="checkbox" name="auto_disconnect" id="auto_disconnect" value="1" <!--#if int($auto_disconnect) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-auto_disconnect')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="send_group">$T('opt-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group" value="1" <!--#if int($send_group) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-send_group')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="ssl_type">$T('opt-ssl_type')</label>
|
||||
<select name="ssl_type" id="ssl_type">
|
||||
<option value="v23" <!--#if $ssl_type == "v23" then 'selected="selected" class="selected"' else ""#--> >V23</option>
|
||||
<option value="v2" <!--#if $ssl_type == "v2" then 'selected="selected" class="selected"' else ""#--> >V2</option>
|
||||
<option value="v3" <!--#if $ssl_type == "v3" then 'selected="selected" class="selected"' else ""#--> >V3</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_type')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('swtag-queue')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="pre_check">$T('opt-pre_check')</label>
|
||||
<input type="checkbox" name="pre_check" id="pre_check" value="1" <!--#if int($pre_check) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-pre_check')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="no_dupes">$T('opt-no_dupes')</label>
|
||||
<select name="no_dupes" id="no_dupes">
|
||||
<option value="0" <!--#if int($no_dupes) == 0 then 'selected="selected" class="selected"' else ""#--> >$T('nodupes-off')</option>
|
||||
<option value="1" <!--#if int($no_dupes) == 1 then 'selected="selected" class="selected"' else ""#--> >$T('nodupes-ignore')</option>
|
||||
<option value="2" <!--#if int($no_dupes) == 2 then 'selected="selected" class="selected"' else ""#--> >$T('nodupes-pause')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-no_dupes')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="pause_on_post_processing">$T('opt-pause_on_post_processing')</label>
|
||||
<input type="checkbox" name="pause_on_post_processing" id="pause_on_post_processing" value="1" <!--#if int($pause_on_post_processing) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-pause_on_post_processing')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="pause_on_pwrar">$T('opt-pause_on_pwrar')</label>
|
||||
<input type="checkbox" name="pause_on_pwrar" id="pause_on_pwrar" value="1" <!--#if int($pause_on_pwrar) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-pause_on_pwrar')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="top_only">$T('opt-top_only')</label>
|
||||
<input type="checkbox" name="top_only" id="top_only" value="1" <!--#if int($top_only) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-top_only')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="auto_sort">$T('opt-auto_sort')</label>
|
||||
<input type="checkbox" name="auto_sort" id="auto_sort" value="1" <!--#if int($auto_sort) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-auto_sort')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="pre_script">$T('opt-pre_script')</label>
|
||||
<select name="pre_script" id="pre_script">
|
||||
<!--#for $sc in $script_list#-->
|
||||
<!--#if $sc.lower() == $pre_script.lower()#-->
|
||||
<option value="$sc" selected="selected" class="selected">$Tspec($sc)</option>
|
||||
<!--#else#-->
|
||||
<option value="$sc">$Tspec($sc)</option>
|
||||
<!--#end if#-->
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<span class="desc">$T('explain-pre_script')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('swtag-pp')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="ignore_samples">$T('opt-ignore_samples')</label>
|
||||
<select name="ignore_samples" id="ignore_samples">
|
||||
<option value="0" <!--#if int($ignore_samples) == 0 then 'selected="selected" class="selected"' else ""#--> >$T('igsam-off')</option>
|
||||
<option value="1" <!--#if int($ignore_samples) == 1 then 'selected="selected" class="selected"' else ""#--> >$T('igsam-del')</option>
|
||||
<option value="2" <!--#if int($ignore_samples) == 2 then 'selected="selected" class="selected"' else ""#--> >$T('igsam-not')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ignore_samples')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="quick_check">$T('opt-quick_check')</label>
|
||||
<input type="checkbox" name="quick_check" id="quick_check" value="1" <!--#if int($quick_check) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-quick_check')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="enable_unrar">$T('opt-enable_unrar')</label>
|
||||
<input type="checkbox" name="enable_unrar" id="enable_unrar" value="1" <!--#if int($enable_unrar) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-enable_unrar')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="enable_unzip">$T('opt-enable_unzip')</label>
|
||||
<input type="checkbox" name="enable_unzip" id="enable_unzip" value="1" <!--#if int($enable_unzip) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-enable_unzip')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="enable_filejoin">$T('opt-enable_filejoin')</label>
|
||||
<input type="checkbox" name="enable_filejoin" id="enable_filejoin" value="1" <!--#if int($enable_filejoin) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-enable_filejoin')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="enable_tsjoin">$T('opt-enable_tsjoin')</label>
|
||||
<input type="checkbox" name="enable_tsjoin" id="enable_tsjoin" value="1" <!--#if int($enable_tsjoin) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-ts_join')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="enable_par_cleanup">$T('opt-enable_par_cleanup')</label>
|
||||
<input type="checkbox" name="enable_par_cleanup" id="enable_par_cleanup" value="1" <!--#if int($enable_par_cleanup) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-enable_par_cleanup')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="fail_on_crc">$T('opt-fail_on_crc')</label>
|
||||
<input type="checkbox" name="fail_on_crc" id="fail_on_crc" value="1" <!--#if int($fail_on_crc) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-fail_on_crc')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="safe_postproc">$T('opt-safe_postproc')</label>
|
||||
<input type="checkbox" name="safe_postproc" id="safe_postproc" value="1" <!--#if int($safe_postproc) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-safe_postproc')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="sfv_check">$T('opt-sfv_check')</label>
|
||||
<input type="checkbox" name="sfv_check" id="sfv_check" value="1" <!--#if int($sfv_check) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-sfv_check')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="unpack_check">$T('opt-unpack_check')</label>
|
||||
<input type="checkbox" name="unpack_check" id="unpack_check" value="1" <!--#if int($unpack_check) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-unpack_check')</span>
|
||||
</div>
|
||||
<div class="field-pair <!--#if not $nt then "disabled" else "" #-->">
|
||||
<label class="config" for="par2_multicore">$T('opt-par2_multicore')</label>
|
||||
<input type="checkbox" name="par2_multicore" id="par2_multicore" value="1" <!--#if int($par2_multicore) > 0 then 'checked="checked"' else ""#--> <!--#if not $nt then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-par2_multicore')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="par_option">$T('opt-par_option')</label>
|
||||
<input type="text" name="par_option" id="par_option" value="$par_option" size="20" />
|
||||
<span class="desc">$T('explain-par_option')</span>
|
||||
</div>
|
||||
<div class="field-pair <!--#if not $have_nice then "disabled" else "" #-->">
|
||||
<label class="config" for="nice">$T('opt-nice')</label>
|
||||
<input type="text" name="nice" id="nice" value="$nice" size="20" <!--#if not $have_nice then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-nice')</span>
|
||||
</div>
|
||||
<div class="field-pair alt <!--#if not $have_ionice then "disabled" else "" #-->">
|
||||
<label class="config" for="ionice">$T('opt-ionice')</label>
|
||||
<input type="text" name="ionice" id="ionice" value="$ionice" size="20" <!--#if not $have_ionice then 'readonly="readonly" disabled="disabled"' else "" #--> />
|
||||
<span class="desc">$T('explain-ionice')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('swtag-naming')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="folder_rename">$T('opt-folder_rename')</label>
|
||||
<input type="checkbox" name="folder_rename" id="folder_rename" value="1" <!--#if int($folder_rename) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-folder_rename')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="replace_spaces">$T('opt-replace_spaces')</label>
|
||||
<input type="checkbox" name="replace_spaces" id="replace_spaces" value="1" <!--#if int($replace_spaces) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-replace_spaces')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="replace_dots">$T('opt-replace_dots')</label>
|
||||
<input type="checkbox" name="replace_dots" id="replace_dots" value="1" <!--#if int($replace_dots) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-replace_dots')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="replace_illegal">$T('opt-replace_illegal')</label>
|
||||
<input type="checkbox" name="replace_illegal" id="replace_illegal" value="1" <!--#if int($replace_illegal) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-replace_illegal')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="section">
|
||||
<div class="col2">
|
||||
<h3>$T('swtag-quota')</h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="quota_size">$T('opt-quota_size')</label>
|
||||
<input type="text" name="quota_size" id="quota_size" value="$quota_size" size="8" />
|
||||
<span class="desc">$T('explain-quota_size')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="quota_period">$T('opt-quota_period')</label>
|
||||
<select name="quota_period" id="quota_period">
|
||||
<option value="d" <!--#if $quota_period == "d" then 'selected="selected" class="selected"' else ""#--> >$T('day').capitalize()</option>
|
||||
<option value="w" <!--#if $quota_period == "w" then 'selected="selected" class="selected"' else ""#--> >$T('week').capitalize()</option>
|
||||
<option value="m" <!--#if $quota_period == "m" then 'selected="selected" class="selected"' else ""#--> >$T('month').capitalize()</option>
|
||||
<option value="x" <!--#if $quota_period == "x" then 'selected="selected" class="selected"' else ""#--> >$T('manual').capitalize()</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-quota_period')</span>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="config" for="quota_day">$T('opt-quota_day')</label>
|
||||
<input type="text" name="quota_day" id="quota_day" value="$quota_day" size="20" />
|
||||
<span class="desc">$T('explain-quota_day')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="quota_resume">$T('opt-quota_resume')</label>
|
||||
<input type="checkbox" name="quota_resume" id="quota_resume" value="1" <!--#if int($quota_resume) > 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-quota_resume')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
<div class="padding alt">
|
||||
<input type="submit" value="$T('button-saveChanges')" class="saveButton" />
|
||||
<input type="button" value="$T('button-restart') SABnzbd" class="sabnzbd_restart" />
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<!--#include $webdir + "/_inc_footer_uc.tmpl"#-->
|
||||
@@ -1,2 +0,0 @@
|
||||
/* This file was intentionally left blank and is only needed for 'skin' detection routine */
|
||||
/* https://github.com/thezoggy/sabnzbd-uni_Config */
|
||||
|
Before Width: | Height: | Size: 180 B |
|
Before Width: | Height: | Size: 180 B |
|
Before Width: | Height: | Size: 178 B |
|
Before Width: | Height: | Size: 120 B |
|
Before Width: | Height: | Size: 119 B |
|
Before Width: | Height: | Size: 141 B |
|
Before Width: | Height: | Size: 96 B |
|
Before Width: | Height: | Size: 128 B |
|
Before Width: | Height: | Size: 137 B |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 85 B |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 871 B |
|
Before Width: | Height: | Size: 872 B |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 52 B |
|
Before Width: | Height: | Size: 828 B |
@@ -4,7 +4,7 @@
|
||||
<!-- start Nzo footer -->
|
||||
#else#
|
||||
<!-- start other footer -->
|
||||
#if $pane!="Status" and $pane !="RSS"#</div>#end if#
|
||||
#if $pane!="Connections" and $pane !="RSS"#</div>#end if#
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#if $pane=="Status" or $pane=="Config"#
|
||||
#if $pane=="Connections" or $pane=="Config"#
|
||||
#set global $path = '../'#
|
||||
#else if $pane=="Main"#
|
||||
#set global $path = ''#
|
||||
@@ -9,7 +9,7 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>SABnzbd $version - $T('queued'): $mbleft $T('MB')</title>
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="${path}rss?mode=history"/>
|
||||
|
||||
@@ -83,16 +83,16 @@
|
||||
</ul>
|
||||
<ul class="menu" id="navigation_menu_left">
|
||||
<li#if $pane=="Main"# class="active first"#else# class="first"#end if#><a href="${path}"><span class="icon_nav_download">$T('Plush-downloads').capitalize()</span></a></li>
|
||||
<li#if $pane=="Status"# class="active"#end if#><a href="${path}status/"><span class="icon_nav_connections">$T('menu-cons').capitalize()</span></a></li>
|
||||
<li#if $pane=="RSS"# class="active"#end if#><a href="${path}config/rss/"><span class="icon_nav_rss">$T('rss').upper()</span></a></li>
|
||||
<li#if $pane!="RSS" and $pane!="Nzo" and ($pane=="Config" or $path=='../../')# class="active last"#else# class="last"#end if#><a href="${path}config/"><span class="icon_nav_config">$T('menu-config').capitalize()</span></a></li>
|
||||
<li#if $pane=="Connections"# class="active"#end if#><a href="${path}connections"><span class="icon_nav_connections">$T('menu-cons').capitalize()</span></a></li>
|
||||
<li#if $pane=="RSS"# class="active"#end if#><a href="${path}config/rss"><span class="icon_nav_rss">$T('rss').upper()</span></a></li>
|
||||
<li#if $pane!="RSS" and $pane!="Nzo" and ($pane=="Config" or $path=='../../')# class="active last"#else# class="last"#end if#><a href="${path}config"><span class="icon_nav_config">$T('menu-config').capitalize()</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="nav_text_right">
|
||||
#if $loadavg#$T('ft-sysload'): <span id="loadavg">$loadavg</span>#end if#
|
||||
</div>
|
||||
<div id="nav_text_left">
|
||||
<span id="warning_box"><b><a href="${path}status/#tabs-warnings" id="last_warning" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
|
||||
<span id="warning_box"><b><a href="${path}connections/#tabs-warnings" id="last_warning" title="#echo $last_warning.replace("\n"," ").replace('"',"'") #"><span id="have_warnings">$have_warnings</span> $T('warnings')</a></b></span>
|
||||
#if $pane=="Main"#
|
||||
#if $new_release#⋅ <a href="$new_rel_url" id="new_release" target="_blank">$T('Plush-updateAvailable').replace(' ',' ')</a>#end if#
|
||||
#if $warning#⋅ <a id="warning_message">$warning.replace(' ',' ')</a>#end if#
|
||||
@@ -105,37 +105,33 @@
|
||||
|
||||
#if $pane=="Main"#
|
||||
#else if $pane=="Nzo"#
|
||||
#else if $pane=="Status" or $pane =="RSS"#
|
||||
#else if $pane=="Connections" or $pane =="RSS"#
|
||||
<div id="config_container" class="config_margin_status lang-$active_lang">
|
||||
<div id="config_content">
|
||||
#else#
|
||||
#if $pane=="Status"#
|
||||
#if $pane=="Connections"#
|
||||
#else if $pane=="RSS"#
|
||||
#else#
|
||||
<div class="config_nav">
|
||||
<ul>
|
||||
<li><a class="#if $pane=="General"#nav_active#end if#" id="config_nav_general" href="${path}config/general/">
|
||||
<li><a class="#if $pane=="General"#nav_active#end if#" id="config_nav_general" href="${path}config/general">
|
||||
<div class="config_sprite_container sprite_config_nav_general">$T('cmenu-general')</div></a></li>
|
||||
<li><a class="#if $pane=="Folders"#nav_active#end if#" id="config_nav_directories" href="${path}config/folders/">
|
||||
<li><a class="#if $pane=="Folders"#nav_active#end if#" id="config_nav_directories" href="${path}config/directories">
|
||||
<div class="config_sprite_container sprite_config_nav_folders">$T('cmenu-folders')</div></a></li>
|
||||
<li><a class="#if $pane=="Switches"#nav_active#end if#" id="config_nav_switches" href="${path}config/switches/">
|
||||
<li><a class="#if $pane=="Switches"#nav_active#end if#" id="config_nav_switches" href="${path}config/switches">
|
||||
<div class="config_sprite_container sprite_config_nav_switches">$T('cmenu-switches')</div></a></li>
|
||||
<li><a class="#if $pane=="Servers"#nav_active#end if#" id="config_nav_server" href="${path}config/server/">
|
||||
<li><a class="#if $pane=="Servers"#nav_active#end if#" id="config_nav_server" href="${path}config/server">
|
||||
<div class="config_sprite_container sprite_config_nav_servers">$T('cmenu-servers')</div></a></li>
|
||||
<li><a class="#if $pane=="Scheduling"#nav_active#end if#" id="config_nav_scheduling" href="${path}config/scheduling/">
|
||||
<li><a class="#if $pane=="Scheduling"#nav_active#end if#" id="config_nav_scheduling" href="${path}config/scheduling">
|
||||
<div class="config_sprite_container sprite_config_nav_scheduling">$T('Plush-cmenu-scheduling')</div></a></li>
|
||||
<li><a class="#if $pane=="Email"#nav_active#end if#" id="config_nav_email" href="${path}config/notify/">
|
||||
<div class="config_sprite_container sprite_config_nav_email">$T('cmenu-notif')</div></a></li>
|
||||
<!--#if 0#-->
|
||||
<li><a class="#if $pane=="Index Sites"#nav_active#end if#" id="config_nav_index_sites" href="${path}config/indexers/">
|
||||
<li><a class="#if $pane=="Email"#nav_active#end if#" id="config_nav_email" href="${path}config/email">
|
||||
<div class="config_sprite_container sprite_config_nav_email">$T('cmenu-email')</div></a></li>
|
||||
<li><a class="#if $pane=="Index Sites"#nav_active#end if#" id="config_nav_index_sites" href="${path}config/newzbin">
|
||||
<div class="config_sprite_container sprite_config_nav_indexsites">$T('cmenu-newzbin')</div></a></li>
|
||||
<!--#end if#-->
|
||||
<li><a class="#if $pane=="Categories"#nav_active#end if#" id="config_nav_categories" href="${path}config/categories/">
|
||||
<li><a class="#if $pane=="Categories"#nav_active#end if#" id="config_nav_categories" href="${path}config/categories">
|
||||
<div class="config_sprite_container sprite_config_nav_categories">$T('cmenu-cat')</div></a></li>
|
||||
<li><a class="#if $pane=="Sorting"#nav_active#end if#" id="config_nav_sorting" href="${path}config/sorting/">
|
||||
<li><a class="#if $pane=="Sorting"#nav_active#end if#" id="config_nav_sorting" href="${path}config/sorting">
|
||||
<div class="config_sprite_container sprite_config_nav_sorting">$T('cmenu-sorting')</div></a></li>
|
||||
<li><a class="#if $pane=="Special"#nav_active#end if#" id="config_nav_special" href="${path}config/special/">
|
||||
<div class="config_sprite_container sprite_config_nav_special">$T('cmenu-special')</div></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
#end if#
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
</table>
|
||||
<div class="sabnzbd_logo main_sprite_container sprite_sabnzbdplus_logo"></div>
|
||||
<p><strong>SABnzbd $T('version'):</strong> $version</p>
|
||||
<p><small>Copyright (C) 2008-2012, The SABnzbd Team <team@sabnzbd.org></small></p>
|
||||
<p><small>Copyright (C) 2008-2011, The SABnzbd Team <<a href="mailto:team@sabnzbd.org">team@sabnzbd.org</a>></small></p>
|
||||
<p><small>$T('yourRights')</small></p>
|
||||
</div>
|
||||
|
||||
<div id="plush_options_modal">
|
||||
|
||||
<p><a href="status/disconnect?session=$session" class="juiButton">$T('link-forceDisc')</a></p>
|
||||
<p><a href="connections/disconnect?session=$session" class="juiButton">$T('link-forceDisc')</a></p>
|
||||
<p><a href="config/restart?session=$session" class="juiButton" id="sabnzbd_restart" rel="#echo $T('explain-Restart').replace("<br />","\n")#">$T('sch-restart')</a>
|
||||
<a href="shutdown?session=$session" class="juiButton" id="sabnzbd_shutdown" rel="$T('shutdownOK?')">$T('sch-shutdown')</a></p>
|
||||
<br/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Config"#-->
|
||||
<!--#set global $help_uri="Configure-0-7"#-->
|
||||
<!--#set global $help_uri="Configure"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<div id="config-components">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Categories"#-->
|
||||
<!--#set global $help_uri="configure-categories-0-7"#-->
|
||||
<!--#set global $help_uri="configure-categories"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<div style="padding:10px; overflow:auto;">
|
||||
@@ -55,7 +55,6 @@
|
||||
<option value="1" <!--#if $slot.priority == 1 then 'selected' else ''#-->>$T('pr-high')</option>
|
||||
<option value="0" <!--#if $slot.priority == 0 then 'selected' else ''#-->>$T('pr-normal')</option>
|
||||
<option value="-1" <!--#if $slot.priority == -1 then 'selected' else ''#-->>$T('pr-low')</option>
|
||||
<option value="-2" <!--#if $slot.priority == -2 then 'selected' else ''#-->>$T('pr-paused')</option>
|
||||
</select>
|
||||
</td>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Folders"#-->
|
||||
<!--#set global $help_uri="Configure+Folders-0-7"#-->
|
||||
<!--#set global $help_uri="Configure+Directories+V2"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<form action="saveDirectories" method="post" name="fullform" id="fullform">
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="Email"#-->
|
||||
<!--#set global $help_uri="Configure+Notifications-0-7"#-->
|
||||
<!--#set global $help_uri="Configure+Email"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<script>
|
||||
@@ -111,54 +111,6 @@
|
||||
</fieldset>
|
||||
</div><!-- /component-group2 -->
|
||||
|
||||
<!--#if $have_growl or $have_ntfosd#-->
|
||||
<div id="core-component-group3" class="component-group clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3>$T('growlSettings')</h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<!--#if $have_ntfosd#-->
|
||||
<div class="field-pair">
|
||||
<input type="checkbox" name="ntfosd_enable" id="ntfosd_enable" value="1" <!--#if $ntfosd_enable != "0" then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="ntfosd_enable">
|
||||
<span class="component-title">$T('opt-ntfosd_enable')</span>
|
||||
<span class="component-desc">$T('explain-ntfosd_enable')</span>
|
||||
</label>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
<!--#if $have_growl#-->
|
||||
<div class="field-pair">
|
||||
<input type="checkbox" name="growl_enable" id="growl_enable" value="1" <!--#if $growl_enable != "0" then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="growl_enable">
|
||||
<span class="component-title">$T('opt-growl_enable')</span>
|
||||
<span class="component-desc">$T('explain-growl_enable')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="growl_server">
|
||||
<span class="component-title">$T('opt-growl_server')</span>
|
||||
<input type="text" name="growl_server" id="growl_server" value="$growl_server"/>
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-growl_server')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="growl_password">
|
||||
<span class="component-title">$T('opt-growl_password')</span>
|
||||
<input type="password" size="35" name="growl_password" id="growl_password" value="$growl_password"/>
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-growl_password')</span>
|
||||
</label>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
</fieldset>
|
||||
</div><!-- /component-group3 -->
|
||||
<!--#end if#-->
|
||||
|
||||
<div class="component-group-last clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3> </h3>
|
||||
@@ -168,8 +120,6 @@
|
||||
<a id="save"><span class="config_sprite_container sprite_config_save"> </span> $T('button-saveChanges')</a>
|
||||
<a id="test_email" href="testmail?session=$session" rel="$T('askTestEmail')">
|
||||
<span class="config_sprite_container sprite_config_email_test"> </span> $T('link-testEmail')</a>
|
||||
<a id="test_notification" href="testnotification?session=$session">
|
||||
<span class="config_sprite_container sprite_config_email_test"> </span> $T('testNotify')</a>
|
||||
</div>
|
||||
<!--#if $lastmail#-->
|
||||
$T('emailResult') = <b>$lastmail</b>
|
||||
@@ -1,5 +1,5 @@
|
||||
<!--#set global $pane="General"#-->
|
||||
<!--#set global $help_uri="Configure+General-0-7"#-->
|
||||
<!--#set global $help_uri="Configure+General+V2"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<form action="saveGeneral" method="post" name="fullform" id="fullform" autocomplete="off">
|
||||
@@ -112,7 +112,6 @@
|
||||
<span class="component-title">$T('opt-apikey')</span>
|
||||
<input type="text" id="apikey" value="$session" class="apikey">
|
||||
<input type="button" class="juiButton" value="$T('button-apikey')" id="generate_new_apikey" rel="$T('Plush-confirm')">
|
||||
<input type="button" class="juiButton show_qrcode" value="$T('qr-code')" title="$T('explain-qr-code')" href="https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=$session" >
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
@@ -124,7 +123,6 @@
|
||||
<span class="component-title">$T('opt-nzbkey')</span>
|
||||
<input type="text" id="nzbkey" value="$nzb_key" class="apikey">
|
||||
<input type="button" class="juiButton" value="$T('button-apikey')" id="generate_new_nzbkey" rel="$T('Plush-confirm')">
|
||||
<input type="button" class="juiButton show_qrcode" value="$T('qr-code')" title="$T('explain-qr-code')" href="https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=$nzb_key" >
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
<!--#set global $pane="Index Sites"#-->
|
||||
<!--#set global $help_uri="Configure+Indexers-0-7"#-->
|
||||
<!--#include $webdir + "/_inc_header.tmpl"#-->
|
||||
|
||||
<form action="saveNewzbin" method="post" name="fullform" id="fullform" autocomplete="off">
|
||||
<input type="hidden" name="session" id="session" value="$session">
|
||||
|
||||
<div id="config-components">
|
||||
|
||||
<div id="core-component-group1" class="component-group clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3>NzbMatrix $T('accountInfo')</h3>
|
||||
<p>$T('explain-nzbmatrix')</p>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix" for="matrix_username">
|
||||
<span class="component-title">$T('opt-username_matrix')</span>
|
||||
<input type="text" name="matrix_username" id="matrix_username" value="$matrix_username"/>
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-username_matrix')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair alt">
|
||||
<label class="nocheck clearfix" for="matrix_apikey">
|
||||
<span class="component-title">$T('opt-apikey_matrix')</span>
|
||||
<input type="text" name="matrix_apikey" id="matrix_apikey" value="$matrix_apikey" class="apikey" />
|
||||
</label>
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">$T('explain-apikey_matrix')</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<input type="checkbox" name="matrix_del_bookmark" id="matrix_del_bookmark" value="1" <!--#if $matrix_del_bookmark > 0 then "checked=1" else ""#--> />
|
||||
<label class="clearfix" for="matrix_del_bookmark">
|
||||
<span class="component-title">$T('opt-newzbin_unbookmark')</span>
|
||||
<span class="component-desc">$T('explain-newzbin_unbookmark')</span>
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /component-group1 -->
|
||||
|
||||
<div class="component-group-last clearfix">
|
||||
<div class="component-group-desc">
|
||||
<h3> </h3>
|
||||
</div>
|
||||
<fieldset class="component-group-list">
|
||||
<div class="left_links">
|
||||
<a id="save"><span class="config_sprite_container sprite_config_save"> </span> $T('button-saveChanges')</a>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /component-group -->
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<!--#include $webdir + "/_inc_footer.tmpl"#-->
|
||||