Merge remote-tracking branch 'upstream/develop' into develop
|
@ -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
|
||||
|
|
2
TODO.txt
|
@ -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
|
||||
|
|
|
@ -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}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
After Width: | Height: | Size: 109 B |
After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 7.2 KiB |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 615 B |
Before Width: | Height: | Size: 703 B |
|
@ -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"> </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>
|
||||
|
|
|
@ -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"> </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"> </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"> </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"> </span>
|
||||
<span class="component-desc">configure per show notifications here.</span>
|
||||
</label>
|
||||
<label>
|
||||
<span class="component-title"> </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>
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"]:
|
||||
|
|
|
@ -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');
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
//-->
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">< keep ></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">
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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> </span>')[ '' == cur_show['title']] %>
|
||||
<%= (cur_show['show']['title'], '<span> </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']}&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']}&showName=${cur_show['show']['title']}" class="btn btn-xs">Add Show</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -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) {
|
|||
});
|
||||
}
|
||||
})();
|
||||
|
||||
|
|
|
@ -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') ) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -48,7 +48,7 @@ $(document).ready(function(){
|
|||
$(this).showHideServices();
|
||||
});
|
||||
|
||||
$('.service_enabler').live('click', function(){
|
||||
$('.service_enabler').on('click', function(){
|
||||
$(this).refreshServiceList();
|
||||
});
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
});
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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> <br>
|
||||
<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong>UnRAR2</strong></big></big> (version 0.99.2)</font></td
|
||||
<font color="#ffffff" face="helvetica, arial"> <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 is a ctypes based wrapper around the free UnRAR.dll. <br>
|
||||
<br>
|
||||
It is an modified version of Jimmy Retzlaff's pyUnRAR - more simple,<br>
|
||||
|
@ -40,7 +41,7 @@ higher level interface which makes some common&nbs
|
|||
|
||||
<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </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 level interface which makes some common&nbs
|
|||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#ffc8d8">
|
||||
<td colspan=3 valign=bottom> <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> </tt></td><td> </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 "condition" is omitted, all files are extr
|
|||
<br>
|
||||
Returns list of RarInfos for extracted files.</tt></dd></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-get_volume"><strong>get_volume</strong></a>(self)</dt><dd><tt>Determine which volume is it in a multi-volume archive. Returns None if it's not a <br>
|
||||
multi-volume archive, 0-based volume number otherwise.</tt></dd></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-infoiter"><strong>infoiter</strong></a>(self)</dt><dd><tt>Iterate over all the files in the archive, generating RarInfos.<br>
|
||||
<br>
|
||||
>>> import os<br>
|
||||
|
@ -122,17 +126,15 @@ If "condition" is omitted, all files are retu
|
|||
Returns list of tuples (<a href="#RarInfo">RarInfo</a> info, str 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 for instance variables (if 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> </tt></td><td> </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>
|
|
@ -0,0 +1,2 @@
|
|||
test
|
||||
test
|
|
@ -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]:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|