Merge remote-tracking branch 'upstream/develop' into develop

This commit is contained in:
elijordan 2015-01-31 16:49:17 +11:00
commit 3bd3a1359a
137 changed files with 3126 additions and 1954 deletions

5
.gitignore vendored
View File

@ -1,6 +1,7 @@
# SR User Related #
######################
cache/*
cache/
cache.db*
config.ini*
Logs/*
@ -49,3 +50,7 @@ Thumbs.db
*~
/.idea/
*.torrent
# Unrar Executable #
######################
lib/unrar2/UnRAR.exe

View File

@ -12,7 +12,7 @@
-Change the hardcoded global ignore words to optional
2014-10-08
-Add login page for http auth as opposed to browser dialog box
VAdd login page for http auth as opposed to browser dialog box
2014-10-13
-Fix broken backlog

View File

@ -0,0 +1,257 @@
.country-flag {
width: 16px;
height: 11px;
background:url(images/country-flags.png) no-repeat
}
.country-flag.flag-ad {background-position: -16px 0}
.country-flag.flag-ae {background-position: -32px 0}
.country-flag.flag-af {background-position: -48px 0}
.country-flag.flag-ag {background-position: -64px 0}
.country-flag.flag-ai {background-position: -80px 0}
.country-flag.flag-al {background-position: -96px 0}
.country-flag.flag-am {background-position: -112px 0}
.country-flag.flag-an {background-position: -128px 0}
.country-flag.flag-ao {background-position: -144px 0}
.country-flag.flag-ar {background-position: -160px 0}
.country-flag.flag-as {background-position: -176px 0}
.country-flag.flag-at {background-position: -192px 0}
.country-flag.flag-au {background-position: -208px 0}
.country-flag.flag-aw {background-position: -224px 0}
.country-flag.flag-az {background-position: -240px 0}
.country-flag.flag-ba {background-position: 0 -11px}
.country-flag.flag-bb {background-position: -16px -11px}
.country-flag.flag-bd {background-position: -32px -11px}
.country-flag.flag-be {background-position: -48px -11px}
.country-flag.flag-bf {background-position: -64px -11px}
.country-flag.flag-bg {background-position: -80px -11px}
.country-flag.flag-bh {background-position: -96px -11px}
.country-flag.flag-bi {background-position: -112px -11px}
.country-flag.flag-bj {background-position: -128px -11px}
.country-flag.flag-bm {background-position: -144px -11px}
.country-flag.flag-bn {background-position: -160px -11px}
.country-flag.flag-bo {background-position: -176px -11px}
.country-flag.flag-br {background-position: -192px -11px}
.country-flag.flag-bs {background-position: -208px -11px}
.country-flag.flag-bt {background-position: -224px -11px}
.country-flag.flag-bv {background-position: -240px -11px}
.country-flag.flag-bw {background-position: 0 -22px}
.country-flag.flag-by {background-position: -16px -22px}
.country-flag.flag-bz {background-position: -32px -22px}
.country-flag.flag-ca {background-position: -48px -22px}
.country-flag.flag-catalonia {background-position: -64px -22px}
.country-flag.flag-cd {background-position: -80px -22px}
.country-flag.flag-cf {background-position: -96px -22px}
.country-flag.flag-cg {background-position: -112px -22px}
.country-flag.flag-ch {background-position: -128px -22px}
.country-flag.flag-ci {background-position: -144px -22px}
.country-flag.flag-ck {background-position: -160px -22px}
.country-flag.flag-cl {background-position: -176px -22px}
.country-flag.flag-cm {background-position: -192px -22px}
.country-flag.flag-cn {background-position: -208px -22px}
.country-flag.flag-co {background-position: -224px -22px}
.country-flag.flag-cr {background-position: -240px -22px}
.country-flag.flag-cu {background-position: 0 -33px}
.country-flag.flag-cv {background-position: -16px -33px}
.country-flag.flag-cw {background-position: -32px -33px}
.country-flag.flag-cy {background-position: -48px -33px}
.country-flag.flag-cz {background-position: -64px -33px}
.country-flag.flag-de {background-position: -80px -33px}
.country-flag.flag-dj {background-position: -96px -33px}
.country-flag.flag-dk {background-position: -112px -33px}
.country-flag.flag-dm {background-position: -128px -33px}
.country-flag.flag-do {background-position: -144px -33px}
.country-flag.flag-dz {background-position: -160px -33px}
.country-flag.flag-ec {background-position: -176px -33px}
.country-flag.flag-ee {background-position: -192px -33px}
.country-flag.flag-eg {background-position: -208px -33px}
.country-flag.flag-eh {background-position: -224px -33px}
.country-flag.flag-england {background-position: -240px -33px}
.country-flag.flag-er {background-position: 0 -44px}
.country-flag.flag-es {background-position: -16px -44px}
.country-flag.flag-et {background-position: -32px -44px}
.country-flag.flag-eu {background-position: -48px -44px}
.country-flag.flag-fi {background-position: -64px -44px}
.country-flag.flag-fj {background-position: -80px -44px}
.country-flag.flag-fk {background-position: -96px -44px}
.country-flag.flag-fm {background-position: -112px -44px}
.country-flag.flag-fo {background-position: -128px -44px}
.country-flag.flag-fr {background-position: -144px -44px}
.country-flag.flag-ga {background-position: -160px -44px}
.country-flag.flag-gb {background-position: -176px -44px}
.country-flag.flag-gd {background-position: -192px -44px}
.country-flag.flag-ge {background-position: -208px -44px}
.country-flag.flag-gf {background-position: -224px -44px}
.country-flag.flag-gg {background-position: -240px -44px}
.country-flag.flag-gh {background-position: 0 -55px}
.country-flag.flag-gi {background-position: -16px -55px}
.country-flag.flag-gl {background-position: -32px -55px}
.country-flag.flag-gm {background-position: -48px -55px}
.country-flag.flag-gn {background-position: -64px -55px}
.country-flag.flag-gp {background-position: -80px -55px}
.country-flag.flag-gq {background-position: -96px -55px}
.country-flag.flag-gr {background-position: -112px -55px}
.country-flag.flag-gs {background-position: -128px -55px}
.country-flag.flag-gt {background-position: -144px -55px}
.country-flag.flag-gu {background-position: -160px -55px}
.country-flag.flag-gw {background-position: -176px -55px}
.country-flag.flag-gy {background-position: -192px -55px}
.country-flag.flag-hk {background-position: -208px -55px}
.country-flag.flag-hm {background-position: -224px -55px}
.country-flag.flag-hn {background-position: -240px -55px}
.country-flag.flag-hr {background-position: 0 -66px}
.country-flag.flag-ht {background-position: -16px -66px}
.country-flag.flag-hu {background-position: -32px -66px}
.country-flag.flag-ic {background-position: -48px -66px}
.country-flag.flag-id {background-position: -64px -66px}
.country-flag.flag-ie {background-position: -80px -66px}
.country-flag.flag-il {background-position: -96px -66px}
.country-flag.flag-im {background-position: -112px -66px}
.country-flag.flag-in {background-position: -128px -66px}
.country-flag.flag-io {background-position: -144px -66px}
.country-flag.flag-iq {background-position: -160px -66px}
.country-flag.flag-ir {background-position: -176px -66px}
.country-flag.flag-is {background-position: -192px -66px}
.country-flag.flag-it {background-position: -208px -66px}
.country-flag.flag-je {background-position: -224px -66px}
.country-flag.flag-jm {background-position: -240px -66px}
.country-flag.flag-jo {background-position: 0 -77px}
.country-flag.flag-jp {background-position: -16px -77px}
.country-flag.flag-ke {background-position: -32px -77px}
.country-flag.flag-kg {background-position: -48px -77px}
.country-flag.flag-kh {background-position: -64px -77px}
.country-flag.flag-ki {background-position: -80px -77px}
.country-flag.flag-km {background-position: -96px -77px}
.country-flag.flag-kn {background-position: -112px -77px}
.country-flag.flag-kp {background-position: -128px -77px}
.country-flag.flag-kr {background-position: -144px -77px}
.country-flag.flag-kurdistan {background-position: -160px -77px}
.country-flag.flag-kw {background-position: -176px -77px}
.country-flag.flag-ky {background-position: -192px -77px}
.country-flag.flag-kz {background-position: -208px -77px}
.country-flag.flag-la {background-position: -224px -77px}
.country-flag.flag-lb {background-position: -240px -77px}
.country-flag.flag-lc {background-position: 0 -88px}
.country-flag.flag-li {background-position: -16px -88px}
.country-flag.flag-lk {background-position: -32px -88px}
.country-flag.flag-lr {background-position: -48px -88px}
.country-flag.flag-ls {background-position: -64px -88px}
.country-flag.flag-lt {background-position: -80px -88px}
.country-flag.flag-lu {background-position: -96px -88px}
.country-flag.flag-lv {background-position: -112px -88px}
.country-flag.flag-ly {background-position: -128px -88px}
.country-flag.flag-ma {background-position: -144px -88px}
.country-flag.flag-mc {background-position: -160px -88px}
.country-flag.flag-md {background-position: -176px -88px}
.country-flag.flag-me {background-position: -192px -88px}
.country-flag.flag-mg {background-position: -208px -88px}
.country-flag.flag-mh {background-position: -224px -88px}
.country-flag.flag-mk {background-position: -240px -88px}
.country-flag.flag-ml {background-position: 0 -99px}
.country-flag.flag-mm {background-position: -16px -99px}
.country-flag.flag-mn {background-position: -32px -99px}
.country-flag.flag-mo {background-position: -48px -99px}
.country-flag.flag-mp {background-position: -64px -99px}
.country-flag.flag-mq {background-position: -80px -99px}
.country-flag.flag-mr {background-position: -96px -99px}
.country-flag.flag-ms {background-position: -112px -99px}
.country-flag.flag-mt {background-position: -128px -99px}
.country-flag.flag-mu {background-position: -144px -99px}
.country-flag.flag-mv {background-position: -160px -99px}
.country-flag.flag-mw {background-position: -176px -99px}
.country-flag.flag-mx {background-position: -192px -99px}
.country-flag.flag-my {background-position: -208px -99px}
.country-flag.flag-mz {background-position: -224px -99px}
.country-flag.flag-na {background-position: -240px -99px}
.country-flag.flag-nc {background-position: 0 -110px}
.country-flag.flag-ne {background-position: -16px -110px}
.country-flag.flag-nf {background-position: -32px -110px}
.country-flag.flag-ng {background-position: -48px -110px}
.country-flag.flag-ni {background-position: -64px -110px}
.country-flag.flag-nl {background-position: -80px -110px}
.country-flag.flag-no {background-position: -96px -110px}
.country-flag.flag-np {background-position: -112px -110px}
.country-flag.flag-nr {background-position: -128px -110px}
.country-flag.flag-nu {background-position: -144px -110px}
.country-flag.flag-nz {background-position: -160px -110px}
.country-flag.flag-om {background-position: -176px -110px}
.country-flag.flag-pa {background-position: -192px -110px}
.country-flag.flag-pe {background-position: -208px -110px}
.country-flag.flag-pf {background-position: -224px -110px}
.country-flag.flag-pg {background-position: -240px -110px}
.country-flag.flag-ph {background-position: 0 -121px}
.country-flag.flag-pk {background-position: -16px -121px}
.country-flag.flag-pl {background-position: -32px -121px}
.country-flag.flag-pm {background-position: -48px -121px}
.country-flag.flag-pn {background-position: -64px -121px}
.country-flag.flag-pr {background-position: -80px -121px}
.country-flag.flag-ps {background-position: -96px -121px}
.country-flag.flag-pt {background-position: -112px -121px}
.country-flag.flag-pw {background-position: -128px -121px}
.country-flag.flag-py {background-position: -144px -121px}
.country-flag.flag-qa {background-position: -160px -121px}
.country-flag.flag-re {background-position: -176px -121px}
.country-flag.flag-ro {background-position: -192px -121px}
.country-flag.flag-rs {background-position: -208px -121px}
.country-flag.flag-ru {background-position: -224px -121px}
.country-flag.flag-rw {background-position: -240px -121px}
.country-flag.flag-sa {background-position: 0 -132px}
.country-flag.flag-sb {background-position: -16px -132px}
.country-flag.flag-sc {background-position: -32px -132px}
.country-flag.flag-scotland {background-position: -48px -132px}
.country-flag.flag-sd {background-position: -64px -132px}
.country-flag.flag-se {background-position: -80px -132px}
.country-flag.flag-sg {background-position: -96px -132px}
.country-flag.flag-sh {background-position: -112px -132px}
.country-flag.flag-si {background-position: -128px -132px}
.country-flag.flag-sk {background-position: -144px -132px}
.country-flag.flag-sl {background-position: -160px -132px}
.country-flag.flag-sm {background-position: -176px -132px}
.country-flag.flag-sn {background-position: -192px -132px}
.country-flag.flag-so {background-position: -208px -132px}
.country-flag.flag-somaliland {background-position: -224px -132px}
.country-flag.flag-sr {background-position: -240px -132px}
.country-flag.flag-ss {background-position: 0 -143px}
.country-flag.flag-st {background-position: -16px -143px}
.country-flag.flag-sv {background-position: -32px -143px}
.country-flag.flag-sx {background-position: -48px -143px}
.country-flag.flag-sy {background-position: -64px -143px}
.country-flag.flag-sz {background-position: -80px -143px}
.country-flag.flag-tc {background-position: -96px -143px}
.country-flag.flag-td {background-position: -112px -143px}
.country-flag.flag-tf {background-position: -128px -143px}
.country-flag.flag-tg {background-position: -144px -143px}
.country-flag.flag-th {background-position: -160px -143px}
.country-flag.flag-tj {background-position: -176px -143px}
.country-flag.flag-tk {background-position: -192px -143px}
.country-flag.flag-tl {background-position: -208px -143px}
.country-flag.flag-tm {background-position: -224px -143px}
.country-flag.flag-tn {background-position: -240px -143px}
.country-flag.flag-to {background-position: 0 -154px}
.country-flag.flag-tr {background-position: -16px -154px}
.country-flag.flag-tt {background-position: -32px -154px}
.country-flag.flag-tv {background-position: -48px -154px}
.country-flag.flag-tw {background-position: -64px -154px}
.country-flag.flag-tz {background-position: -80px -154px}
.country-flag.flag-ua {background-position: -96px -154px}
.country-flag.flag-ug {background-position: -112px -154px}
.country-flag.flag-um {background-position: -128px -154px}
.country-flag.flag-us {background-position: -144px -154px}
.country-flag.flag-uy {background-position: -160px -154px}
.country-flag.flag-uz {background-position: -176px -154px}
.country-flag.flag-va {background-position: -192px -154px}
.country-flag.flag-vc {background-position: -208px -154px}
.country-flag.flag-ve {background-position: -224px -154px}
.country-flag.flag-vg {background-position: -240px -154px}
.country-flag.flag-vi {background-position: 0 -165px}
.country-flag.flag-vn {background-position: -16px -165px}
.country-flag.flag-vu {background-position: -32px -165px}
.country-flag.flag-wales {background-position: -48px -165px}
.country-flag.flag-wf {background-position: -64px -165px}
.country-flag.flag-ws {background-position: -80px -165px}
.country-flag.flag-ye {background-position: -96px -165px}
.country-flag.flag-yt {background-position: -112px -165px}
.country-flag.flag-za {background-position: -128px -165px}
.country-flag.flag-zanzibar {background-position: -144px -165px}
.country-flag.flag-zm {background-position: -160px -165px}
.country-flag.flag-zw {background-position: -176px -165px}

View File

@ -561,6 +561,16 @@ home.tmpl
color: #fff;
}
.progress-100 {
background-image: -moz-linear-gradient(#395f07, #2a4705) !important;
background-image: linear-gradient(#395f07, #2a4705) !important;
background-image: -webkit-linear-gradient(#395f07, #2a4705) !important;
background-image: -o-linear-gradient(#395f07, #2a4705) !important;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
.progress-80 {
background-image: -moz-linear-gradient(#a6cf41, #5b990d) !important;
background-image: linear-gradient(#a6cf41, #5b990d) !important;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -543,6 +543,16 @@ home.tmpl
color: #000000;
}
.progress-100 {
background-image: -moz-linear-gradient(#55aef1, #9cd0f7) !important;
background-image: linear-gradient(#55aef1, #9cd0f7) !important;
background-image: -webkit-linear-gradient(#55aef1, #9cd0f7) !important;
background-image: -o-linear-gradient(#55aef1, #9cd0f7) !important;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
.progress-80 {
background-image: -moz-linear-gradient(#a6cf41, #5b990d) !important;
background-image: linear-gradient(#a6cf41, #5b990d) !important;

View File

@ -557,6 +557,16 @@ home.tmpl
color: #000000;
}
.progress-100 {
background-image: -moz-linear-gradient(#395f07, #2a4705) !important;
background-image: linear-gradient(#395f07, #2a4705) !important;
background-image: -webkit-linear-gradient(#395f07, #2a4705) !important;
background-image: -o-linear-gradient(#395f07, #2a4705) !important;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
.progress-80 {
background-image: -moz-linear-gradient(#a6cf41, #5b990d) !important;
background-image: linear-gradient(#a6cf41, #5b990d) !important;

BIN
gui/slick/images/blank.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 703 B

View File

@ -97,6 +97,26 @@
</label>
</div>
<div class="field-pair">
<label for="log_nr">
<span class="component-title">Number of Log files saved</span>
<span class="component-desc">
<input type="text" name="log_nr" id="log_nr" value="$sickbeard.LOG_NR" class="form-control input-sm input75" />
<p>number of log files saved when rotating logs (default: 5) (REQUIRES RESTART)</p>
</span>
</label>
</div>
<div class="field-pair">
<label for="log_size">
<span class="component-title">Size of Log files saved</span>
<span class="component-desc">
<input type="text" name="log_size" id="log_size" value="$sickbeard.LOG_SIZE" class="form-control input-sm input75" />
<p>maximum size of a log file saved (default: 1048576 (1MB)) (REQUIRES RESTART)</p>
</span>
</label>
</div>
<div class="field-pair">
<label for="indexer_default">
<span class="component-title">Use initial indexer set to</span>
@ -224,7 +244,15 @@
</span>
</label>
</div>
<div class="field-pair">
<label for="display_filesize">
<span class="component-title">Display Filesizes</span>
<span class="component-desc">
<input type="checkbox" name="display_filesize" id="display_filesize" #if $sickbeard.DISPLAY_FILESIZE == True then 'checked="checked"' else ''#/>
<p>display filesizes for downloaded episodes on show page</p>
</span>
</label>
</div>
<div class="field-pair">
<label for="fuzzy_dating">
<span class="component-title">Display fuzzy dates</span>
@ -301,6 +329,18 @@
</label>
</div>
<div class="field-pair">
<label for="download_url">
<span class="component-title">Download url</span>
<input type="text" name="download_url" id="download_url" value="$sickbeard.DOWNLOAD_URL" size="35" />
</label>
<label>
<span class="component-title">&nbsp;</span>
<span class="component-desc">URL where the shows can be downloaded.</span>
</label>
</div>
<input type="submit" class="btn config_submitter" value="Save Changes" />
</fieldset>
@ -518,9 +558,11 @@
<span class="component-title">Branch version:</span>
<span class="component-desc">
<select id="branchVersion" class="form-control form-control-inline input-sm pull-left">
#if $sickbeard.versionCheckScheduler.action.list_remote_branches()
#for $cur_branch in $sickbeard.versionCheckScheduler.action.list_remote_branches():
<option value="$cur_branch" #if $cur_branch == $sickbeard.BRANCH then 'selected="selected"' else ''#>$cur_branch</option>
#end for
#end if
</select>
<input class="btn btn-inline" style="margin-left: 6px;" type="button" id="branchCheckout" value="Checkout Branch">
<div class="clear-left"><p>select branch to use (restart required)</p></div>

View File

@ -1192,6 +1192,78 @@
</fieldset>
</div><!-- /pushbullet component-group //-->
<div class="component-group">
<div class="component-group-desc">
<img class="notifier-icon" src="$sbRoot/images/notifiers/freemobile.png" alt="" title="Free Mobile" />
<h3><a href="<%= anon_url('http://mobile.free.fr/') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">Free Mobile</a></h3>
<p>Free Mobile is a famous French cellular network provider.<br> It provides to their customer a free SMS API.</p>
</div>
<fieldset class="component-group-list">
<div class="field-pair">
<label for="use_freemobile">
<span class="component-title">Enable</span>
<span class="component-desc">
<input type="checkbox" class="enabler" name="use_freemobile" id="use_freemobile" #if $sickbeard.USE_FREEMOBILE then "checked=\"checked\"" else ""# />
<p>should SickRage send SMS notifications ?</p>
</span>
</label>
</div>
<div id="content_use_freemobile">
<div class="field-pair">
<label for="freemobile_notify_onsnatch">
<span class="component-title">Notify on snatch</span>
<span class="component-desc">
<input type="checkbox" name="freemobile_notify_onsnatch" id="freemobile_notify_onsnatch" #if $sickbeard.FREEMOBILE_NOTIFY_ONSNATCH then "checked=\"checked\"" else ""# />
<p>send a SMS when a download starts ?</p>
</span>
</label>
</div>
<div class="field-pair">
<label for="freemobile_notify_ondownload">
<span class="component-title">Notify on download</span>
<span class="component-desc">
<input type="checkbox" name="freemobile_notify_ondownload" id="freemobile_notify_ondownload" #if $sickbeard.FREEMOBILE_NOTIFY_ONDOWNLOAD then "checked=\"checked\"" else ""# />
<p>send a SMS when a download finishes ?</p>
</span>
</label>
</div>
<div class="field-pair">
<label for="freemobile_notify_onsubtitledownload">
<span class="component-title">Notify on subtitle download</span>
<span class="component-desc">
<input type="checkbox" name="freemobile_notify_onsubtitledownload" id="freemobile_notify_onsubtitledownload" #if $sickbeard.FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD then "checked=\"checked\"" else ""# />
<p>send a SMS when subtitles are downloaded ?</p>
</span>
</label>
</div>
<div class="field-pair">
<label for="freemobile_id">
<span class="component-title">Free Mobile customer ID</span>
<input type="text" name="freemobile_id" id="freemobile_id" value="$sickbeard.FREEMOBILE_ID" class="form-control input-sm input250" />
</label>
<label>
<span class="component-title">&nbsp;</span>
<span class="component-desc">It's your Free Mobile customer ID (8 digits)</span>
</label>
</div>
<div class="field-pair">
<label for="freemobile_password">
<span class="component-title">Free Mobile API Key</span>
<input type="text" name="freemobile_apikey" id="freemobile_apikey" value="$sickbeard.FREEMOBILE_APIKEY" class="form-control input-sm input250" />
</label>
<label>
<span class="component-title">&nbsp;</span>
<span class="component-desc">Find your API Key in your customer portal.</span>
</label>
</div>
<div class="testNotification" id="testFreeMobile-result">Click below to test your settings.</div>
<input class="btn" type="button" value="Test SMS" id="testFreeMobile" />
<input type="submit" class="config_submitter btn" value="Save Changes" />
</div><!-- /content_use_freemobile //-->
</fieldset>
</div><!-- /freemobile component-group //-->
</div>
@ -1319,13 +1391,12 @@
</label>
</div>
<div class="field-pair">
<label for="trakt_api">
<span class="component-title">Trakt API key:</span>
<input type="text" name="trakt_api" id="trakt_api" value="$sickbeard.TRAKT_API" class="form-control input-sm input250" />
</label>
<label>
<span class="component-title">&nbsp;</span>
<span class="component-desc">get your key at: <a href="<%= anon_url('http://trakt.tv/settings/api') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><b>http://trakt.tv/settings/api</b></a></span>
<label for="trakt_disable_ssl_verify">
<span class="component-title">Disable SSL Verification:</span>
<span class="component-desc">
<input type="checkbox" class="enabler" name="trakt_disable_ssl_verify" id="trakt_disable_ssl_verify" #if $sickbeard.TRAKT_DISABLE_SSL_VERIFY then "checked=\"checked\"" else ""# />
<p>Disable SSL certificate verification on systems with broken SSL implementations, like the QNAP NAS.</p>
</span>
</label>
</div>
<div class="field-pair">
@ -1537,6 +1608,10 @@
<span class="component-title">&nbsp;</span>
<span class="component-desc">configure per show notifications here.</span>
</label>
<label>
<span class="component-title">&nbsp;</span>
<input id="email_show_save" class="btn" type="button" value="Save for this show" />
</label>
</div>
<div class="testNotification" id="testEmail-result">Click below to test.</div>

View File

@ -530,39 +530,6 @@ var show_nzb_providers = #if $sickbeard.USE_NZBS then "true" else "false"#;
</div>
#end if
#if $hasattr($curTorrentProvider, 'options'):
<br>
<input type="hidden" id="tvtorrents_option_string" />
<fieldset>
<legend id="seed_options">Advanced options</legend>
<div class="field-pair">
<label >
<span class="component-title">Seeding ratio(%) goal:</span>
<input type="text" id="tvtorrents_seed_ratio" class="seed_option form-control input-sm input75" />
</label>
</div>
<div class="field-pair">
<label>
<span class="component-title">Seeding time(h) goal:</span>
<input type="text" id="tvtorrents_seed_time" class="seed_option form-control input-sm input75" />
</label>
</div>
<div class="field-pair">
<label>
<span class="component-title">Process method:</span>
<select id="tvtorrents_process_method" class="seed_option form-control input-sm" >
#set $process_method_text = {'': "", 'copy': "Copy", 'move': "Move", 'hardlink': "Hard Link", 'symlink' : "Symbolic Link"}
#for $curAction in ('', 'copy', 'move', 'hardlink', 'symlink'):
#set $process_method = ""
<option class="seed_option" value="$curAction" $process_method>$process_method_text[$curAction]</option>
#end for
</select>
</label>
</div>
</fieldset>
<br>
#end if
</div>
#end for

View File

@ -455,6 +455,18 @@
</label>
</div>
<div class="field-pair" id="torrent_rpcurl_option">
<label>
<span class="component-title" id="rpcurl_title">Torrent RPC URL</span>
<span class="component-desc">
<input type="text" name="torrent_rpcurl" id="torrent_rpcurl" value="$sickbeard.TORRENT_RPCURL" class="form-control input-sm input350"/>
<div class="clear-left">
<p id="rpcurl_desc_">The path without leading and trailing slashes (e.g. transmission)</p>
</div>
</span>
</label>
</div>
<div class="field-pair" id="torrent_verify_cert_option">
<label for="torrent_verify_cert">
<span class="component-title">Verify certificate</span>

View File

@ -6,6 +6,7 @@
#from lib import subliminal
#import os.path, os
#import datetime
#import urllib
#set global $title=$show.name
##set global $header = '<a></a>' %
@ -165,7 +166,7 @@
#else
#if 'country_codes' in $show.imdb_info:
#for $country in $show.imdb_info['country_codes'].split('|')
<img src="$sbRoot/images/flags/${$country}.png" width="16" height="11" style="margin-left: 3px; vertical-align:middle;" />
<img src="$sbRoot/images/blank.png" class="country-flag flag-${$country}" width="16" height="11" style="margin-left: 3px; vertical-align:middle;" />
#end for
#end if
#if 'year' in $show.imdb_info:
@ -374,8 +375,18 @@
#if $scene_anime:
<th class="col-ep">Scene Absolute</th>
#end if
<th class="col-name">Name</th>
<th class="col-name"
#if ($sickbeard.DISPLAY_FILESIZE == True):
style="min-width: 190px"
#end if
>>Name</th>
#if ($sickbeard.DISPLAY_FILESIZE == True):
<th class="col-ep">Filesize</th>
#end if
<th class="col-airdate">Airdate</th>
#if $sickbeard.DOWNLOAD_URL
<th class="col-ep">Download</th>
#end if
#if $sickbeard.USE_SUBTITLES and $show.subtitles:
<th class="col-subtitles">Subtitles</th>
#end if
@ -467,10 +478,33 @@
$epResult["name"]
</td>
#if ($sickbeard.DISPLAY_FILESIZE == True):
<td class="col-ep">
#if $epResult["file_size"]:
#set $file_size = $epResult["file_size"] / 1024 / 1024
$file_size MB
#end if
</td>
#end if
<td class="col-airdate">
<span class="${fuzzydate}">#if int($epResult['airdate']) == 1 then 'never' else $sbdatetime.sbdatetime.sbfdate($sbdatetime.sbdatetime.convert_to_setting($network_timezones.parse_date_time($epResult['airdate'],$show.airs,$show.network)))#</span>
</td>
#if $sickbeard.DOWNLOAD_URL and $epResult['location']
<td>
#set $filename = $epResult['location']
#for $rootDir in $sickbeard.ROOT_DIRS.split('|')
#if $rootDir.startswith('/')
#set $filename = $filename.replace($rootDir, "")
#end if
#end for
#set $filename = $sickbeard.DOWNLOAD_URL + $urllib.quote($filename.encode('utf8'))
<center><a href="$filename">Download</a></center>
</td>
#elif $sickbeard.DOWNLOAD_URL
<td></td>
#end if
#if $sickbeard.USE_SUBTITLES and $show.subtitles:
<td class="col-subtitles" align="center">
#if $epResult["subtitles"]:

View File

@ -265,22 +265,22 @@ Separate words with a comma, e.g. "word1,word2,word3"<br />
});
\$('#addToWhite').click(function() {
var group = \$('#addToPoolText').attr("value")
var group = \$('#addToPoolText').val()
if(group == "")
return
\$('#addToPoolText').attr("value", "")
\$('#addToPoolText').val("")
var option = \$("<option>")
option.attr("value",group)
option.prop("value",group)
option.html(group)
return option.appendTo('#white');
});
\$('#addToBlack').click(function() {
var group = \$('#addToPoolText').attr("value")
var group = \$('#addToPoolText').val()
if(group == "")
return
\$('#addToPoolText').attr("value", "")
\$('#addToPoolText').val("")
var option = \$("<option>")
option.attr("value",group)
option.prop("value",group)
option.html(group)
return option.appendTo('#black');
});

View File

@ -356,15 +356,18 @@ $myShowList.sort(lambda x, y: cmp(x.name, y.name))
if (classvalue<20) {
classtoadd = "progress-20"
}
if (classvalue>20 && classvalue<60) {
if (classvalue>=20 && classvalue<40) {
classtoadd = "progress-40"
}
if (classvalue>40 && classvalue<80) {
if (classvalue>=40 && classvalue<80) {
classtoadd = "progress-60"
}
if (classvalue>80) {
if (classvalue>=80 && classvalue<100) {
classtoadd = "progress-80"
}
if (classvalue==100) {
classtoadd = "progress-100"
}
\$("\#progressbar$curShow.indexerid > .ui-progressbar-value").addClass(classtoadd);
});
//-->
@ -586,15 +589,18 @@ $myShowList.sort(lambda x, y: cmp(x.name, y.name))
if (classvalue<20) {
classtoadd = "progress-20"
}
if (classvalue>20 && classvalue<60) {
if (classvalue>=20 && classvalue<40) {
classtoadd = "progress-40"
}
if (classvalue>40 && classvalue<80) {
if (classvalue>=40 && classvalue<80) {
classtoadd = "progress-60"
}
if (classvalue>80) {
if (classvalue>=80 && classvalue<100) {
classtoadd = "progress-80"
}
if (classvalue==100) {
classtoadd = "progress-100"
}
\$("\#progressbar$curShow.indexerid > .ui-progressbar-value").addClass(classtoadd);
});
//-->

View File

@ -60,7 +60,8 @@
<select name="providedIndexer" id="providedIndexer" class="form-control form-control-inline input-sm">
<option value="0" #if $provided_indexer == 0 then "selected=\"selected\"" else ""#>All Indexers</option>
#for $indexer in $indexers
<option value="$indexer" #if $provided_indexer == $indexer then "selected=\"selected\"" else ""#>$indexers[$indexer]</option>
<option value="$indexer" #if $provided_indexer == $indexer then "selected=\"selected\"" else ""#>
#if $indexers[$indexer] == 'TVRage' then ''.join(($indexers[$indexer], ' **')) else $indexers[$indexer]#</option>
#end for
</select>
&nbsp;
@ -69,6 +70,7 @@
<br /><br />
<b>*</b> This will only affect the language of the retrieved metadata file contents and episode filenames.<br />
This <b>DOES NOT</b> allow SickRage to download non-english TV episodes!<br />
<b>**</b> The indexer implementation doesn't currently support specials.<br />
<br />
<div id="searchResults" style="height: 100%;"><br/></div>
#end if

View File

@ -25,3 +25,7 @@
<input class="btn" type="button" id="defaultRootDir" value="Set as Default *" />
</div>
<input type="text" style="display: none" id="rootDirText" />
<script type="text/javascript">
document.getElementById("rootDirs").selectedIndex = "0"
</script>

View File

@ -37,10 +37,11 @@
<link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/bootstrap.css?$sbPID"/>
<link rel="stylesheet" type="text/css" href="$sbRoot/css/browser.css?$sbPID" />
<link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/jquery-ui-1.10.4.custom.css?$sbPID" />
<link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/jquery.qtip-2.0.1.min.css?$sbPID"/>
<link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/jquery.qtip-2.2.1.min.css?$sbPID"/>
<link rel="stylesheet" type="text/css" href="$sbRoot/css/lib/pnotify.custom.min.css?$sbPID" />
<link rel="stylesheet" type="text/css" href="$sbRoot/css/style.css?$sbPID"/>
<link rel="stylesheet" type="text/css" href="$sbRoot/css/${sickbeard.THEME_NAME}.css?$sbPID" />
<link rel="stylesheet" type="text/css" href="$sbRoot/css/country-flags.css?$sbPID"/>
<script type="text/javascript" src="$sbRoot/js/lib/jquery-1.11.2.min.js?$sbPID"></script>
@ -53,7 +54,7 @@
<script type="text/javascript" src="$sbRoot/js/lib/jquery.selectboxes.min.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/jquery.tablesorter-2.17.7.min.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/jquery.qtip-2.0.1.min.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/jquery.qtip-2.2.1.min.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/pnotify.custom.min.js"></script>
<script type="text/javascript" src="$sbRoot/js/lib/jquery.form-3.35.js?$sbPID"></script>
<script type="text/javascript" src="$sbRoot/js/lib/jquery.ui.touch-punch-0.2.2.min.js?$sbPID"></script>

View File

@ -58,14 +58,15 @@
5: { sorter: 'anime'},
6: { sorter: 'flatfold'},
7: { sorter: 'paused'},
8: { sorter: 'status'},
9: { sorter: false},
8: { sorter: 'default_ep_status'},
9: { sorter: 'status'},
10: { sorter: false},
11: { sorter: false},
12: { sorter: false},
13: { sorter: false},
14: { sorter: false},
15: { sorter: false}
15: { sorter: false},
16: { sorter: false}
}
});
});
@ -90,6 +91,7 @@
<th class="col-legend">Anime</th>
<th class="col-legend">Flat Folders</th>
<th class="col-legend">Paused</th>
<th class="col-legend">Default Ep<br>Status</th>
<th class="col-legend">Status</th>
<th width="1%">Update<br/><input type="checkbox" class="bulkCheck" id="updateCheck" /></th>
<th width="1%">Rescan<br/><input type="checkbox" class="bulkCheck" id="refreshCheck" /></th>
@ -172,6 +174,7 @@
<td align="center"><img src="$sbRoot/images/#if int($curShow.is_anime) == 1 then "yes16.png\" alt=\"Y\"" else "no16.png\" alt=\"N\""# width="16" height="16" /></td>
<td align="center"><img src="$sbRoot/images/#if int($curShow.flatten_folders) == 1 then "yes16.png\" alt=\"Y\"" else "no16.png\" alt=\"N\""# width="16" height="16" /></td>
<td align="center"><img src="$sbRoot/images/#if int($curShow.paused) == 1 then "yes16.png\" alt=\"Y\"" else "no16.png\" alt=\"N\""# width="16" height="16" /></td>
<td align="center">$statusStrings[$curShow.default_ep_status]</td>
<td align="center">$curShow.status</td>
<td align="center">$curUpdate</td>
<td align="center">$curRefresh</td>

View File

@ -1,5 +1,6 @@
#import sickbeard
#from sickbeard import common
#from sickbeard.common import *
#from sickbeard import exceptions
#set global $title="Mass Edit"
#set global $header="Mass Edit"
@ -111,6 +112,18 @@
</div><br />
</div>
<div class="optionWrapper">
<span class="selectTitle">Default Episode Status:</span>
<div class="selectChoices">
<select id="edit_default_ep_status" name="default_ep_status" class="form-control form-control-inline input-sm">
<option value="keep">&lt; keep &gt;</option>
#for $curStatus in [$WANTED, $SKIPPED, $ARCHIVED, $IGNORED]:
<option value="$curStatus" #if $curStatus == $default_ep_status_value then 'selected="selected"' else ''#>$statusStrings[$curStatus]</option>
#end for
</select>
</div><br />
</div>
<div class="optionWrapper">
<span class="selectTitle">Scene Numbering</span>
<div class="selectChoices">

View File

@ -32,6 +32,26 @@
#set $curSeason = -1
#set $odd = False
<table id="SelectAllTable" class="sickbeardTable" cellspacing="1" border="0" cellpadding="0">
<thead>
<tr class="seasonheader" id="season-all">
<td colspan="4">
<h2>All Seasons</h2>
</td>
</tr>
<tr class="seasoncols" id="selectall">
<th class="col-checkbox"><input type="checkbox" class="seriesCheck" id="SelectAll" /></th>
<th align="left" valign="top" class="nowrap">Select All</th>
<th width="100%" class="col-name" style="visibility:hidden;"></th>
</tr>
</thead>
</table>
<br/>
<input type="submit" value="Rename Selected" class="btn btn-success"> <a href="/home/displayShow?show=$show.indexerid" class="btn btn-danger">Cancel Rename</a>
<table id="testRenameTable" class="sickbeardTable" cellspacing="1" border="0" cellpadding="0">
#for $cur_ep_obj in $ep_obj_list:

View File

@ -75,24 +75,23 @@
</div>
#else
#for $cur_show in $trending_shows:
#set $image = re.sub(r'(?im)(.*)(\..*?)$', r'\1-300\2', $cur_show['images']['poster'], 0)
#set $show_url = 'http://www.trakt.tv/shows/%s' % $cur_show['show']['ids']['slug']
<div class="trakt_show" data-name="$cur_show['title']" data-rating="$cur_show['ratings']['percentage']" data-votes="$cur_show['ratings']['votes']">
<div class="trakt_show" data-name="$cur_show['show']['title']" data-rating="$cur_show['show']['rating']" data-votes="$cur_show['show']['votes']">
<div class="traktContainer">
<div class="trakt-image">
<a class="trakt-image" href="<%= anon_url(cur_show['url']) %>" target="_blank"><img alt="" class="trakt-image" src="${image}" /></a>
<a class="trakt-image" href="<%= anon_url(show_url) %>" target="_blank"><img alt="" class="trakt-image" src="$cur_show['show']['images']['poster']['thumb']" /></a>
</div>
<div class="show-title">
<%= (cur_show['title'], '<span>&nbsp;</span>')[ '' == cur_show['title']] %>
<%= (cur_show['show']['title'], '<span>&nbsp;</span>')[ '' == cur_show['show']['title']] %>
</div>
<div class="clearfix">
<p>$cur_show['ratings']['percentage']% <img src="$sbRoot/images/heart.png"></p>
<i>$cur_show['ratings']['votes'] votes</i>
<p><%= int(cur_show['show']['rating']*10) %>% <img src="$sbRoot/images/heart.png"></p>
<i>$cur_show['show']['votes'] votes</i>
<div class="traktShowTitleIcons">
<a href="$sbRoot/home/addShows/addTraktShow?indexer_id=${cur_show['tvdb_id'] or cur_show['tvrage_id']}&amp;showName=${cur_show['title']}" class="btn btn-xs">Add Show</a>
<a href="$sbRoot/home/addShows/addTraktShow?indexer_id=${cur_show['show']['ids']['tvdb'] or cur_show['show']['ids']['tvrage']}&amp;showName=${cur_show['show']['title']}" class="btn btn-xs">Add Show</a>
</div>
</div>
</div>

View File

@ -33,7 +33,6 @@ function check_manual_searches() {
function updateImages(data) {
$.each(data.episodes, function (name, ep) {
console.debug(ep.searchstatus);
// Get td element for current ep
var loadingImage = 'loading16.gif';
var queuedImage = 'queued.png';
@ -123,7 +122,6 @@ function disableLink(el) {
// Check if we have disabled the click
if ( $(this).attr('enableClick') == '0' ) {
console.debug("Already queued, not downloading!");
return false;
}
@ -180,4 +178,3 @@ function disableLink(el) {
});
}
})();

View File

@ -269,17 +269,39 @@ $(document).ready(function(){
});
});
$('#testFreeMobile').click(function () {
var freemobile_id = $.trim($('#freemobile_id').val());
var freemobile_apikey = $.trim($('#freemobile_apikey').val());
if (!freemobile_id || !freemobile_apikey) {
$('#testFreeMobile-result').html('Please fill out the necessary fields above.');
if (!freemobile_id) {
$('#freemobile_id').addClass('warning');
} else {
$('#freemobile_id').removeClass('warning');
}
if (!freemobile_apikey) {
$('#freemobile_apikey').addClass('warning');
} else {
$('#freemobile_apikey').removeClass('warning');
}
return;
}
$('#freemobile_id,#freemobile_apikey').removeClass('warning');
$(this).prop('disabled', true);
$('#testFreeMobile-result').html(loading);
$.get(sbRoot + '/home/testFreeMobile', {'freemobile_id': freemobile_id, 'freemobile_apikey': freemobile_apikey})
.done(function (data) {
$('#testFreeMobile-result').html(data);
$('#testFreeMobile').prop('disabled', false);
});
});
$('#testTrakt').click(function () {
var trakt_api = $.trim($('#trakt_api').val());
var trakt_username = $.trim($('#trakt_username').val());
var trakt_password = $.trim($('#trakt_password').val());
if (!trakt_api || !trakt_username || !trakt_password) {
var trakt_disable_ssl_verify = $('#trakt_disable_ssl_verify').is(':checked');
if (!trakt_username || !trakt_password) {
$('#testTrakt-result').html('Please fill out the necessary fields above.');
if (!trakt_api) {
$('#trakt_api').addClass('warning');
} else {
$('#trakt_api').removeClass('warning');
}
if (!trakt_username) {
$('#trakt_username').addClass('warning');
} else {
@ -292,10 +314,10 @@ $(document).ready(function(){
}
return;
}
$('#trakt_api,#trakt_username,#trakt_password').removeClass('warning');
$('#trakt_username,#trakt_password').removeClass('warning');
$(this).prop('disabled', true);
$('#testTrakt-result').html(loading);
$.get(sbRoot + '/home/testTrakt', {'api': trakt_api, 'username': trakt_username, 'password': trakt_password})
$.get(sbRoot + '/home/testTrakt', {'username': trakt_username, 'password': trakt_password, 'disable_ssl': trakt_disable_ssl_verify})
.done(function (data) {
$('#testTrakt-result').html(data);
$('#testTrakt').prop('disabled', false);
@ -466,6 +488,13 @@ $(document).ready(function(){
// Load the per show notify lists everytime this page is loaded
load_show_notify_lists();
$('#email_show_save').click(function() {
$.post(sbRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) {
// Reload the per show notify lists to reflect changes
load_show_notify_lists();
});
});
// show instructions for plex when enabled
$('#use_plex').click(function() {
if ( $(this).is(':checked') ) {

View File

@ -47,6 +47,7 @@ $(document).ready(function(){
directory = ' directory',
client = '',
option_panel = '#options_torrent_blackhole';
rpcurl = ' RPC URL'
if ('blackhole' != selectedProvider) {
var label_warning_deluge = '#label_warning_deluge',
@ -76,6 +77,7 @@ $(document).ready(function(){
$(torrent_label_anime_option).show();
$(path_synology).hide();
$(torrent_paused_option).show();
$(torrent_rpcurl_option).hide();
if ('utorrent' == selectedProvider) {
client = 'uTorrent';
@ -87,6 +89,7 @@ $(document).ready(function(){
$(torrent_high_bandwidth_option).show();
$(torrent_label_option).hide();
$(torrent_label_anime_option).hide();
$(torrent_rpcurl_option).show();
//$('#directory_title').text(client + directory);
} else if ('deluge' == selectedProvider){
client = 'Deluge';
@ -113,6 +116,7 @@ $(document).ready(function(){
$('#username_title').text(client + username);
$('#password_title').text(client + password);
$('#torrent_client').text(client);
$('#rpcurl_title').text(client + rpcurl);
option_panel = '#options_torrent_clients';
}
$(option_panel).show();

View File

@ -48,7 +48,7 @@ $(document).ready(function(){
$(this).showHideServices();
});
$('.service_enabler').live('click', function(){
$('.service_enabler').on('click', function(){
$(this).refreshServiceList();
});

View File

@ -5,21 +5,21 @@ $(document).ready(function () {
$('#sbRoot').ajaxEpSubtitlesSearch();
$('#seasonJump').change(function () {
var id = $(this).val();
var id = $('#seasonJump option:selected').val();
if (id && id != 'jump') {
$('html,body').animate({scrollTop: $(id).offset().top}, 'slow');
$('html,body').animate({scrollTop: $('[name ="' + id.substring(1) + '"]').offset().top - 50}, 'slow');
location.hash = id;
}
$(this).val('jump');
});
$("#prevShow").click(function () {
$('#pickShow option:selected').prev('option').attr('selected', 'selected');
$('#pickShow option:selected').prev('option').prop('selected', 'selected');
$("#pickShow").change();
});
$("#nextShow").click(function () {
$('#pickShow option:selected').next('option').attr('selected', 'selected');
$('#pickShow option:selected').next('option').prop('selected', 'selected');
$("#pickShow").change();
});
@ -38,7 +38,7 @@ $(document).ready(function () {
if (epArr.length == 0)
return false;
url = sbRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').attr('value');
url = sbRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val();
window.location.href = url
});
@ -105,7 +105,7 @@ $(document).ready(function () {
// handle the show selection dropbox
$('#pickShow').change(function () {
var sbRoot = $('#sbRoot').val();
var val = $(this).attr('value');
var val = $(this).val();
if (val == 0)
return;
url = sbRoot + '/home/displayShow?show=' + val;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -216,7 +216,7 @@ $(document).ready(function () {
}
$('#rootDirText').change(updateSampleText);
$('#whichSeries').live('change', updateSampleText);
$('#searchResults').on('change', '#whichSeries', updateSampleText);
$('#nameToSearch').keyup(function (event) {
if (event.keyCode == 13) {

View File

@ -1,4 +1,5 @@
$(document).ready(function () {
$('#searchResults').html('<img id="searchingAnim" src="' + sbRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> loading recommended shows...');
function getRecommendedShows() {
$.getJSON(sbRoot + '/home/addShows/getRecommendedShows', {}, function (data) {
var firstResult = true;
@ -139,6 +140,6 @@ $(document).ready(function () {
}
$('#rootDirText').change(updateSampleText);
$('#whichSeries').live('change', updateSampleText);
$('#searchResults').on('change', '#whichSeries', updateSampleText);
});

View File

@ -1,4 +1,18 @@
$(document).ready(function(){
$('.seriesCheck').click(function(){
var serCheck = this;
$('.seasonCheck:visible').each(function(){
this.checked = serCheck.checked
});
$('.epCheck:visible').each(function(){
this.checked = serCheck.checked
});
});
$('.seasonCheck').click(function(){
var seasCheck = this;
var seasNo = $(seasCheck).attr('id');

View File

@ -1,27 +1,67 @@
import requests
import json
from sickbeard import logger
from requests.auth import HTTPBasicAuth
from exceptions import traktException, traktAuthException, traktServerBusy
class TraktAPI():
def __init__(self, apikey, username=None, password=None, use_https=False, timeout=5):
self.apikey = apikey
def __init__(self, apikey, username=None, password=None, disable_ssl_verify=False, timeout=30):
self.username = username
self.password = password
self.protocol = 'https://' if use_https else 'http://'
self.verify = not disable_ssl_verify
self.timeout = timeout
self.api_url = 'https://api.trakt.tv/'
self.headers = {
'Content-Type': 'application/json',
'trakt-api-version': '2',
'trakt-api-key': apikey,
}
def validateAccount(self):
return self.traktRequest("account/test/%APIKEY%", method='POST')
if hasattr(self, 'token'):
del(self.token)
data = {
'login': self.username,
'password': self.password
}
try:
resp = requests.request('POST', self.api_url+"auth/login", headers=self.headers,
data=json.dumps(data), timeout=self.timeout, verify=self.verify)
resp.raise_for_status()
resp = resp.json()
except (requests.HTTPError, requests.ConnectionError) as e:
code = getattr(e.response, 'status_code', None)
if not code:
# This is pretty much a fatal error if there is no status_code
# It means there basically was no response at all
raise traktException(e)
elif code == 502:
# Retry the request, cloudflare had a proxying issue
logger.log(u"Retrying trakt api request: auth/login", logger.WARNING)
return self.validateAccount()
elif code == 401:
raise traktAuthException(e)
elif code == 503:
raise traktServerBusy(e)
else:
raise traktException(e)
if 'token' in resp:
self.token = resp['token']
return True
return False
def traktRequest(self, url, data=None, method='GET'):
base_url = self.protocol + 'api.trakt.tv/%s' % url.replace('%APIKEY%', self.apikey).replace('%USER%',
self.username)
def traktRequest(self, path, data=None, method='GET'):
url = self.api_url + path
headers = self.headers
if not getattr(self, 'token', None):
self.validateAccount()
headers['trakt-user-login'] = self.username
headers['trakt-user-token'] = self.token
# request the URL from trakt and parse the result as json
try:
resp = requests.request(method, base_url, auth=HTTPBasicAuth(self.username, self.password), data=data if data else [])
resp = requests.request(method, url, headers=headers, timeout=self.timeout,
data=json.dumps(data) if data else [], verify=self.verify)
# check for http errors and raise if any are present
resp.raise_for_status()
@ -29,9 +69,18 @@ class TraktAPI():
# convert response to json
resp = resp.json()
except (requests.HTTPError, requests.ConnectionError) as e:
if e.response.status_code == 401:
code = getattr(e.response, 'status_code', None)
if not code:
# This is pretty much a fatal error if there is no status_code
# It means there basically was no response at all
raise traktException(e)
elif code == 502:
# Retry the request, cloudflare had a proxying issue
logger.log(u"Retrying trakt api request: %s" % path, logger.WARNING)
return self.traktRequest(path, data, method)
elif code == 401:
raise traktAuthException(e)
elif e.response.status_code == 503:
elif code == 503:
raise traktServerBusy(e)
else:
raise traktException(e)

View File

@ -2,3 +2,6 @@ f2570b5f7205f1433661a9508f464f691cf63389 0.97
d3595b2c9a1aec510f8ae1dcfef1eb8562a77fc0 0.99.1
d23822f936c663784c5edda09cd5a6effe1e882d 0.99.2
855a137f51581bd6d7a79264856020aa52fd0b66 0.99.3
160655e623388d65c35ac4c8e271b58566e8a489 0.99.4
8225eb999c02735d0aead538870c91270d41df0c 0.99.5
734f8f605597616bc102b60ca1e959d3a0ace5b6 0.99.6

View File

@ -1,27 +0,0 @@
Metadata-Version: 1.1
Name: pyUnRAR2
Version: 0.99.3
Summary: Improved Python wrapper around the free UnRAR.dll
Home-page: http://code.google.com/py-unrar2
Author: Konstantin Yegupov
Author-email: yk4ever@gmail.com
License: MIT
Description: pyUnRAR2 is a ctypes based wrapper around the free UnRAR.dll.
It is an modified version of Jimmy Retzlaff's pyUnRAR - more simple,
stable and foolproof.
Notice that it has INCOMPATIBLE interface.
It enables reading and unpacking of archives created with the
RAR/WinRAR archivers. There is a low-level interface which is very
similar to the C interface provided by UnRAR. There is also a
higher level interface which makes some common operations easier.
Platform: Windows
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Win32 (MS Windows)
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: System :: Archiving :: Compression

View File

@ -1,14 +1,15 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: package UnRAR2</title>
<meta charset="utf-8">
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong>UnRAR2</strong></big></big> (version 0.99.2)</font></td
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong>UnRAR2</strong></big></big> (version 0.99.5)</font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/rainman/dev/py-unrar2/UnRAR2/__init__.py">/home/rainman/dev/py-unrar2/UnRAR2/__init__.py</a></font></td></tr></table>
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:///Z:/py-unrar2/unrar2/__init__.py">z:\py-unrar2\unrar2\__init__.py</a></font></td></tr></table>
<p><tt>pyUnRAR2&nbsp;is&nbsp;a&nbsp;ctypes&nbsp;based&nbsp;wrapper&nbsp;around&nbsp;the&nbsp;free&nbsp;UnRAR.dll.&nbsp;<br>
&nbsp;<br>
It&nbsp;is&nbsp;an&nbsp;modified&nbsp;version&nbsp;of&nbsp;Jimmy&nbsp;Retzlaff's&nbsp;pyUnRAR&nbsp;-&nbsp;more&nbsp;simple,<br>
@ -40,7 +41,7 @@ higher&nbsp;level&nbsp;interface&nbsp;which&nbsp;makes&nbsp;some&nbsp;common&nbs
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a>(<a href="__builtin__.html#object">__builtin__.object</a>)
<dt><font face="helvetica, arial"><a href="UnRAR2.windows.html#RarFileImplementation">UnRAR2.windows.RarFileImplementation</a>(<a href="__builtin__.html#object">__builtin__.object</a>)
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="UnRAR2.html#RarFile">RarFile</a>
@ -57,12 +58,12 @@ higher&nbsp;level&nbsp;interface&nbsp;which&nbsp;makes&nbsp;some&nbsp;common&nbs
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="RarFile">class <strong>RarFile</strong></a>(<a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a>)</font></td></tr>
<font color="#000000" face="helvetica, arial"><a name="RarFile">class <strong>RarFile</strong></a>(<a href="UnRAR2.windows.html#RarFileImplementation">UnRAR2.windows.RarFileImplementation</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="UnRAR2.html#RarFile">RarFile</a></dd>
<dd><a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a></dd>
<dd><a href="UnRAR2.windows.html#RarFileImplementation">UnRAR2.windows.RarFileImplementation</a></dd>
<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
</dl>
<hr>
@ -96,6 +97,9 @@ If&nbsp;"condition"&nbsp;is&nbsp;omitted,&nbsp;all&nbsp;files&nbsp;are&nbsp;extr
&nbsp;<br>
Returns&nbsp;list&nbsp;of&nbsp;RarInfos&nbsp;for&nbsp;extracted&nbsp;files.</tt></dd></dl>
<dl><dt><a name="RarFile-get_volume"><strong>get_volume</strong></a>(self)</dt><dd><tt>Determine&nbsp;which&nbsp;volume&nbsp;is&nbsp;it&nbsp;in&nbsp;a&nbsp;multi-volume&nbsp;archive.&nbsp;Returns&nbsp;None&nbsp;if&nbsp;it's&nbsp;not&nbsp;a&nbsp;<br>
multi-volume&nbsp;archive,&nbsp;0-based&nbsp;volume&nbsp;number&nbsp;otherwise.</tt></dd></dl>
<dl><dt><a name="RarFile-infoiter"><strong>infoiter</strong></a>(self)</dt><dd><tt>Iterate&nbsp;over&nbsp;all&nbsp;the&nbsp;files&nbsp;in&nbsp;the&nbsp;archive,&nbsp;generating&nbsp;RarInfos.<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;import&nbsp;os<br>
@ -122,17 +126,15 @@ If&nbsp;"condition"&nbsp;is&nbsp;omitted,&nbsp;all&nbsp;files&nbsp;are&nbsp;retu
Returns&nbsp;list&nbsp;of&nbsp;tuples&nbsp;(<a href="#RarInfo">RarInfo</a>&nbsp;info,&nbsp;str&nbsp;contents)</tt></dd></dl>
<hr>
Methods inherited from <a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a>:<br>
<dl><dt><a name="RarFile-call"><strong>call</strong></a>(self, cmd, options<font color="#909090">=[]</font>, files<font color="#909090">=[]</font>)</dt></dl>
Methods inherited from <a href="UnRAR2.windows.html#RarFileImplementation">UnRAR2.windows.RarFileImplementation</a>:<br>
<dl><dt><a name="RarFile-destruct"><strong>destruct</strong></a>(self)</dt></dl>
<dl><dt><a name="RarFile-escaped_password"><strong>escaped_password</strong></a>(self)</dt></dl>
<dl><dt><a name="RarFile-init"><strong>init</strong></a>(self, password<font color="#909090">=None</font>)</dt></dl>
<dl><dt><a name="RarFile-make_sure_ready"><strong>make_sure_ready</strong></a>(self)</dt></dl>
<hr>
Data descriptors inherited from <a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a>:<br>
Data descriptors inherited from <a href="UnRAR2.windows.html#RarFileImplementation">UnRAR2.windows.RarFileImplementation</a>:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
@ -189,6 +191,6 @@ Data descriptors defined here:<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>__version__</strong> = '0.99.2'<br>
<strong>in_windows</strong> = False</td></tr></table>
<td width="100%"><strong>__version__</strong> = '0.99.5'<br>
<strong>in_windows</strong> = True</td></tr></table>
</body></html>

BIN
lib/unrar2/[test].rar Normal file

Binary file not shown.

2
lib/unrar2/[test].txt Normal file
View File

@ -0,0 +1,2 @@
test
test

View File

@ -33,7 +33,7 @@ similar to the C interface provided by UnRAR. There is also a
higher level interface which makes some common operations easier.
"""
__version__ = '0.99.3'
__version__ = '0.99.6'
try:
WindowsError
@ -75,8 +75,6 @@ class RarInfo(object):
self.datetime = data['datetime']
self.comment = data['comment']
def __str__(self):
try :
arcName = self.rarfile.archiveName
@ -159,6 +157,11 @@ class RarFile(RarFileImplementation):
checker = condition2checker(condition)
return RarFileImplementation.extract(self, checker, path, withSubpath, overwrite)
def get_volume(self):
"""Determine which volume is it in a multi-volume archive. Returns None if it's not a
multi-volume archive, 0-based volume number otherwise."""
return RarFileImplementation.get_volume(self)
def condition2checker(condition):
"""Converts different condition types to callback"""
if type(condition) in [str, unicode]:

View File

@ -1,7 +1,10 @@
import os, sys
import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)
import UnRAR2
from UnRAR2.rar_exceptions import *
import unrar2 as UnRAR2
from unrar2.rar_exceptions import *
def cleanup(dir='test'):
@ -15,6 +18,7 @@ def cleanup(dir='test'):
# basic test
cleanup()
rarc = UnRAR2.RarFile('test.rar')
assert rarc.get_volume() == None
rarc.infolist()
assert rarc.comment == "This is a test."
for info in rarc.infoiter():
@ -28,6 +32,21 @@ del rarc
assert (str(saveinfo)=="""<RarInfo "test" in "[ARCHIVE_NO_LONGER_LOADED]">""")
cleanup()
# shell-unsafe-name test
cleanup()
rarc = UnRAR2.RarFile('[test].rar')
rarc.infolist()
for info in rarc.infoiter():
saveinfo = info
assert (str(info)=="""<RarInfo "[test].txt" in "[test].rar">""")
break
rarc.extract()
assert os.path.exists('[test].txt')
del rarc
assert (str(saveinfo)=="""<RarInfo "[test].txt" in "[ARCHIVE_NO_LONGER_LOADED]">""")
cleanup()
# extract all the files in test.rar
cleanup()
UnRAR2.RarFile('test.rar').extract()
@ -108,6 +127,15 @@ except IncorrectRARPassword:
assert not os.path.exists('test'+os.sep+'top_secret_xxx_file.txt')
assert errored
cleanup()
errored = False
try:
UnRAR2.RarFile('test_protected_files.rar').extract()
except IncorrectRARPassword:
errored = True
assert not os.path.exists('test'+os.sep+'top_secret_xxx_file.txt')
assert errored
cleanup()
# extract files from an archive with protected headers
cleanup()
@ -122,6 +150,27 @@ except IncorrectRARPassword:
assert not os.path.exists('test'+os.sep+'top_secret_xxx_file.txt')
assert errored
cleanup()
errored = False
try:
UnRAR2.RarFile('test_protected_headers.rar').extract()
except IncorrectRARPassword:
errored = True
assert not os.path.exists('test'+os.sep+'top_secret_xxx_file.txt')
assert errored
cleanup()
# check volume number
cleanup()
rarc1 = UnRAR2.RarFile('test_volumes.part1.rar')
assert rarc1.get_volume() == 0
rarc2 = UnRAR2.RarFile('test_volumes.part2.rar')
assert rarc2.get_volume() == 1
cleanup()
rarc1 = UnRAR2.RarFile('test_volumes_old.rar')
assert rarc1.get_volume() == 0
rarc2 = UnRAR2.RarFile('test_volumes_old.r00')
assert rarc2.get_volume() == 1
cleanup()
# make sure docstring examples are working
import doctest

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -74,13 +74,13 @@ class RarFileImplementation(object):
accum = []
source = iter(stdoutdata.splitlines())
line = ''
while not (line.startswith('UNRAR')):
while (line.find('RAR ') == -1):
line = source.next()
signature = line
# The code below is mighty flaky
# and will probably crash on localized versions of RAR
# but I see no safe way to rewrite it using a CLI tool
if signature.startswith("UNRAR 4"):
if signature.find("RAR 4") > -1:
rar_executable_version = 4
while not (line.startswith('Comment:') or line.startswith('Pathname/Comment')):
if line.strip().endswith('is not RAR archive'):
@ -94,7 +94,7 @@ class RarFileImplementation(object):
self.comment = '\n'.join(accum[:-1])
else:
self.comment = None
elif signature.startswith("UNRAR 5"):
elif signature.find("RAR 5") > -1:
rar_executable_version = 5
line = source.next()
while not line.startswith('Archive:'):
@ -155,6 +155,7 @@ class RarFileImplementation(object):
data['isdir'] = 'd' in attr.lower()
data['datetime'] = time.strptime(fields[3]+" "+fields[4], '%d-%m-%y %H:%M')
data['comment'] = None
data['volume'] = None
yield data
accum = []
i += 1
@ -170,6 +171,7 @@ class RarFileImplementation(object):
data['isdir'] = 'd' in attr.lower()
data['datetime'] = time.strptime(fields[2]+" "+fields[3], '%d-%m-%y %H:%M')
data['comment'] = None
data['volume'] = None
yield data
i += 1
line = source.next()
@ -215,4 +217,41 @@ class RarFileImplementation(object):
def destruct(self):
pass
def get_volume(self):
command = "v" if rar_executable_version == 4 else "l"
stdoutdata, stderrdata = self.call(command, ['c-']).communicate()
for line in stderrdata.splitlines():
if line.strip().startswith("Cannot open"):
raise FileOpenError
source = iter(stdoutdata.splitlines())
line = ''
while not line.startswith('-----------'):
if line.strip().endswith('is not RAR archive'):
raise InvalidRARArchive
if line.startswith("CRC failed") or line.startswith("Checksum error"):
raise IncorrectRARPassword
line = source.next()
line = source.next()
if rar_executable_version == 4:
while not line.startswith('-----------'):
line = source.next()
line = source.next()
items = line.strip().split()
if len(items)>4 and items[4]=="volume":
return int(items[5]) - 1
else:
return None
elif rar_executable_version == 5:
while not line.startswith('-----------'):
line = source.next()
line = source.next()
items = line.strip().split()
if items[1]=="volume":
return int(items[2]) - 1
else:
return None

View File

@ -25,7 +25,7 @@
from __future__ import generators
import ctypes, ctypes.wintypes
import os, os.path, sys
import os, os.path, sys, re
import Queue
import time
@ -43,6 +43,7 @@ ERAR_EREAD = 18
ERAR_EWRITE = 19
ERAR_SMALL_BUF = 20
ERAR_UNKNOWN = 21
ERAR_MISSING_PASSWORD = 22
RAR_OM_LIST = 0
RAR_OM_EXTRACT = 1
@ -66,6 +67,9 @@ dll_name = "unrar.dll"
if architecture_bits == 64:
dll_name = "x64\\unrar64.dll"
volume_naming1 = re.compile("\.r([0-9]{2})$")
volume_naming2 = re.compile("\.([0-9]{3}).rar$")
volume_naming3 = re.compile("\.part([0-9]+).rar$")
try:
unrar = ctypes.WinDLL(os.path.join(os.path.split(__file__)[0], 'UnRARDLL', dll_name))
@ -188,7 +192,7 @@ class RarInfoIterator(object):
self.index = 0
self.headerData = RARHeaderDataEx()
self.res = RARReadHeaderEx(self.arc._handle, ctypes.byref(self.headerData))
if self.res==ERAR_BAD_DATA:
if self.res in [ERAR_BAD_DATA, ERAR_MISSING_PASSWORD]:
raise IncorrectRARPassword
self.arc.lockStatus = "locked"
self.arc.needskip = False
@ -208,7 +212,7 @@ class RarInfoIterator(object):
data = {}
data['index'] = self.index
data['filename'] = self.headerData.FileName
data['filename'] = self.headerData.FileNameW
data['datetime'] = DosDateTimeToTimeTuple(self.headerData.FileTime)
data['isdir'] = ((self.headerData.Flags & 0xE0) == 0xE0)
data['size'] = self.headerData.UnpSize + (self.headerData.UnpSizeHigh << 32)
@ -252,6 +256,7 @@ class RarFileImplementation(object):
self.lockStatus = "ready"
self.isVolume = archiveData.Flags & 1
def destruct(self):
@ -277,7 +282,7 @@ class RarFileImplementation(object):
c_callback = UNRARCALLBACK(reader._callback)
RARSetCallback(self._handle, c_callback, 1)
tmpres = RARProcessFile(self._handle, RAR_TEST, None, None)
if tmpres==ERAR_BAD_DATA:
if tmpres in [ERAR_BAD_DATA, ERAR_MISSING_PASSWORD]:
raise IncorrectRARPassword
self.needskip = False
res.append((info, reader.get_result()))
@ -299,11 +304,29 @@ class RarFileImplementation(object):
target = checkres
if overwrite or (not os.path.exists(target)):
tmpres = RARProcessFile(self._handle, RAR_EXTRACT, None, target)
if tmpres==ERAR_BAD_DATA:
if tmpres in [ERAR_BAD_DATA, ERAR_MISSING_PASSWORD]:
raise IncorrectRARPassword
self.needskip = False
res.append(info)
return res
def get_volume(self):
if not self.isVolume:
return None
headerData = RARHeaderDataEx()
res = RARReadHeaderEx(self._handle, ctypes.byref(headerData))
arcName = headerData.ArcNameW
match3 = volume_naming3.search(arcName)
if match3 != None:
return int(match3.group(1)) - 1
match2 = volume_naming3.search(arcName)
if match2 != None:
return int(match2.group(1))
match1 = volume_naming1.search(arcName)
if match1 != None:
return int(match1.group(1)) + 1
return 0

View File

@ -32,8 +32,8 @@ from github import Github
from sickbeard import providers, metadata, config, webserveInit
from sickbeard.providers.generic import GenericProvider
from providers import ezrss, tvtorrents, btn, newznab, womble, thepiratebay, torrentleech, kat, iptorrents, \
omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, nextgen, speedcd, nyaatorrents, fanzub, torrentbytes, animezb, \
from providers import ezrss, btn, newznab, womble, thepiratebay, torrentleech, kat, iptorrents, \
omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, nextgen, speedcd, nyaatorrents, fanzub, torrentbytes, animezb, \
freshontv, bitsoup, t411, tokyotoshokan
from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, \
naming_ep_type
@ -125,6 +125,8 @@ started = False
ACTUAL_LOG_DIR = None
LOG_DIR = None
LOG_NR = 5
LOG_SIZE = 1048576
SOCKET_TIMEOUT = None
@ -138,6 +140,8 @@ WEB_IPV6 = None
PLAY_VIDEOS = False
DOWNLOAD_URL = None
HANDLE_REVERSE_PROXY = False
PROXY_SETTING = None
PROXY_INDEXERS = True
@ -282,6 +286,7 @@ TORRENT_HIGH_BANDWIDTH = False
TORRENT_LABEL = ''
TORRENT_LABEL_ANIME = ''
TORRENT_VERIFY_CERT = False
TORRENT_RPCURL = 'transmission'
USE_KODI = False
KODI_ALWAYS_ON = True
@ -312,6 +317,13 @@ GROWL_NOTIFY_ONSUBTITLEDOWNLOAD = False
GROWL_HOST = ''
GROWL_PASSWORD = None
USE_FREEMOBILE = False
FREEMOBILE_NOTIFY_ONSNATCH = False
FREEMOBILE_NOTIFY_ONDOWNLOAD = False
FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD = False
FREEMOBILE_ID = ''
FREEMOBILE_APIKEY= ''
USE_PROWL = False
PROWL_NOTIFY_ONSNATCH = False
PROWL_NOTIFY_ONDOWNLOAD = False
@ -381,7 +393,6 @@ SYNOLOGYNOTIFIER_NOTIFY_ONSUBTITLEDOWNLOAD = False
USE_TRAKT = False
TRAKT_USERNAME = None
TRAKT_PASSWORD = None
TRAKT_API = ''
TRAKT_REMOVE_WATCHLIST = False
TRAKT_REMOVE_SERIESLIST = False
TRAKT_USE_WATCHLIST = False
@ -390,6 +401,7 @@ TRAKT_START_PAUSED = False
TRAKT_USE_RECOMMENDED = False
TRAKT_SYNC = False
TRAKT_DEFAULT_INDEXER = None
TRAKT_DISABLE_SSL_VERIFY = False
USE_PYTIVO = False
PYTIVO_NOTIFY_ONSNATCH = False
@ -440,6 +452,7 @@ COMING_EPS_LAYOUT = None
COMING_EPS_DISPLAY_PAUSED = False
COMING_EPS_SORT = None
COMING_EPS_MISSED_RANGE = None
DISPLAY_FILESIZE = False
FUZZY_DATING = False
TRIM_ZERO = False
DATE_PRESET = None
@ -470,7 +483,7 @@ REQUIRE_WORDS = ""
CALENDAR_UNPROTECTED = False
TMDB_API_KEY = 'edc5f123313769de83a71e157758030b'
TRAKT_API_KEY = 'abd806c54516240c76e4ebc9c5ccf394'
TRAKT_API_KEY = 'd4161a7a106424551add171e5470112e4afdaf2438e6ef2fe0548edc75924868'
FANART_API_KEY = '9b3afaf26f6241bdb57d6cc6bd798da7'
__INITIALIZED__ = False
@ -484,20 +497,20 @@ def get_backlog_cycle_time():
def initialize(consoleLogging=True):
with INIT_LOCK:
global BRANCH, GIT_RESET, GIT_REMOTE, GIT_REMOTE_URL, CUR_COMMIT_HASH, CUR_COMMIT_BRANCH, ACTUAL_LOG_DIR, LOG_DIR, WEB_PORT, WEB_LOG, ENCRYPTION_VERSION, WEB_ROOT, WEB_USERNAME, WEB_PASSWORD, WEB_HOST, WEB_IPV6, API_KEY, API_ROOT, ENABLE_HTTPS, HTTPS_CERT, HTTPS_KEY, \
global BRANCH, GIT_RESET, GIT_REMOTE, GIT_REMOTE_URL, CUR_COMMIT_HASH, CUR_COMMIT_BRANCH, ACTUAL_LOG_DIR, LOG_DIR, LOG_NR, LOG_SIZE, WEB_PORT, WEB_LOG, ENCRYPTION_VERSION, WEB_ROOT, WEB_USERNAME, WEB_PASSWORD, WEB_HOST, WEB_IPV6, API_KEY, API_ROOT, ENABLE_HTTPS, HTTPS_CERT, HTTPS_KEY, \
HANDLE_REVERSE_PROXY, USE_NZBS, USE_TORRENTS, NZB_METHOD, NZB_DIR, DOWNLOAD_PROPERS, RANDOMIZE_PROVIDERS, CHECK_PROPERS_INTERVAL, ALLOW_HIGH_PRIORITY, TORRENT_METHOD, \
SAB_USERNAME, SAB_PASSWORD, SAB_APIKEY, SAB_CATEGORY, SAB_CATEGORY_ANIME, SAB_HOST, \
NZBGET_USERNAME, NZBGET_PASSWORD, NZBGET_CATEGORY, NZBGET_CATEGORY_ANIME, NZBGET_PRIORITY, NZBGET_HOST, NZBGET_USE_HTTPS, backlogSearchScheduler, \
TORRENT_USERNAME, TORRENT_PASSWORD, TORRENT_HOST, TORRENT_PATH, TORRENT_SEED_TIME, TORRENT_PAUSED, TORRENT_HIGH_BANDWIDTH, TORRENT_LABEL, TORRENT_LABEL_ANIME, TORRENT_VERIFY_CERT, \
TORRENT_USERNAME, TORRENT_PASSWORD, TORRENT_HOST, TORRENT_PATH, TORRENT_SEED_TIME, TORRENT_PAUSED, TORRENT_HIGH_BANDWIDTH, TORRENT_LABEL, TORRENT_LABEL_ANIME, TORRENT_VERIFY_CERT, TORRENT_RPCURL, \
USE_KODI, KODI_ALWAYS_ON, KODI_NOTIFY_ONSNATCH, KODI_NOTIFY_ONDOWNLOAD, KODI_NOTIFY_ONSUBTITLEDOWNLOAD, KODI_UPDATE_FULL, KODI_UPDATE_ONLYFIRST, \
KODI_UPDATE_LIBRARY, KODI_HOST, KODI_USERNAME, KODI_PASSWORD, BACKLOG_FREQUENCY, \
USE_TRAKT, TRAKT_USERNAME, TRAKT_PASSWORD, TRAKT_API, TRAKT_REMOVE_WATCHLIST, TRAKT_USE_WATCHLIST, TRAKT_METHOD_ADD, TRAKT_START_PAUSED, traktCheckerScheduler, TRAKT_USE_RECOMMENDED, TRAKT_SYNC, TRAKT_DEFAULT_INDEXER, TRAKT_REMOVE_SERIESLIST, \
USE_TRAKT, TRAKT_USERNAME, TRAKT_PASSWORD, TRAKT_REMOVE_WATCHLIST, TRAKT_USE_WATCHLIST, TRAKT_METHOD_ADD, TRAKT_START_PAUSED, traktCheckerScheduler, TRAKT_USE_RECOMMENDED, TRAKT_SYNC, TRAKT_DEFAULT_INDEXER, TRAKT_REMOVE_SERIESLIST, TRAKT_DISABLE_SSL_VERIFY, \
USE_PLEX, PLEX_NOTIFY_ONSNATCH, PLEX_NOTIFY_ONDOWNLOAD, PLEX_NOTIFY_ONSUBTITLEDOWNLOAD, PLEX_UPDATE_LIBRARY, \
PLEX_SERVER_HOST, PLEX_HOST, PLEX_USERNAME, PLEX_PASSWORD, DEFAULT_BACKLOG_FREQUENCY, MIN_BACKLOG_FREQUENCY, BACKLOG_STARTUP, SKIP_REMOVED_FILES, \
showUpdateScheduler, __INITIALIZED__, LAUNCH_BROWSER, UPDATE_SHOWS_ON_START, TRASH_REMOVE_SHOW, TRASH_ROTATE_LOGS, SORT_ARTICLE, showList, loadingShowList, \
NEWZNAB_DATA, NZBS, NZBS_UID, NZBS_HASH, INDEXER_DEFAULT, INDEXER_TIMEOUT, USENET_RETENTION, TORRENT_DIR, \
QUALITY_DEFAULT, FLATTEN_FOLDERS_DEFAULT, SUBTITLES_DEFAULT, STATUS_DEFAULT, DAILYSEARCH_STARTUP, \
GROWL_NOTIFY_ONSNATCH, GROWL_NOTIFY_ONDOWNLOAD, GROWL_NOTIFY_ONSUBTITLEDOWNLOAD, TWITTER_NOTIFY_ONSNATCH, TWITTER_NOTIFY_ONDOWNLOAD, TWITTER_NOTIFY_ONSUBTITLEDOWNLOAD, \
GROWL_NOTIFY_ONSNATCH, GROWL_NOTIFY_ONDOWNLOAD, GROWL_NOTIFY_ONSUBTITLEDOWNLOAD, TWITTER_NOTIFY_ONSNATCH, TWITTER_NOTIFY_ONDOWNLOAD, TWITTER_NOTIFY_ONSUBTITLEDOWNLOAD, USE_FREEMOBILE, FREEMOBILE_ID, FREEMOBILE_APIKEY, FREEMOBILE_NOTIFY_ONSNATCH, FREEMOBILE_NOTIFY_ONDOWNLOAD, FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD, \
USE_GROWL, GROWL_HOST, GROWL_PASSWORD, USE_PROWL, PROWL_NOTIFY_ONSNATCH, PROWL_NOTIFY_ONDOWNLOAD, PROWL_NOTIFY_ONSUBTITLEDOWNLOAD, PROWL_API, PROWL_PRIORITY, PROG_DIR, \
USE_PYTIVO, PYTIVO_NOTIFY_ONSNATCH, PYTIVO_NOTIFY_ONDOWNLOAD, PYTIVO_NOTIFY_ONSUBTITLEDOWNLOAD, PYTIVO_UPDATE_LIBRARY, PYTIVO_HOST, PYTIVO_SHARE_NAME, PYTIVO_TIVO_NAME, \
USE_NMA, NMA_NOTIFY_ONSNATCH, NMA_NOTIFY_ONDOWNLOAD, NMA_NOTIFY_ONSUBTITLEDOWNLOAD, NMA_API, NMA_PRIORITY, \
@ -518,14 +531,14 @@ def initialize(consoleLogging=True):
USE_EMAIL, EMAIL_HOST, EMAIL_PORT, EMAIL_TLS, EMAIL_USER, EMAIL_PASSWORD, EMAIL_FROM, EMAIL_NOTIFY_ONSNATCH, EMAIL_NOTIFY_ONDOWNLOAD, EMAIL_NOTIFY_ONSUBTITLEDOWNLOAD, EMAIL_LIST, \
USE_LISTVIEW, METADATA_KODI, METADATA_KODI_12PLUS, METADATA_MEDIABROWSER, METADATA_PS3, metadata_provider_dict, \
NEWZBIN, NEWZBIN_USERNAME, NEWZBIN_PASSWORD, GIT_PATH, MOVE_ASSOCIATED_FILES, POSTPONE_IF_SYNC_FILES, dailySearchScheduler, NFO_RENAME, \
GUI_NAME, HOME_LAYOUT, HISTORY_LAYOUT, DISPLAY_SHOW_SPECIALS, COMING_EPS_LAYOUT, COMING_EPS_SORT, COMING_EPS_DISPLAY_PAUSED, COMING_EPS_MISSED_RANGE, FUZZY_DATING, TRIM_ZERO, DATE_PRESET, TIME_PRESET, TIME_PRESET_W_SECONDS, THEME_NAME, \
GUI_NAME, HOME_LAYOUT, HISTORY_LAYOUT, DISPLAY_SHOW_SPECIALS, COMING_EPS_LAYOUT, COMING_EPS_SORT, COMING_EPS_DISPLAY_PAUSED, COMING_EPS_MISSED_RANGE, DISPLAY_FILESIZE, FUZZY_DATING, TRIM_ZERO, DATE_PRESET, TIME_PRESET, TIME_PRESET_W_SECONDS, THEME_NAME, \
POSTER_SORTBY, POSTER_SORTDIR, \
METADATA_WDTV, METADATA_TIVO, METADATA_MEDE8ER, IGNORE_WORDS, REQUIRE_WORDS, CALENDAR_UNPROTECTED, CREATE_MISSING_SHOW_DIRS, \
ADD_SHOWS_WO_DIR, USE_SUBTITLES, SUBTITLES_LANGUAGES, SUBTITLES_DIR, SUBTITLES_SERVICES_LIST, SUBTITLES_SERVICES_ENABLED, SUBTITLES_HISTORY, SUBTITLES_FINDER_FREQUENCY, SUBTITLES_MULTI, subtitlesFinderScheduler, \
USE_FAILED_DOWNLOADS, DELETE_FAILED, ANON_REDIRECT, LOCALHOST_IP, TMDB_API_KEY, DEBUG, PROXY_SETTING, PROXY_INDEXERS, \
AUTOPOSTPROCESSER_FREQUENCY, DEFAULT_AUTOPOSTPROCESSER_FREQUENCY, MIN_AUTOPOSTPROCESSER_FREQUENCY, \
ANIME_DEFAULT, NAMING_ANIME, ANIMESUPPORT, USE_ANIDB, ANIDB_USERNAME, ANIDB_PASSWORD, ANIDB_USE_MYLIST, \
ANIME_SPLIT_HOME, SCENE_DEFAULT, PLAY_VIDEOS, BACKLOG_DAYS, GIT_ORG, GIT_REPO, GIT_USERNAME, GIT_PASSWORD, \
ANIME_SPLIT_HOME, SCENE_DEFAULT, PLAY_VIDEOS, DOWNLOAD_URL, BACKLOG_DAYS, GIT_ORG, GIT_REPO, GIT_USERNAME, GIT_PASSWORD, \
GIT_AUTOISSUES, gh
if __INITIALIZED__:
@ -568,7 +581,8 @@ def initialize(consoleLogging=True):
ACTUAL_LOG_DIR = check_setting_str(CFG, 'General', 'log_dir', 'Logs')
LOG_DIR = os.path.normpath(os.path.join(DATA_DIR, ACTUAL_LOG_DIR))
LOG_NR = check_setting_int(CFG, 'General', 'log_nr', 5) #Default to 5 backup file (sickrage.log.x)
LOG_SIZE = check_setting_int(CFG, 'General', 'log_size', 1048576) #Default to max 1MB per logfile
fileLogging = True
if not helpers.makeDir(LOG_DIR):
sys.stderr.write("!!! No log folder, logging to screen only!\n")
@ -640,6 +654,8 @@ def initialize(consoleLogging=True):
PLAY_VIDEOS = bool(check_setting_int(CFG, 'General', 'play_videos', 0))
DOWNLOAD_URL = check_setting_str(CFG, 'General', 'download_url', "")
LOCALHOST_IP = check_setting_str(CFG, 'General', 'localhost_ip', '')
CPU_PRESET = check_setting_str(CFG, 'General', 'cpu_preset', 'NORMAL')
@ -794,6 +810,7 @@ def initialize(consoleLogging=True):
TORRENT_LABEL = check_setting_str(CFG, 'TORRENT', 'torrent_label', '')
TORRENT_LABEL_ANIME = check_setting_str(CFG, 'TORRENT', 'torrent_label_anime', '')
TORRENT_VERIFY_CERT = bool(check_setting_int(CFG, 'TORRENT', 'torrent_verify_cert', 0))
TORRENT_RPCURL = check_setting_str(CFG, 'TORRENT', 'torrent_rpcurl', 'transmission')
USE_KODI = bool(check_setting_int(CFG, 'KODI', 'use_kodi', 0))
KODI_ALWAYS_ON = bool(check_setting_int(CFG, 'KODI', 'kodi_always_on', 1))
@ -824,6 +841,13 @@ def initialize(consoleLogging=True):
GROWL_HOST = check_setting_str(CFG, 'Growl', 'growl_host', '')
GROWL_PASSWORD = check_setting_str(CFG, 'Growl', 'growl_password', '', censor_log=True)
USE_FREEMOBILE = bool(check_setting_int(CFG, 'FreeMobile', 'use_freemobile', 0))
FREEMOBILE_NOTIFY_ONSNATCH = bool(check_setting_int(CFG, 'FreeMobile', 'freemobile_notify_onsnatch', 0))
FREEMOBILE_NOTIFY_ONDOWNLOAD = bool(check_setting_int(CFG, 'FreeMobile', 'freemobile_notify_ondownload', 0))
FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD = bool(check_setting_int(CFG, 'FreeMobile', 'freemobile_notify_onsubtitledownload', 0))
FREEMOBILE_ID = check_setting_str(CFG, 'FreeMobile', 'freemobile_id', '')
FREEMOBILE_APIKEY = check_setting_str(CFG, 'FreeMobile', 'freemobile_apikey', '')
USE_PROWL = bool(check_setting_int(CFG, 'Prowl', 'use_prowl', 0))
PROWL_NOTIFY_ONSNATCH = bool(check_setting_int(CFG, 'Prowl', 'prowl_notify_onsnatch', 0))
PROWL_NOTIFY_ONDOWNLOAD = bool(check_setting_int(CFG, 'Prowl', 'prowl_notify_ondownload', 0))
@ -889,7 +913,6 @@ def initialize(consoleLogging=True):
USE_TRAKT = bool(check_setting_int(CFG, 'Trakt', 'use_trakt', 0))
TRAKT_USERNAME = check_setting_str(CFG, 'Trakt', 'trakt_username', '', censor_log=True)
TRAKT_PASSWORD = check_setting_str(CFG, 'Trakt', 'trakt_password', '', censor_log=True)
TRAKT_API = check_setting_str(CFG, 'Trakt', 'trakt_api', '', censor_log=True)
TRAKT_REMOVE_WATCHLIST = bool(check_setting_int(CFG, 'Trakt', 'trakt_remove_watchlist', 0))
TRAKT_REMOVE_SERIESLIST = bool(check_setting_int(CFG, 'Trakt', 'trakt_remove_serieslist', 0))
TRAKT_USE_WATCHLIST = bool(check_setting_int(CFG, 'Trakt', 'trakt_use_watchlist', 0))
@ -898,6 +921,7 @@ def initialize(consoleLogging=True):
TRAKT_USE_RECOMMENDED = bool(check_setting_int(CFG, 'Trakt', 'trakt_use_recommended', 0))
TRAKT_SYNC = bool(check_setting_int(CFG, 'Trakt', 'trakt_sync', 0))
TRAKT_DEFAULT_INDEXER = check_setting_int(CFG, 'Trakt', 'trakt_default_indexer', 1)
TRAKT_DISABLE_SSL_VERIFY = bool(check_setting_int(CFG, 'Trakt', 'trakt_disable_ssl_verify', 0))
CheckSection(CFG, 'pyTivo')
USE_PYTIVO = bool(check_setting_int(CFG, 'pyTivo', 'use_pytivo', 0))
@ -995,6 +1019,7 @@ def initialize(consoleLogging=True):
COMING_EPS_DISPLAY_PAUSED = bool(check_setting_int(CFG, 'GUI', 'coming_eps_display_paused', 0))
COMING_EPS_SORT = check_setting_str(CFG, 'GUI', 'coming_eps_sort', 'date')
COMING_EPS_MISSED_RANGE = check_setting_int(CFG, 'GUI', 'coming_eps_missed_range', 7)
DISPLAY_FILESIZE = bool(check_setting_int(CFG, 'GUI', 'display_filesize', 0))
FUZZY_DATING = bool(check_setting_int(CFG, 'GUI', 'fuzzy_dating', 0))
TRIM_ZERO = bool(check_setting_int(CFG, 'GUI', 'trim_zero', 0))
DATE_PRESET = check_setting_str(CFG, 'GUI', 'date_preset', '%x')
@ -1422,6 +1447,8 @@ def save_config():
new_config['General']['config_version'] = CONFIG_VERSION
new_config['General']['encryption_version'] = int(ENCRYPTION_VERSION)
new_config['General']['log_dir'] = ACTUAL_LOG_DIR if ACTUAL_LOG_DIR else 'Logs'
new_config['General']['log_nr'] = int(LOG_NR)
new_config['General']['log_size'] = int(LOG_SIZE)
new_config['General']['socket_timeout'] = SOCKET_TIMEOUT
new_config['General']['web_port'] = WEB_PORT
new_config['General']['web_host'] = WEB_HOST
@ -1431,6 +1458,7 @@ def save_config():
new_config['General']['web_username'] = WEB_USERNAME
new_config['General']['web_password'] = helpers.encrypt(WEB_PASSWORD, ENCRYPTION_VERSION)
new_config['General']['play_videos'] = int(PLAY_VIDEOS)
new_config['General']['download_url'] = DOWNLOAD_URL
new_config['General']['localhost_ip'] = LOCALHOST_IP
new_config['General']['cpu_preset'] = CPU_PRESET
new_config['General']['anon_redirect'] = ANON_REDIRECT
@ -1645,6 +1673,7 @@ def save_config():
new_config['TORRENT']['torrent_label'] = TORRENT_LABEL
new_config['TORRENT']['torrent_label_anime'] = TORRENT_LABEL_ANIME
new_config['TORRENT']['torrent_verify_cert'] = int(TORRENT_VERIFY_CERT)
new_config['TORRENT']['torrent_rpcurl'] = TORRENT_RPCURL
new_config['KODI'] = {}
new_config['KODI']['use_kodi'] = int(USE_KODI)
@ -1678,6 +1707,14 @@ def save_config():
new_config['Growl']['growl_host'] = GROWL_HOST
new_config['Growl']['growl_password'] = helpers.encrypt(GROWL_PASSWORD, ENCRYPTION_VERSION)
new_config['FreeMobile'] = {}
new_config['FreeMobile']['use_freemobile'] = int(USE_FREEMOBILE)
new_config['FreeMobile']['freemobile_notify_onsnatch'] = int(FREEMOBILE_NOTIFY_ONSNATCH)
new_config['FreeMobile']['freemobile_notify_ondownload'] = int(FREEMOBILE_NOTIFY_ONDOWNLOAD)
new_config['FreeMobile']['freemobile_notify_onsubtitledownload'] = int(FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD)
new_config['FreeMobile']['freemobile_id'] = FREEMOBILE_ID
new_config['FreeMobile']['freemobile_apikey'] = FREEMOBILE_APIKEY
new_config['Prowl'] = {}
new_config['Prowl']['use_prowl'] = int(USE_PROWL)
new_config['Prowl']['prowl_notify_onsnatch'] = int(PROWL_NOTIFY_ONSNATCH)
@ -1749,7 +1786,6 @@ def save_config():
new_config['Trakt']['use_trakt'] = int(USE_TRAKT)
new_config['Trakt']['trakt_username'] = TRAKT_USERNAME
new_config['Trakt']['trakt_password'] = helpers.encrypt(TRAKT_PASSWORD, ENCRYPTION_VERSION)
new_config['Trakt']['trakt_api'] = TRAKT_API
new_config['Trakt']['trakt_remove_watchlist'] = int(TRAKT_REMOVE_WATCHLIST)
new_config['Trakt']['trakt_remove_serieslist'] = int(TRAKT_REMOVE_SERIESLIST)
new_config['Trakt']['trakt_use_watchlist'] = int(TRAKT_USE_WATCHLIST)
@ -1758,6 +1794,7 @@ def save_config():
new_config['Trakt']['trakt_use_recommended'] = int(TRAKT_USE_RECOMMENDED)
new_config['Trakt']['trakt_sync'] = int(TRAKT_SYNC)
new_config['Trakt']['trakt_default_indexer'] = int(TRAKT_DEFAULT_INDEXER)
new_config['Trakt']['trakt_disable_ssl_verify'] = int(TRAKT_DISABLE_SSL_VERIFY)
new_config['pyTivo'] = {}
new_config['pyTivo']['use_pytivo'] = int(USE_PYTIVO)
@ -1821,6 +1858,7 @@ def save_config():
new_config['GUI']['coming_eps_display_paused'] = int(COMING_EPS_DISPLAY_PAUSED)
new_config['GUI']['coming_eps_sort'] = COMING_EPS_SORT
new_config['GUI']['coming_eps_missed_range'] = int(COMING_EPS_MISSED_RANGE)
new_config['GUI']['display_filesize'] = int(DISPLAY_FILESIZE)
new_config['GUI']['fuzzy_dating'] = int(FUZZY_DATING)
new_config['GUI']['trim_zero'] = int(TRIM_ZERO)
new_config['GUI']['date_preset'] = DATE_PRESET

Some files were not shown because too many files have changed in this diff Show More