Merge remote-tracking branch 'upstream/develop' into develop
|
@ -1,6 +1,7 @@
|
|||
# SR User Related #
|
||||
######################
|
||||
cache/*
|
||||
cache/
|
||||
cache.db*
|
||||
config.ini*
|
||||
Logs/*
|
||||
|
@ -48,4 +49,8 @@ Thumbs.db
|
|||
.directory
|
||||
*~
|
||||
/.idea/
|
||||
*.torrent
|
||||
*.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;
|
||||
|
@ -3061,4 +3071,4 @@ jquery.confirm.css
|
|||
|
||||
#confirmBox .red:hover {
|
||||
background-color: #A13331;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
@ -2998,4 +3008,4 @@ jquery.confirm.css
|
|||
|
||||
#confirmBox .red:hover {
|
||||
background-color: #A13331;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
@ -3203,4 +3213,4 @@ login.css
|
|||
font-size: 25px;
|
||||
padding: 20px;
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
|
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 |
|
@ -96,6 +96,26 @@
|
|||
</span>
|
||||
</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">
|
||||
|
@ -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>
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
<script type="text/javascript" src="$sbRoot/js/configNotifications.js?$sbPID"></script>
|
||||
<script type="text/javascript" src="$sbRoot/js/config.js?$sbPID"></script>
|
||||
|
||||
#if $varExists('header')
|
||||
#if $varExists('header')
|
||||
<h1 class="header">$header</h1>
|
||||
#else
|
||||
#else
|
||||
<h1 class="title">$title</h1>
|
||||
#end if
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
|||
|
||||
<div id="tabs-1">
|
||||
<div class="component-group">
|
||||
|
||||
|
||||
<div class="component-group-desc">
|
||||
<img class="notifier-icon" src="$sbRoot/images/notifiers/kodi.png" alt="" title="KODI" />
|
||||
<h3><a href="<%= anon_url('http://kodi.tv/') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">KODI</a></h3>
|
||||
|
@ -110,7 +110,7 @@
|
|||
<p>only send library updates to the first active host ?</p>
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label for="kodi_host">
|
||||
<span class="component-title">KODI IP:Port</span>
|
||||
|
@ -123,7 +123,7 @@
|
|||
<label>
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">(multiple host strings must be separated by commas)</span>
|
||||
</label>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label for="kodi_username">
|
||||
|
@ -151,7 +151,7 @@
|
|||
</div><!-- /content_use_kodi //-->
|
||||
|
||||
</fieldset>
|
||||
|
||||
|
||||
</div><!-- /kodi component-group //-->
|
||||
|
||||
|
||||
|
@ -232,7 +232,7 @@
|
|||
<label>
|
||||
<span class="component-title"> </span>
|
||||
<span class="component-desc">(multiple host strings must be separated by commas)</span>
|
||||
</label>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label for="plex_username">
|
||||
|
@ -365,9 +365,9 @@
|
|||
</label>
|
||||
<label for="NMJV2_DBLOC_B">
|
||||
<input type="radio" NAME="nmjv2_dbloc" VALUE="network" id="NMJV2_DBLOC_B" #if $sickbeard.NMJv2_DBLOC=="network" then "checked=\"checked\"" else ""#/>PCH Network Media
|
||||
</label>
|
||||
</label>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label for="NMJv2db_instance">
|
||||
<span class="component-title">Database instance</span>
|
||||
|
@ -415,7 +415,7 @@
|
|||
|
||||
</fieldset>
|
||||
</div><!-- /nmjv2 component-group //-->
|
||||
|
||||
|
||||
|
||||
<div class="component-group">
|
||||
<div class="component-group-desc">
|
||||
|
@ -430,7 +430,7 @@
|
|||
<label for="use_synoindex">
|
||||
<span class="component-title">Enable</span>
|
||||
<span class="component-desc">
|
||||
<input type="checkbox" class="enabler" name="use_synoindex" id="use_synoindex" #if $sickbeard.USE_SYNOINDEX then "checked=\"checked\"" else ""# />
|
||||
<input type="checkbox" class="enabler" name="use_synoindex" id="use_synoindex" #if $sickbeard.USE_SYNOINDEX then "checked=\"checked\"" else ""# />
|
||||
<p>should SickRage send Synology notifications ?</p>
|
||||
</span>
|
||||
</label>
|
||||
|
@ -446,8 +446,8 @@
|
|||
|
||||
</fieldset>
|
||||
</div><!-- /synoindex component-group //-->
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="component-group">
|
||||
<div class="component-group-desc">
|
||||
<img class="notifier-icon" src="$sbRoot/images/notifiers/synologynotifier.png" alt="" title="Synology Indexer" />
|
||||
|
@ -563,7 +563,7 @@
|
|||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="tabs-2">
|
||||
<div class="component-group">
|
||||
<div class="component-group-desc">
|
||||
|
@ -576,7 +576,7 @@
|
|||
<label for="use_growl">
|
||||
<span class="component-title">Enable</span>
|
||||
<span class="component-desc">
|
||||
<input type="checkbox" class="enabler" name="use_growl" id="use_growl" #if $sickbeard.USE_GROWL then "checked=\"checked\"" else ""# />
|
||||
<input type="checkbox" class="enabler" name="use_growl" id="use_growl" #if $sickbeard.USE_GROWL then "checked=\"checked\"" else ""# />
|
||||
<p>should SickRage send Growl notifications ?</p>
|
||||
</span>
|
||||
</label>
|
||||
|
@ -587,7 +587,7 @@
|
|||
<label for="growl_notify_onsnatch">
|
||||
<span class="component-title">Notify on snatch</span>
|
||||
<span class="component-desc">
|
||||
<input type="checkbox" name="growl_notify_onsnatch" id="growl_notify_onsnatch" #if $sickbeard.GROWL_NOTIFY_ONSNATCH then "checked=\"checked\"" else ""# />
|
||||
<input type="checkbox" name="growl_notify_onsnatch" id="growl_notify_onsnatch" #if $sickbeard.GROWL_NOTIFY_ONSNATCH then "checked=\"checked\"" else ""# />
|
||||
<p>send a notification when a download starts ?</p>
|
||||
</span>
|
||||
</label>
|
||||
|
@ -1192,9 +1192,81 @@
|
|||
|
||||
</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>
|
||||
|
||||
|
||||
<div id="tabs-3">
|
||||
<div class="component-group">
|
||||
<div class="component-group-desc">
|
||||
|
@ -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">
|
||||
|
@ -1372,7 +1443,7 @@
|
|||
<span class="component-title"> </span>
|
||||
<span class="component-desc">method in which to download episodes for new show's.</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label for="trakt_remove_watchlist">
|
||||
<span class="component-title">Remove episode:</span>
|
||||
|
@ -1381,8 +1452,8 @@
|
|||
<p>remove an episode from your watchlist after it is downloaded.</p>
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label for="trakt_remove_serieslist">
|
||||
<span class="component-title">Remove series:</span>
|
||||
<span class="component-desc">
|
||||
|
@ -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
|
||||
|
||||
|
|
|
@ -454,6 +454,18 @@
|
|||
</span>
|
||||
</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">
|
||||
|
|
|
@ -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,9 +478,32 @@
|
|||
$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">
|
||||
|
|
|
@ -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},
|
||||
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:
|
||||
|
@ -43,7 +63,7 @@
|
|||
<thead>
|
||||
<tr class="seasonheader" id="season-$cur_ep_obj.season">
|
||||
<td colspan="4">
|
||||
<br/>
|
||||
<br/>
|
||||
<h2>#if int($cur_ep_obj.season) == 0 then "Specials" else "Season "+str($cur_ep_obj.season)#</h2>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
@ -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) {
|
|||
});
|
||||
}
|
||||
})();
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ $(document).ready(function(){
|
|||
$('#testProwl').prop('disabled', false);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$('#testKODI').click(function () {
|
||||
var kodi_host = $.trim($('#kodi_host').val());
|
||||
var kodi_username = $.trim($('#kodi_username').val());
|
||||
|
@ -91,7 +91,7 @@ $(document).ready(function(){
|
|||
$('#testBoxcar').prop('disabled', false);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$('#testBoxcar2').click(function () {
|
||||
var boxcar2_accesstoken = $.trim($('#boxcar2_accesstoken').val());
|
||||
if (!boxcar2_accesstoken) {
|
||||
|
@ -141,7 +141,7 @@ $(document).ready(function(){
|
|||
$.get(sbRoot + '/home/testLibnotify',
|
||||
function (data) { $('#testLibnotify-result').html(data); });
|
||||
});
|
||||
|
||||
|
||||
$('#twitterStep1').click(function() {
|
||||
$('#testTwitter-result').html(loading);
|
||||
$.get(sbRoot + '/home/twitterStep1', function (data) {window.open(data); })
|
||||
|
@ -174,7 +174,7 @@ $(document).ready(function(){
|
|||
}
|
||||
$('#testNMJ-result').html(loading);
|
||||
var nmj_host = $('#nmj_host').val();
|
||||
|
||||
|
||||
$.get(sbRoot + '/home/settingsNMJ', {'host': nmj_host},
|
||||
function (data) {
|
||||
if (data === null) {
|
||||
|
@ -236,7 +236,7 @@ $(document).ready(function(){
|
|||
}
|
||||
|
||||
var nmjv2_dbinstance=$('#NMJv2db_instance').val();
|
||||
$.get(sbRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance},
|
||||
$.get(sbRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance},
|
||||
function (data){
|
||||
if (data == null) {
|
||||
$('#nmjv2_database').removeAttr('readonly');
|
||||
|
@ -244,7 +244,7 @@ $(document).ready(function(){
|
|||
var JSONData = $.parseJSON(data);
|
||||
$('#testNMJv2-result').html(JSONData.message);
|
||||
$('#nmjv2_database').val(JSONData.database);
|
||||
|
||||
|
||||
if (JSONData.database)
|
||||
$('#nmjv2_database').attr('readonly', true);
|
||||
else
|
||||
|
@ -268,18 +268,40 @@ $(document).ready(function(){
|
|||
$('#testNMJv2').prop('disabled', false);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$('#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);
|
||||
|
@ -395,7 +417,7 @@ $(document).ready(function(){
|
|||
if(msg){
|
||||
$('#testPushbullet-result').html(loading);
|
||||
}
|
||||
|
||||
|
||||
var pushbullet_api = $("#pushbullet_api").val();
|
||||
|
||||
if(!pushbullet_api) {
|
||||
|
@ -433,7 +455,7 @@ $(document).ready(function(){
|
|||
$('#getPushbulletDevices').click(function(){
|
||||
get_pushbullet_devices("Device list updated. Please choose a device to push to.");
|
||||
});
|
||||
|
||||
|
||||
// we have to call this function on dom ready to create the devices select
|
||||
get_pushbullet_devices();
|
||||
|
||||
|
@ -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();
|
||||
|
|
|
@ -47,10 +47,10 @@ $(document).ready(function(){
|
|||
$('#editAService').change(function(){
|
||||
$(this).showHideServices();
|
||||
});
|
||||
|
||||
$('.service_enabler').live('click', function(){
|
||||
|
||||
$('.service_enabler').on('click', function(){
|
||||
$(this).refreshServiceList();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// initialization stuff
|
||||
|
|
|
@ -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;
|
||||
|
@ -268,4 +268,4 @@ $(document).ready(function () {
|
|||
height:120
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -29,4 +29,4 @@ $(document).ready(function(){
|
|||
$('#display_new_root_dir_'+cur_id).html('<b>DELETED</b>');
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
syntax: glob
|
||||
|
||||
*.pyc
|
||||
syntax: glob
|
||||
|
||||
*.pyc
|
||||
build/*
|
|
@ -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,2 +1,2 @@
|
|||
recursive-include UnRARDLL *.*
|
||||
include test.rar UnRAR2.html license.txt
|
||||
recursive-include UnRARDLL *.*
|
||||
include test.rar UnRAR2.html license.txt
|
||||
|
|
|
@ -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,194 +1,196 @@
|
|||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<html><head><title>Python: package UnRAR2</title>
|
||||
</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
|
||||
><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>
|
||||
<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>
|
||||
stable and foolproof.<br>
|
||||
Notice that it has INCOMPATIBLE interface.<br>
|
||||
<br>
|
||||
It enables reading and unpacking of archives created with the<br>
|
||||
RAR/WinRAR archivers. There is a low-level interface which is very<br>
|
||||
similar to the C interface provided by UnRAR. There is also a<br>
|
||||
higher level interface which makes some common operations easier.</tt></p>
|
||||
<p>
|
||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#aa55cc">
|
||||
<td colspan=3 valign=bottom> <br>
|
||||
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
|
||||
|
||||
<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
|
||||
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="UnRAR2.UnRAR2.html"><strong>UnRAR2</strong> (package)</a><br>
|
||||
<a href="UnRAR2.rar_exceptions.html">rar_exceptions</a><br>
|
||||
</td><td width="25%" valign=top><a href="UnRAR2.setup.html">setup</a><br>
|
||||
<a href="UnRAR2.test_UnRAR2.html">test_UnRAR2</a><br>
|
||||
</td><td width="25%" valign=top><a href="UnRAR2.unix.html">unix</a><br>
|
||||
<a href="UnRAR2.windows.html">windows</a><br>
|
||||
</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
|
||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#ee77aa">
|
||||
<td colspan=3 valign=bottom> <br>
|
||||
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
|
||||
|
||||
<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>)
|
||||
</font></dt><dd>
|
||||
<dl>
|
||||
<dt><font face="helvetica, arial"><a href="UnRAR2.html#RarFile">RarFile</a>
|
||||
</font></dt></dl>
|
||||
</dd>
|
||||
<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
|
||||
</font></dt><dd>
|
||||
<dl>
|
||||
<dt><font face="helvetica, arial"><a href="UnRAR2.html#RarInfo">RarInfo</a>
|
||||
</font></dt></dl>
|
||||
</dd>
|
||||
</dl>
|
||||
<p>
|
||||
<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>
|
||||
|
||||
<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="__builtin__.html#object">__builtin__.object</a></dd>
|
||||
</dl>
|
||||
<hr>
|
||||
Methods defined here:<br>
|
||||
<dl><dt><a name="RarFile-__del__"><strong>__del__</strong></a>(self)</dt></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-__init__"><strong>__init__</strong></a>(self, archiveName, password<font color="#909090">=None</font>)</dt><dd><tt>Instantiate the archive.<br>
|
||||
<br>
|
||||
archiveName is the name of the RAR file.<br>
|
||||
password is used to decrypt the files in the archive.<br>
|
||||
<br>
|
||||
Properties:<br>
|
||||
comment - comment associated with the archive<br>
|
||||
<br>
|
||||
>>> print <a href="#RarFile">RarFile</a>('test.rar').comment<br>
|
||||
This is a test.</tt></dd></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-extract"><strong>extract</strong></a>(self, condition<font color="#909090">='*'</font>, path<font color="#909090">='.'</font>, withSubpath<font color="#909090">=True</font>, overwrite<font color="#909090">=True</font>)</dt><dd><tt>Extract specific files from archive to disk.<br>
|
||||
<br>
|
||||
If "condition" is a list of numbers, then extract files which have those positions in infolist.<br>
|
||||
If "condition" is a string, then it is treated as a wildcard for names of files to extract.<br>
|
||||
If "condition" is a function, it is treated as a callback function, which accepts a <a href="#RarInfo">RarInfo</a> <a href="__builtin__.html#object">object</a><br>
|
||||
and returns either boolean True (extract) or boolean False (skip).<br>
|
||||
DEPRECATED: If "condition" callback returns string (only supported for Windows) - <br>
|
||||
that string will be used as a new name to save the file under.<br>
|
||||
If "condition" is omitted, all files are extracted.<br>
|
||||
<br>
|
||||
"path" is a directory to extract to<br>
|
||||
"withSubpath" flag denotes whether files are extracted with their full path in the archive.<br>
|
||||
"overwrite" flag denotes whether extracted files will overwrite old ones. Defaults to true.<br>
|
||||
<br>
|
||||
Returns list of RarInfos for extracted files.</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>
|
||||
>>> for fileInArchive in <a href="#RarFile">RarFile</a>('test.rar').<a href="#RarFile-infoiter">infoiter</a>():<br>
|
||||
... print os.path.split(fileInArchive.filename)[-1],<br>
|
||||
... print fileInArchive.isdir,<br>
|
||||
... print fileInArchive.size,<br>
|
||||
... print fileInArchive.comment,<br>
|
||||
... print tuple(fileInArchive.datetime)[0:5],<br>
|
||||
... print time.strftime('%a, %d %b %Y %H:%M', fileInArchive.datetime)<br>
|
||||
test True 0 None (2003, 6, 30, 1, 59) Mon, 30 Jun 2003 01:59<br>
|
||||
test.txt False 20 None (2003, 6, 30, 2, 1) Mon, 30 Jun 2003 02:01<br>
|
||||
this.py False 1030 None (2002, 2, 8, 16, 47) Fri, 08 Feb 2002 16:47</tt></dd></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-infolist"><strong>infolist</strong></a>(self)</dt><dd><tt>Return a list of RarInfos, descripting the contents of the archive.</tt></dd></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-read_files"><strong>read_files</strong></a>(self, condition<font color="#909090">='*'</font>)</dt><dd><tt>Read specific files from archive into memory.<br>
|
||||
If "condition" is a list of numbers, then return files which have those positions in infolist.<br>
|
||||
If "condition" is a string, then it is treated as a wildcard for names of files to extract.<br>
|
||||
If "condition" is a function, it is treated as a callback function, which accepts a <a href="#RarInfo">RarInfo</a> <a href="__builtin__.html#object">object</a> <br>
|
||||
and returns boolean True (extract) or False (skip).<br>
|
||||
If "condition" is omitted, all files are returned.<br>
|
||||
<br>
|
||||
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>
|
||||
|
||||
<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>
|
||||
|
||||
<hr>
|
||||
Data descriptors inherited from <a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a>:<br>
|
||||
<dl><dt><strong>__dict__</strong></dt>
|
||||
<dd><tt>dictionary for instance variables (if defined)</tt></dd>
|
||||
</dl>
|
||||
<dl><dt><strong>__weakref__</strong></dt>
|
||||
<dd><tt>list of weak references to the object (if defined)</tt></dd>
|
||||
</dl>
|
||||
</td></tr></table> <p>
|
||||
<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="RarInfo">class <strong>RarInfo</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
|
||||
|
||||
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
|
||||
<td colspan=2><tt>Represents a file header in an archive. Don't instantiate directly.<br>
|
||||
Use only to obtain information about file.<br>
|
||||
YOU CANNOT EXTRACT FILE CONTENTS USING THIS OBJECT.<br>
|
||||
USE METHODS OF <a href="#RarFile">RarFile</a> CLASS INSTEAD.<br>
|
||||
<br>
|
||||
Properties:<br>
|
||||
index - index of file within the archive<br>
|
||||
filename - name of the file in the archive including path (if any)<br>
|
||||
datetime - file date/time as a struct_time suitable for time.strftime<br>
|
||||
isdir - True if the file is a directory<br>
|
||||
size - size in bytes of the uncompressed file<br>
|
||||
comment - comment associated with the file<br>
|
||||
<br>
|
||||
Note - this is not currently intended to be a Python file-like <a href="__builtin__.html#object">object</a>.<br> </tt></td></tr>
|
||||
<tr><td> </td>
|
||||
<td width="100%">Methods defined here:<br>
|
||||
<dl><dt><a name="RarInfo-__init__"><strong>__init__</strong></a>(self, rarfile, data)</dt></dl>
|
||||
|
||||
<dl><dt><a name="RarInfo-__str__"><strong>__str__</strong></a>(self)</dt></dl>
|
||||
|
||||
<hr>
|
||||
Data descriptors defined here:<br>
|
||||
<dl><dt><strong>__dict__</strong></dt>
|
||||
<dd><tt>dictionary for instance variables (if defined)</tt></dd>
|
||||
</dl>
|
||||
<dl><dt><strong>__weakref__</strong></dt>
|
||||
<dd><tt>list of weak references to the object (if defined)</tt></dd>
|
||||
</dl>
|
||||
</td></tr></table></td></tr></table><p>
|
||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#eeaa77">
|
||||
<td colspan=3 valign=bottom> <br>
|
||||
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
|
||||
|
||||
<tr><td bgcolor="#eeaa77"><tt> </tt></td><td> </td>
|
||||
<td width="100%"><dl><dt><a name="-condition2checker"><strong>condition2checker</strong></a>(condition)</dt><dd><tt>Converts different condition types to callback</tt></dd></dl>
|
||||
</td></tr></table><p>
|
||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#55aa55">
|
||||
<td colspan=3 valign=bottom> <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>
|
||||
|
||||
<!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.5)</font></td
|
||||
><td align=right valign=bottom
|
||||
><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>
|
||||
stable and foolproof.<br>
|
||||
Notice that it has INCOMPATIBLE interface.<br>
|
||||
<br>
|
||||
It enables reading and unpacking of archives created with the<br>
|
||||
RAR/WinRAR archivers. There is a low-level interface which is very<br>
|
||||
similar to the C interface provided by UnRAR. There is also a<br>
|
||||
higher level interface which makes some common operations easier.</tt></p>
|
||||
<p>
|
||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#aa55cc">
|
||||
<td colspan=3 valign=bottom> <br>
|
||||
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
|
||||
|
||||
<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
|
||||
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="UnRAR2.UnRAR2.html"><strong>UnRAR2</strong> (package)</a><br>
|
||||
<a href="UnRAR2.rar_exceptions.html">rar_exceptions</a><br>
|
||||
</td><td width="25%" valign=top><a href="UnRAR2.setup.html">setup</a><br>
|
||||
<a href="UnRAR2.test_UnRAR2.html">test_UnRAR2</a><br>
|
||||
</td><td width="25%" valign=top><a href="UnRAR2.unix.html">unix</a><br>
|
||||
<a href="UnRAR2.windows.html">windows</a><br>
|
||||
</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
|
||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#ee77aa">
|
||||
<td colspan=3 valign=bottom> <br>
|
||||
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
|
||||
|
||||
<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
|
||||
<td width="100%"><dl>
|
||||
<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>
|
||||
</font></dt></dl>
|
||||
</dd>
|
||||
<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
|
||||
</font></dt><dd>
|
||||
<dl>
|
||||
<dt><font face="helvetica, arial"><a href="UnRAR2.html#RarInfo">RarInfo</a>
|
||||
</font></dt></dl>
|
||||
</dd>
|
||||
</dl>
|
||||
<p>
|
||||
<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.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.windows.html#RarFileImplementation">UnRAR2.windows.RarFileImplementation</a></dd>
|
||||
<dd><a href="__builtin__.html#object">__builtin__.object</a></dd>
|
||||
</dl>
|
||||
<hr>
|
||||
Methods defined here:<br>
|
||||
<dl><dt><a name="RarFile-__del__"><strong>__del__</strong></a>(self)</dt></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-__init__"><strong>__init__</strong></a>(self, archiveName, password<font color="#909090">=None</font>)</dt><dd><tt>Instantiate the archive.<br>
|
||||
<br>
|
||||
archiveName is the name of the RAR file.<br>
|
||||
password is used to decrypt the files in the archive.<br>
|
||||
<br>
|
||||
Properties:<br>
|
||||
comment - comment associated with the archive<br>
|
||||
<br>
|
||||
>>> print <a href="#RarFile">RarFile</a>('test.rar').comment<br>
|
||||
This is a test.</tt></dd></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-extract"><strong>extract</strong></a>(self, condition<font color="#909090">='*'</font>, path<font color="#909090">='.'</font>, withSubpath<font color="#909090">=True</font>, overwrite<font color="#909090">=True</font>)</dt><dd><tt>Extract specific files from archive to disk.<br>
|
||||
<br>
|
||||
If "condition" is a list of numbers, then extract files which have those positions in infolist.<br>
|
||||
If "condition" is a string, then it is treated as a wildcard for names of files to extract.<br>
|
||||
If "condition" is a function, it is treated as a callback function, which accepts a <a href="#RarInfo">RarInfo</a> <a href="__builtin__.html#object">object</a><br>
|
||||
and returns either boolean True (extract) or boolean False (skip).<br>
|
||||
DEPRECATED: If "condition" callback returns string (only supported for Windows) - <br>
|
||||
that string will be used as a new name to save the file under.<br>
|
||||
If "condition" is omitted, all files are extracted.<br>
|
||||
<br>
|
||||
"path" is a directory to extract to<br>
|
||||
"withSubpath" flag denotes whether files are extracted with their full path in the archive.<br>
|
||||
"overwrite" flag denotes whether extracted files will overwrite old ones. Defaults to true.<br>
|
||||
<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>
|
||||
>>> for fileInArchive in <a href="#RarFile">RarFile</a>('test.rar').<a href="#RarFile-infoiter">infoiter</a>():<br>
|
||||
... print os.path.split(fileInArchive.filename)[-1],<br>
|
||||
... print fileInArchive.isdir,<br>
|
||||
... print fileInArchive.size,<br>
|
||||
... print fileInArchive.comment,<br>
|
||||
... print tuple(fileInArchive.datetime)[0:5],<br>
|
||||
... print time.strftime('%a, %d %b %Y %H:%M', fileInArchive.datetime)<br>
|
||||
test True 0 None (2003, 6, 30, 1, 59) Mon, 30 Jun 2003 01:59<br>
|
||||
test.txt False 20 None (2003, 6, 30, 2, 1) Mon, 30 Jun 2003 02:01<br>
|
||||
this.py False 1030 None (2002, 2, 8, 16, 47) Fri, 08 Feb 2002 16:47</tt></dd></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-infolist"><strong>infolist</strong></a>(self)</dt><dd><tt>Return a list of RarInfos, descripting the contents of the archive.</tt></dd></dl>
|
||||
|
||||
<dl><dt><a name="RarFile-read_files"><strong>read_files</strong></a>(self, condition<font color="#909090">='*'</font>)</dt><dd><tt>Read specific files from archive into memory.<br>
|
||||
If "condition" is a list of numbers, then return files which have those positions in infolist.<br>
|
||||
If "condition" is a string, then it is treated as a wildcard for names of files to extract.<br>
|
||||
If "condition" is a function, it is treated as a callback function, which accepts a <a href="#RarInfo">RarInfo</a> <a href="__builtin__.html#object">object</a> <br>
|
||||
and returns boolean True (extract) or False (skip).<br>
|
||||
If "condition" is omitted, all files are returned.<br>
|
||||
<br>
|
||||
Returns list of tuples (<a href="#RarInfo">RarInfo</a> info, str contents)</tt></dd></dl>
|
||||
|
||||
<hr>
|
||||
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-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.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>
|
||||
<dl><dt><strong>__weakref__</strong></dt>
|
||||
<dd><tt>list of weak references to the object (if defined)</tt></dd>
|
||||
</dl>
|
||||
</td></tr></table> <p>
|
||||
<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="RarInfo">class <strong>RarInfo</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
|
||||
|
||||
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
|
||||
<td colspan=2><tt>Represents a file header in an archive. Don't instantiate directly.<br>
|
||||
Use only to obtain information about file.<br>
|
||||
YOU CANNOT EXTRACT FILE CONTENTS USING THIS OBJECT.<br>
|
||||
USE METHODS OF <a href="#RarFile">RarFile</a> CLASS INSTEAD.<br>
|
||||
<br>
|
||||
Properties:<br>
|
||||
index - index of file within the archive<br>
|
||||
filename - name of the file in the archive including path (if any)<br>
|
||||
datetime - file date/time as a struct_time suitable for time.strftime<br>
|
||||
isdir - True if the file is a directory<br>
|
||||
size - size in bytes of the uncompressed file<br>
|
||||
comment - comment associated with the file<br>
|
||||
<br>
|
||||
Note - this is not currently intended to be a Python file-like <a href="__builtin__.html#object">object</a>.<br> </tt></td></tr>
|
||||
<tr><td> </td>
|
||||
<td width="100%">Methods defined here:<br>
|
||||
<dl><dt><a name="RarInfo-__init__"><strong>__init__</strong></a>(self, rarfile, data)</dt></dl>
|
||||
|
||||
<dl><dt><a name="RarInfo-__str__"><strong>__str__</strong></a>(self)</dt></dl>
|
||||
|
||||
<hr>
|
||||
Data descriptors defined here:<br>
|
||||
<dl><dt><strong>__dict__</strong></dt>
|
||||
<dd><tt>dictionary for instance variables (if defined)</tt></dd>
|
||||
</dl>
|
||||
<dl><dt><strong>__weakref__</strong></dt>
|
||||
<dd><tt>list of weak references to the object (if defined)</tt></dd>
|
||||
</dl>
|
||||
</td></tr></table></td></tr></table><p>
|
||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#eeaa77">
|
||||
<td colspan=3 valign=bottom> <br>
|
||||
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
|
||||
|
||||
<tr><td bgcolor="#eeaa77"><tt> </tt></td><td> </td>
|
||||
<td width="100%"><dl><dt><a name="-condition2checker"><strong>condition2checker</strong></a>(condition)</dt><dd><tt>Converts different condition types to callback</tt></dd></dl>
|
||||
</td></tr></table><p>
|
||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||
<tr bgcolor="#55aa55">
|
||||
<td colspan=3 valign=bottom> <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.5'<br>
|
||||
<strong>in_windows</strong> = True</td></tr></table>
|
||||
</body></html>
|
|
@ -1,140 +1,140 @@
|
|||
#ifndef _UNRAR_DLL_
|
||||
#define _UNRAR_DLL_
|
||||
|
||||
#define ERAR_END_ARCHIVE 10
|
||||
#define ERAR_NO_MEMORY 11
|
||||
#define ERAR_BAD_DATA 12
|
||||
#define ERAR_BAD_ARCHIVE 13
|
||||
#define ERAR_UNKNOWN_FORMAT 14
|
||||
#define ERAR_EOPEN 15
|
||||
#define ERAR_ECREATE 16
|
||||
#define ERAR_ECLOSE 17
|
||||
#define ERAR_EREAD 18
|
||||
#define ERAR_EWRITE 19
|
||||
#define ERAR_SMALL_BUF 20
|
||||
#define ERAR_UNKNOWN 21
|
||||
#define ERAR_MISSING_PASSWORD 22
|
||||
|
||||
#define RAR_OM_LIST 0
|
||||
#define RAR_OM_EXTRACT 1
|
||||
#define RAR_OM_LIST_INCSPLIT 2
|
||||
|
||||
#define RAR_SKIP 0
|
||||
#define RAR_TEST 1
|
||||
#define RAR_EXTRACT 2
|
||||
|
||||
#define RAR_VOL_ASK 0
|
||||
#define RAR_VOL_NOTIFY 1
|
||||
|
||||
#define RAR_DLL_VERSION 4
|
||||
|
||||
#ifdef _UNIX
|
||||
#define CALLBACK
|
||||
#define PASCAL
|
||||
#define LONG long
|
||||
#define HANDLE void *
|
||||
#define LPARAM long
|
||||
#define UINT unsigned int
|
||||
#endif
|
||||
|
||||
struct RARHeaderData
|
||||
{
|
||||
char ArcName[260];
|
||||
char FileName[260];
|
||||
unsigned int Flags;
|
||||
unsigned int PackSize;
|
||||
unsigned int UnpSize;
|
||||
unsigned int HostOS;
|
||||
unsigned int FileCRC;
|
||||
unsigned int FileTime;
|
||||
unsigned int UnpVer;
|
||||
unsigned int Method;
|
||||
unsigned int FileAttr;
|
||||
char *CmtBuf;
|
||||
unsigned int CmtBufSize;
|
||||
unsigned int CmtSize;
|
||||
unsigned int CmtState;
|
||||
};
|
||||
|
||||
|
||||
struct RARHeaderDataEx
|
||||
{
|
||||
char ArcName[1024];
|
||||
wchar_t ArcNameW[1024];
|
||||
char FileName[1024];
|
||||
wchar_t FileNameW[1024];
|
||||
unsigned int Flags;
|
||||
unsigned int PackSize;
|
||||
unsigned int PackSizeHigh;
|
||||
unsigned int UnpSize;
|
||||
unsigned int UnpSizeHigh;
|
||||
unsigned int HostOS;
|
||||
unsigned int FileCRC;
|
||||
unsigned int FileTime;
|
||||
unsigned int UnpVer;
|
||||
unsigned int Method;
|
||||
unsigned int FileAttr;
|
||||
char *CmtBuf;
|
||||
unsigned int CmtBufSize;
|
||||
unsigned int CmtSize;
|
||||
unsigned int CmtState;
|
||||
unsigned int Reserved[1024];
|
||||
};
|
||||
|
||||
|
||||
struct RAROpenArchiveData
|
||||
{
|
||||
char *ArcName;
|
||||
unsigned int OpenMode;
|
||||
unsigned int OpenResult;
|
||||
char *CmtBuf;
|
||||
unsigned int CmtBufSize;
|
||||
unsigned int CmtSize;
|
||||
unsigned int CmtState;
|
||||
};
|
||||
|
||||
struct RAROpenArchiveDataEx
|
||||
{
|
||||
char *ArcName;
|
||||
wchar_t *ArcNameW;
|
||||
unsigned int OpenMode;
|
||||
unsigned int OpenResult;
|
||||
char *CmtBuf;
|
||||
unsigned int CmtBufSize;
|
||||
unsigned int CmtSize;
|
||||
unsigned int CmtState;
|
||||
unsigned int Flags;
|
||||
unsigned int Reserved[32];
|
||||
};
|
||||
|
||||
enum UNRARCALLBACK_MESSAGES {
|
||||
UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD
|
||||
};
|
||||
|
||||
typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2);
|
||||
|
||||
typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode);
|
||||
typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData);
|
||||
HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData);
|
||||
int PASCAL RARCloseArchive(HANDLE hArcData);
|
||||
int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData);
|
||||
int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData);
|
||||
int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName);
|
||||
int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName);
|
||||
void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LPARAM UserData);
|
||||
void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc);
|
||||
void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc);
|
||||
void PASCAL RARSetPassword(HANDLE hArcData,char *Password);
|
||||
int PASCAL RARGetDllVersion();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#ifndef _UNRAR_DLL_
|
||||
#define _UNRAR_DLL_
|
||||
|
||||
#define ERAR_END_ARCHIVE 10
|
||||
#define ERAR_NO_MEMORY 11
|
||||
#define ERAR_BAD_DATA 12
|
||||
#define ERAR_BAD_ARCHIVE 13
|
||||
#define ERAR_UNKNOWN_FORMAT 14
|
||||
#define ERAR_EOPEN 15
|
||||
#define ERAR_ECREATE 16
|
||||
#define ERAR_ECLOSE 17
|
||||
#define ERAR_EREAD 18
|
||||
#define ERAR_EWRITE 19
|
||||
#define ERAR_SMALL_BUF 20
|
||||
#define ERAR_UNKNOWN 21
|
||||
#define ERAR_MISSING_PASSWORD 22
|
||||
|
||||
#define RAR_OM_LIST 0
|
||||
#define RAR_OM_EXTRACT 1
|
||||
#define RAR_OM_LIST_INCSPLIT 2
|
||||
|
||||
#define RAR_SKIP 0
|
||||
#define RAR_TEST 1
|
||||
#define RAR_EXTRACT 2
|
||||
|
||||
#define RAR_VOL_ASK 0
|
||||
#define RAR_VOL_NOTIFY 1
|
||||
|
||||
#define RAR_DLL_VERSION 4
|
||||
|
||||
#ifdef _UNIX
|
||||
#define CALLBACK
|
||||
#define PASCAL
|
||||
#define LONG long
|
||||
#define HANDLE void *
|
||||
#define LPARAM long
|
||||
#define UINT unsigned int
|
||||
#endif
|
||||
|
||||
struct RARHeaderData
|
||||
{
|
||||
char ArcName[260];
|
||||
char FileName[260];
|
||||
unsigned int Flags;
|
||||
unsigned int PackSize;
|
||||
unsigned int UnpSize;
|
||||
unsigned int HostOS;
|
||||
unsigned int FileCRC;
|
||||
unsigned int FileTime;
|
||||
unsigned int UnpVer;
|
||||
unsigned int Method;
|
||||
unsigned int FileAttr;
|
||||
char *CmtBuf;
|
||||
unsigned int CmtBufSize;
|
||||
unsigned int CmtSize;
|
||||
unsigned int CmtState;
|
||||
};
|
||||
|
||||
|
||||
struct RARHeaderDataEx
|
||||
{
|
||||
char ArcName[1024];
|
||||
wchar_t ArcNameW[1024];
|
||||
char FileName[1024];
|
||||
wchar_t FileNameW[1024];
|
||||
unsigned int Flags;
|
||||
unsigned int PackSize;
|
||||
unsigned int PackSizeHigh;
|
||||
unsigned int UnpSize;
|
||||
unsigned int UnpSizeHigh;
|
||||
unsigned int HostOS;
|
||||
unsigned int FileCRC;
|
||||
unsigned int FileTime;
|
||||
unsigned int UnpVer;
|
||||
unsigned int Method;
|
||||
unsigned int FileAttr;
|
||||
char *CmtBuf;
|
||||
unsigned int CmtBufSize;
|
||||
unsigned int CmtSize;
|
||||
unsigned int CmtState;
|
||||
unsigned int Reserved[1024];
|
||||
};
|
||||
|
||||
|
||||
struct RAROpenArchiveData
|
||||
{
|
||||
char *ArcName;
|
||||
unsigned int OpenMode;
|
||||
unsigned int OpenResult;
|
||||
char *CmtBuf;
|
||||
unsigned int CmtBufSize;
|
||||
unsigned int CmtSize;
|
||||
unsigned int CmtState;
|
||||
};
|
||||
|
||||
struct RAROpenArchiveDataEx
|
||||
{
|
||||
char *ArcName;
|
||||
wchar_t *ArcNameW;
|
||||
unsigned int OpenMode;
|
||||
unsigned int OpenResult;
|
||||
char *CmtBuf;
|
||||
unsigned int CmtBufSize;
|
||||
unsigned int CmtSize;
|
||||
unsigned int CmtState;
|
||||
unsigned int Flags;
|
||||
unsigned int Reserved[32];
|
||||
};
|
||||
|
||||
enum UNRARCALLBACK_MESSAGES {
|
||||
UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD
|
||||
};
|
||||
|
||||
typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2);
|
||||
|
||||
typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode);
|
||||
typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData);
|
||||
HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData);
|
||||
int PASCAL RARCloseArchive(HANDLE hArcData);
|
||||
int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData);
|
||||
int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData);
|
||||
int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName);
|
||||
int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName);
|
||||
void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LPARAM UserData);
|
||||
void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc);
|
||||
void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc);
|
||||
void PASCAL RARSetPassword(HANDLE hArcData,char *Password);
|
||||
int PASCAL RARGetDllVersion();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,80 +1,80 @@
|
|||
List of unrar.dll API changes. We do not include performance and reliability
|
||||
improvements into this list, but this library and RAR/UnRAR tools share
|
||||
the same source code. So the latest version of unrar.dll usually contains
|
||||
same decompression algorithm changes as the latest UnRAR version.
|
||||
============================================================================
|
||||
|
||||
-- 18 January 2008
|
||||
|
||||
all LONG parameters of CallbackProc function were changed
|
||||
to LPARAM type for 64 bit mode compatibility.
|
||||
|
||||
|
||||
-- 12 December 2007
|
||||
|
||||
Added new RAR_OM_LIST_INCSPLIT open mode for function RAROpenArchive.
|
||||
|
||||
|
||||
-- 14 August 2007
|
||||
|
||||
Added NoCrypt\unrar_nocrypt.dll without decryption code for those
|
||||
applications where presence of encryption or decryption code is not
|
||||
allowed because of legal restrictions.
|
||||
|
||||
|
||||
-- 14 December 2006
|
||||
|
||||
Added ERAR_MISSING_PASSWORD error type. This error is returned
|
||||
if empty password is specified for encrypted file.
|
||||
|
||||
|
||||
-- 12 June 2003
|
||||
|
||||
Added RARProcessFileW function, Unicode version of RARProcessFile
|
||||
|
||||
|
||||
-- 9 August 2002
|
||||
|
||||
Added RAROpenArchiveEx function allowing to specify Unicode archive
|
||||
name and get archive flags.
|
||||
|
||||
|
||||
-- 24 January 2002
|
||||
|
||||
Added RARReadHeaderEx function allowing to read Unicode file names
|
||||
and 64 bit file sizes.
|
||||
|
||||
|
||||
-- 23 January 2002
|
||||
|
||||
Added ERAR_UNKNOWN error type (it is used for all errors which
|
||||
do not have special ERAR code yet) and UCM_NEEDPASSWORD callback
|
||||
message.
|
||||
|
||||
Unrar.dll automatically opens all next volumes not only when extracting,
|
||||
but also in RAR_OM_LIST mode.
|
||||
|
||||
|
||||
-- 27 November 2001
|
||||
|
||||
RARSetChangeVolProc and RARSetProcessDataProc are replaced by
|
||||
the single callback function installed with RARSetCallback.
|
||||
Unlike old style callbacks, the new function accepts the user defined
|
||||
parameter. Unrar.dll still supports RARSetChangeVolProc and
|
||||
RARSetProcessDataProc for compatibility purposes, but if you write
|
||||
a new application, better use RARSetCallback.
|
||||
|
||||
File comments support is not implemented in the new DLL version yet.
|
||||
Now CmtState is always 0.
|
||||
|
||||
|
||||
-- 13 August 2001
|
||||
|
||||
Added RARGetDllVersion function, so you may distinguish old unrar.dll,
|
||||
which used C style callback functions and the new one with PASCAL callbacks.
|
||||
|
||||
|
||||
-- 10 May 2001
|
||||
|
||||
Callback functions in RARSetChangeVolProc and RARSetProcessDataProc
|
||||
use PASCAL style call convention now.
|
||||
List of unrar.dll API changes. We do not include performance and reliability
|
||||
improvements into this list, but this library and RAR/UnRAR tools share
|
||||
the same source code. So the latest version of unrar.dll usually contains
|
||||
same decompression algorithm changes as the latest UnRAR version.
|
||||
============================================================================
|
||||
|
||||
-- 18 January 2008
|
||||
|
||||
all LONG parameters of CallbackProc function were changed
|
||||
to LPARAM type for 64 bit mode compatibility.
|
||||
|
||||
|
||||
-- 12 December 2007
|
||||
|
||||
Added new RAR_OM_LIST_INCSPLIT open mode for function RAROpenArchive.
|
||||
|
||||
|
||||
-- 14 August 2007
|
||||
|
||||
Added NoCrypt\unrar_nocrypt.dll without decryption code for those
|
||||
applications where presence of encryption or decryption code is not
|
||||
allowed because of legal restrictions.
|
||||
|
||||
|
||||
-- 14 December 2006
|
||||
|
||||
Added ERAR_MISSING_PASSWORD error type. This error is returned
|
||||
if empty password is specified for encrypted file.
|
||||
|
||||
|
||||
-- 12 June 2003
|
||||
|
||||
Added RARProcessFileW function, Unicode version of RARProcessFile
|
||||
|
||||
|
||||
-- 9 August 2002
|
||||
|
||||
Added RAROpenArchiveEx function allowing to specify Unicode archive
|
||||
name and get archive flags.
|
||||
|
||||
|
||||
-- 24 January 2002
|
||||
|
||||
Added RARReadHeaderEx function allowing to read Unicode file names
|
||||
and 64 bit file sizes.
|
||||
|
||||
|
||||
-- 23 January 2002
|
||||
|
||||
Added ERAR_UNKNOWN error type (it is used for all errors which
|
||||
do not have special ERAR code yet) and UCM_NEEDPASSWORD callback
|
||||
message.
|
||||
|
||||
Unrar.dll automatically opens all next volumes not only when extracting,
|
||||
but also in RAR_OM_LIST mode.
|
||||
|
||||
|
||||
-- 27 November 2001
|
||||
|
||||
RARSetChangeVolProc and RARSetProcessDataProc are replaced by
|
||||
the single callback function installed with RARSetCallback.
|
||||
Unlike old style callbacks, the new function accepts the user defined
|
||||
parameter. Unrar.dll still supports RARSetChangeVolProc and
|
||||
RARSetProcessDataProc for compatibility purposes, but if you write
|
||||
a new application, better use RARSetCallback.
|
||||
|
||||
File comments support is not implemented in the new DLL version yet.
|
||||
Now CmtState is always 0.
|
||||
|
||||
|
||||
-- 13 August 2001
|
||||
|
||||
Added RARGetDllVersion function, so you may distinguish old unrar.dll,
|
||||
which used C style callback functions and the new one with PASCAL callbacks.
|
||||
|
||||
|
||||
-- 10 May 2001
|
||||
|
||||
Callback functions in RARSetChangeVolProc and RARSetProcessDataProc
|
||||
use PASCAL style call convention now.
|
||||
|
|
|
@ -1 +1 @@
|
|||
This is x64 version of unrar.dll.
|
||||
This is x64 version of unrar.dll.
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
test
|
||||
test
|
|
@ -1,177 +1,180 @@
|
|||
# Copyright (c) 2003-2005 Jimmy Retzlaff, 2008 Konstantin Yegupov
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
"""
|
||||
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.
|
||||
"""
|
||||
|
||||
__version__ = '0.99.3'
|
||||
|
||||
try:
|
||||
WindowsError
|
||||
in_windows = True
|
||||
except NameError:
|
||||
in_windows = False
|
||||
|
||||
if in_windows:
|
||||
from windows import RarFileImplementation
|
||||
else:
|
||||
from unix import RarFileImplementation
|
||||
|
||||
|
||||
import fnmatch, time, weakref
|
||||
|
||||
class RarInfo(object):
|
||||
"""Represents a file header in an archive. Don't instantiate directly.
|
||||
Use only to obtain information about file.
|
||||
YOU CANNOT EXTRACT FILE CONTENTS USING THIS OBJECT.
|
||||
USE METHODS OF RarFile CLASS INSTEAD.
|
||||
|
||||
Properties:
|
||||
index - index of file within the archive
|
||||
filename - name of the file in the archive including path (if any)
|
||||
datetime - file date/time as a struct_time suitable for time.strftime
|
||||
isdir - True if the file is a directory
|
||||
size - size in bytes of the uncompressed file
|
||||
comment - comment associated with the file
|
||||
|
||||
Note - this is not currently intended to be a Python file-like object.
|
||||
"""
|
||||
|
||||
def __init__(self, rarfile, data):
|
||||
self.rarfile = weakref.proxy(rarfile)
|
||||
self.index = data['index']
|
||||
self.filename = data['filename']
|
||||
self.isdir = data['isdir']
|
||||
self.size = data['size']
|
||||
self.datetime = data['datetime']
|
||||
self.comment = data['comment']
|
||||
|
||||
|
||||
|
||||
def __str__(self):
|
||||
try :
|
||||
arcName = self.rarfile.archiveName
|
||||
except ReferenceError:
|
||||
arcName = "[ARCHIVE_NO_LONGER_LOADED]"
|
||||
return '<RarInfo "%s" in "%s">' % (self.filename, arcName)
|
||||
|
||||
class RarFile(RarFileImplementation):
|
||||
|
||||
def __init__(self, archiveName, password=None):
|
||||
"""Instantiate the archive.
|
||||
|
||||
archiveName is the name of the RAR file.
|
||||
password is used to decrypt the files in the archive.
|
||||
|
||||
Properties:
|
||||
comment - comment associated with the archive
|
||||
|
||||
>>> print RarFile('test.rar').comment
|
||||
This is a test.
|
||||
"""
|
||||
self.archiveName = archiveName
|
||||
RarFileImplementation.init(self, password)
|
||||
|
||||
def __del__(self):
|
||||
self.destruct()
|
||||
|
||||
def infoiter(self):
|
||||
"""Iterate over all the files in the archive, generating RarInfos.
|
||||
|
||||
>>> import os
|
||||
>>> for fileInArchive in RarFile('test.rar').infoiter():
|
||||
... print os.path.split(fileInArchive.filename)[-1],
|
||||
... print fileInArchive.isdir,
|
||||
... print fileInArchive.size,
|
||||
... print fileInArchive.comment,
|
||||
... print tuple(fileInArchive.datetime)[0:5],
|
||||
... print time.strftime('%a, %d %b %Y %H:%M', fileInArchive.datetime)
|
||||
test True 0 None (2003, 6, 30, 1, 59) Mon, 30 Jun 2003 01:59
|
||||
test.txt False 20 None (2003, 6, 30, 2, 1) Mon, 30 Jun 2003 02:01
|
||||
this.py False 1030 None (2002, 2, 8, 16, 47) Fri, 08 Feb 2002 16:47
|
||||
"""
|
||||
for params in RarFileImplementation.infoiter(self):
|
||||
yield RarInfo(self, params)
|
||||
|
||||
def infolist(self):
|
||||
"""Return a list of RarInfos, descripting the contents of the archive."""
|
||||
return list(self.infoiter())
|
||||
|
||||
def read_files(self, condition='*'):
|
||||
"""Read specific files from archive into memory.
|
||||
If "condition" is a list of numbers, then return files which have those positions in infolist.
|
||||
If "condition" is a string, then it is treated as a wildcard for names of files to extract.
|
||||
If "condition" is a function, it is treated as a callback function, which accepts a RarInfo object
|
||||
and returns boolean True (extract) or False (skip).
|
||||
If "condition" is omitted, all files are returned.
|
||||
|
||||
Returns list of tuples (RarInfo info, str contents)
|
||||
"""
|
||||
checker = condition2checker(condition)
|
||||
return RarFileImplementation.read_files(self, checker)
|
||||
|
||||
|
||||
def extract(self, condition='*', path='.', withSubpath=True, overwrite=True):
|
||||
"""Extract specific files from archive to disk.
|
||||
|
||||
If "condition" is a list of numbers, then extract files which have those positions in infolist.
|
||||
If "condition" is a string, then it is treated as a wildcard for names of files to extract.
|
||||
If "condition" is a function, it is treated as a callback function, which accepts a RarInfo object
|
||||
and returns either boolean True (extract) or boolean False (skip).
|
||||
DEPRECATED: If "condition" callback returns string (only supported for Windows) -
|
||||
that string will be used as a new name to save the file under.
|
||||
If "condition" is omitted, all files are extracted.
|
||||
|
||||
"path" is a directory to extract to
|
||||
"withSubpath" flag denotes whether files are extracted with their full path in the archive.
|
||||
"overwrite" flag denotes whether extracted files will overwrite old ones. Defaults to true.
|
||||
|
||||
Returns list of RarInfos for extracted files."""
|
||||
checker = condition2checker(condition)
|
||||
return RarFileImplementation.extract(self, checker, path, withSubpath, overwrite)
|
||||
|
||||
def condition2checker(condition):
|
||||
"""Converts different condition types to callback"""
|
||||
if type(condition) in [str, unicode]:
|
||||
def smatcher(info):
|
||||
return fnmatch.fnmatch(info.filename, condition)
|
||||
return smatcher
|
||||
elif type(condition) in [list, tuple] and type(condition[0]) in [int, long]:
|
||||
def imatcher(info):
|
||||
return info.index in condition
|
||||
return imatcher
|
||||
elif callable(condition):
|
||||
return condition
|
||||
else:
|
||||
raise TypeError
|
||||
|
||||
|
||||
# Copyright (c) 2003-2005 Jimmy Retzlaff, 2008 Konstantin Yegupov
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
"""
|
||||
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.
|
||||
"""
|
||||
|
||||
__version__ = '0.99.6'
|
||||
|
||||
try:
|
||||
WindowsError
|
||||
in_windows = True
|
||||
except NameError:
|
||||
in_windows = False
|
||||
|
||||
if in_windows:
|
||||
from windows import RarFileImplementation
|
||||
else:
|
||||
from unix import RarFileImplementation
|
||||
|
||||
|
||||
import fnmatch, time, weakref
|
||||
|
||||
class RarInfo(object):
|
||||
"""Represents a file header in an archive. Don't instantiate directly.
|
||||
Use only to obtain information about file.
|
||||
YOU CANNOT EXTRACT FILE CONTENTS USING THIS OBJECT.
|
||||
USE METHODS OF RarFile CLASS INSTEAD.
|
||||
|
||||
Properties:
|
||||
index - index of file within the archive
|
||||
filename - name of the file in the archive including path (if any)
|
||||
datetime - file date/time as a struct_time suitable for time.strftime
|
||||
isdir - True if the file is a directory
|
||||
size - size in bytes of the uncompressed file
|
||||
comment - comment associated with the file
|
||||
|
||||
Note - this is not currently intended to be a Python file-like object.
|
||||
"""
|
||||
|
||||
def __init__(self, rarfile, data):
|
||||
self.rarfile = weakref.proxy(rarfile)
|
||||
self.index = data['index']
|
||||
self.filename = data['filename']
|
||||
self.isdir = data['isdir']
|
||||
self.size = data['size']
|
||||
self.datetime = data['datetime']
|
||||
self.comment = data['comment']
|
||||
|
||||
def __str__(self):
|
||||
try :
|
||||
arcName = self.rarfile.archiveName
|
||||
except ReferenceError:
|
||||
arcName = "[ARCHIVE_NO_LONGER_LOADED]"
|
||||
return '<RarInfo "%s" in "%s">' % (self.filename, arcName)
|
||||
|
||||
class RarFile(RarFileImplementation):
|
||||
|
||||
def __init__(self, archiveName, password=None):
|
||||
"""Instantiate the archive.
|
||||
|
||||
archiveName is the name of the RAR file.
|
||||
password is used to decrypt the files in the archive.
|
||||
|
||||
Properties:
|
||||
comment - comment associated with the archive
|
||||
|
||||
>>> print RarFile('test.rar').comment
|
||||
This is a test.
|
||||
"""
|
||||
self.archiveName = archiveName
|
||||
RarFileImplementation.init(self, password)
|
||||
|
||||
def __del__(self):
|
||||
self.destruct()
|
||||
|
||||
def infoiter(self):
|
||||
"""Iterate over all the files in the archive, generating RarInfos.
|
||||
|
||||
>>> import os
|
||||
>>> for fileInArchive in RarFile('test.rar').infoiter():
|
||||
... print os.path.split(fileInArchive.filename)[-1],
|
||||
... print fileInArchive.isdir,
|
||||
... print fileInArchive.size,
|
||||
... print fileInArchive.comment,
|
||||
... print tuple(fileInArchive.datetime)[0:5],
|
||||
... print time.strftime('%a, %d %b %Y %H:%M', fileInArchive.datetime)
|
||||
test True 0 None (2003, 6, 30, 1, 59) Mon, 30 Jun 2003 01:59
|
||||
test.txt False 20 None (2003, 6, 30, 2, 1) Mon, 30 Jun 2003 02:01
|
||||
this.py False 1030 None (2002, 2, 8, 16, 47) Fri, 08 Feb 2002 16:47
|
||||
"""
|
||||
for params in RarFileImplementation.infoiter(self):
|
||||
yield RarInfo(self, params)
|
||||
|
||||
def infolist(self):
|
||||
"""Return a list of RarInfos, descripting the contents of the archive."""
|
||||
return list(self.infoiter())
|
||||
|
||||
def read_files(self, condition='*'):
|
||||
"""Read specific files from archive into memory.
|
||||
If "condition" is a list of numbers, then return files which have those positions in infolist.
|
||||
If "condition" is a string, then it is treated as a wildcard for names of files to extract.
|
||||
If "condition" is a function, it is treated as a callback function, which accepts a RarInfo object
|
||||
and returns boolean True (extract) or False (skip).
|
||||
If "condition" is omitted, all files are returned.
|
||||
|
||||
Returns list of tuples (RarInfo info, str contents)
|
||||
"""
|
||||
checker = condition2checker(condition)
|
||||
return RarFileImplementation.read_files(self, checker)
|
||||
|
||||
|
||||
def extract(self, condition='*', path='.', withSubpath=True, overwrite=True):
|
||||
"""Extract specific files from archive to disk.
|
||||
|
||||
If "condition" is a list of numbers, then extract files which have those positions in infolist.
|
||||
If "condition" is a string, then it is treated as a wildcard for names of files to extract.
|
||||
If "condition" is a function, it is treated as a callback function, which accepts a RarInfo object
|
||||
and returns either boolean True (extract) or boolean False (skip).
|
||||
DEPRECATED: If "condition" callback returns string (only supported for Windows) -
|
||||
that string will be used as a new name to save the file under.
|
||||
If "condition" is omitted, all files are extracted.
|
||||
|
||||
"path" is a directory to extract to
|
||||
"withSubpath" flag denotes whether files are extracted with their full path in the archive.
|
||||
"overwrite" flag denotes whether extracted files will overwrite old ones. Defaults to true.
|
||||
|
||||
Returns list of RarInfos for extracted files."""
|
||||
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]:
|
||||
def smatcher(info):
|
||||
return fnmatch.fnmatch(info.filename, condition)
|
||||
return smatcher
|
||||
elif type(condition) in [list, tuple] and type(condition[0]) in [int, long]:
|
||||
def imatcher(info):
|
||||
return info.index in condition
|
||||
return imatcher
|
||||
elif callable(condition):
|
||||
return condition
|
||||
else:
|
||||
raise TypeError
|
||||
|
||||
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
Copyright (c) 2003-2005 Jimmy Retzlaff, 2008 Konstantin Yegupov
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
Copyright (c) 2003-2005 Jimmy Retzlaff, 2008 Konstantin Yegupov
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
|