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

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

7
.gitignore vendored
View File

@ -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

View File

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

View File

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

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

View File

@ -557,6 +557,16 @@ home.tmpl
color: #000000;
}
.progress-100 {
background-image: -moz-linear-gradient(#395f07, #2a4705) !important;
background-image: linear-gradient(#395f07, #2a4705) !important;
background-image: -webkit-linear-gradient(#395f07, #2a4705) !important;
background-image: -o-linear-gradient(#395f07, #2a4705) !important;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
.progress-80 {
background-image: -moz-linear-gradient(#a6cf41, #5b990d) !important;
background-image: linear-gradient(#a6cf41, #5b990d) !important;
@ -3203,4 +3213,4 @@ login.css
font-size: 25px;
padding: 20px;
float: right;
}
}

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 703 B

View File

@ -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">&nbsp;</span>
<span class="component-desc">URL where the shows can be downloaded.</span>
</label>
</div>
<input type="submit" class="btn config_submitter" value="Save Changes" />
</fieldset>
@ -518,9 +558,11 @@
<span class="component-title">Branch version:</span>
<span class="component-desc">
<select id="branchVersion" class="form-control form-control-inline input-sm pull-left">
#if $sickbeard.versionCheckScheduler.action.list_remote_branches()
#for $cur_branch in $sickbeard.versionCheckScheduler.action.list_remote_branches():
<option value="$cur_branch" #if $cur_branch == $sickbeard.BRANCH then 'selected="selected"' else ''#>$cur_branch</option>
#end for
#end if
</select>
<input class="btn btn-inline" style="margin-left: 6px;" type="button" id="branchCheckout" value="Checkout Branch">
<div class="clear-left"><p>select branch to use (restart required)</p></div>

View File

@ -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">&nbsp;</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">&nbsp;</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">&nbsp;</span>
<span class="component-desc">It's your Free Mobile customer ID (8 digits)</span>
</label>
</div>
<div class="field-pair">
<label for="freemobile_password">
<span class="component-title">Free Mobile API Key</span>
<input type="text" name="freemobile_apikey" id="freemobile_apikey" value="$sickbeard.FREEMOBILE_APIKEY" class="form-control input-sm input250" />
</label>
<label>
<span class="component-title">&nbsp;</span>
<span class="component-desc">Find your API Key in your customer portal.</span>
</label>
</div>
<div class="testNotification" id="testFreeMobile-result">Click below to test your settings.</div>
<input class="btn" type="button" value="Test SMS" id="testFreeMobile" />
<input type="submit" class="config_submitter btn" value="Save Changes" />
</div><!-- /content_use_freemobile //-->
</fieldset>
</div><!-- /freemobile component-group //-->
</div>
<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">&nbsp;</span>
<span class="component-desc">get your key at: <a href="<%= anon_url('http://trakt.tv/settings/api') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><b>http://trakt.tv/settings/api</b></a></span>
<label for="trakt_disable_ssl_verify">
<span class="component-title">Disable SSL Verification:</span>
<span class="component-desc">
<input type="checkbox" class="enabler" name="trakt_disable_ssl_verify" id="trakt_disable_ssl_verify" #if $sickbeard.TRAKT_DISABLE_SSL_VERIFY then "checked=\"checked\"" else ""# />
<p>Disable SSL certificate verification on systems with broken SSL implementations, like the QNAP NAS.</p>
</span>
</label>
</div>
<div class="field-pair">
@ -1372,7 +1443,7 @@
<span class="component-title">&nbsp;</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">&nbsp;</span>
<span class="component-desc">configure per show notifications here.</span>
</label>
<label>
<span class="component-title">&nbsp;</span>
<input id="email_show_save" class="btn" type="button" value="Save for this show" />
</label>
</div>
<div class="testNotification" id="testEmail-result">Click below to test.</div>

View File

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

View File

@ -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">

View File

@ -6,6 +6,7 @@
#from lib import subliminal
#import os.path, os
#import datetime
#import urllib
#set global $title=$show.name
##set global $header = '<a></a>' %
@ -165,7 +166,7 @@
#else
#if 'country_codes' in $show.imdb_info:
#for $country in $show.imdb_info['country_codes'].split('|')
<img src="$sbRoot/images/flags/${$country}.png" width="16" height="11" style="margin-left: 3px; vertical-align:middle;" />
<img src="$sbRoot/images/blank.png" class="country-flag flag-${$country}" width="16" height="11" style="margin-left: 3px; vertical-align:middle;" />
#end for
#end if
#if 'year' in $show.imdb_info:
@ -374,8 +375,18 @@
#if $scene_anime:
<th class="col-ep">Scene Absolute</th>
#end if
<th class="col-name">Name</th>
<th class="col-name"
#if ($sickbeard.DISPLAY_FILESIZE == True):
style="min-width: 190px"
#end if
>>Name</th>
#if ($sickbeard.DISPLAY_FILESIZE == True):
<th class="col-ep">Filesize</th>
#end if
<th class="col-airdate">Airdate</th>
#if $sickbeard.DOWNLOAD_URL
<th class="col-ep">Download</th>
#end if
#if $sickbeard.USE_SUBTITLES and $show.subtitles:
<th class="col-subtitles">Subtitles</th>
#end if
@ -467,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">

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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') ) {

View File

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

View File

@ -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

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -29,4 +29,4 @@ $(document).ready(function(){
$('#display_new_root_dir_'+cur_id).html('<b>DELETED</b>');
});
});
});

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
syntax: glob
*.pyc
syntax: glob
*.pyc
build/*

View File

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

View File

@ -1,2 +1,2 @@
recursive-include UnRARDLL *.*
include test.rar UnRAR2.html license.txt
recursive-include UnRARDLL *.*
include test.rar UnRAR2.html license.txt

View File

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

View File

@ -1,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>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<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&nbsp;is&nbsp;a&nbsp;ctypes&nbsp;based&nbsp;wrapper&nbsp;around&nbsp;the&nbsp;free&nbsp;UnRAR.dll.&nbsp;<br>
&nbsp;<br>
It&nbsp;is&nbsp;an&nbsp;modified&nbsp;version&nbsp;of&nbsp;Jimmy&nbsp;Retzlaff's&nbsp;pyUnRAR&nbsp;-&nbsp;more&nbsp;simple,<br>
stable&nbsp;and&nbsp;foolproof.<br>
Notice&nbsp;that&nbsp;it&nbsp;has&nbsp;INCOMPATIBLE&nbsp;interface.<br>
&nbsp;<br>
It&nbsp;enables&nbsp;reading&nbsp;and&nbsp;unpacking&nbsp;of&nbsp;archives&nbsp;created&nbsp;with&nbsp;the<br>
RAR/WinRAR&nbsp;archivers.&nbsp;There&nbsp;is&nbsp;a&nbsp;low-level&nbsp;interface&nbsp;which&nbsp;is&nbsp;very<br>
similar&nbsp;to&nbsp;the&nbsp;C&nbsp;interface&nbsp;provided&nbsp;by&nbsp;UnRAR.&nbsp;There&nbsp;is&nbsp;also&nbsp;a<br>
higher&nbsp;level&nbsp;interface&nbsp;which&nbsp;makes&nbsp;some&nbsp;common&nbsp;operations&nbsp;easier.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="UnRAR2.UnRAR2.html"><strong>UnRAR2</strong>&nbsp;(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>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a>(<a href="__builtin__.html#object">__builtin__.object</a>)
</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>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="RarFile">class <strong>RarFile</strong></a>(<a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a>)</font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="UnRAR2.html#RarFile">RarFile</a></dd>
<dd><a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a></dd>
<dd><a href="__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&nbsp;the&nbsp;archive.<br>
&nbsp;<br>
archiveName&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;RAR&nbsp;file.<br>
password&nbsp;is&nbsp;used&nbsp;to&nbsp;decrypt&nbsp;the&nbsp;files&nbsp;in&nbsp;the&nbsp;archive.<br>
&nbsp;<br>
Properties:<br>
&nbsp;&nbsp;&nbsp;&nbsp;comment&nbsp;-&nbsp;comment&nbsp;associated&nbsp;with&nbsp;the&nbsp;archive<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;print&nbsp;<a href="#RarFile">RarFile</a>('test.rar').comment<br>
This&nbsp;is&nbsp;a&nbsp;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&nbsp;specific&nbsp;files&nbsp;from&nbsp;archive&nbsp;to&nbsp;disk.<br>
&nbsp;<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;list&nbsp;of&nbsp;numbers,&nbsp;then&nbsp;extract&nbsp;files&nbsp;which&nbsp;have&nbsp;those&nbsp;positions&nbsp;in&nbsp;infolist.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;string,&nbsp;then&nbsp;it&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;wildcard&nbsp;for&nbsp;names&nbsp;of&nbsp;files&nbsp;to&nbsp;extract.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;function,&nbsp;it&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;callback&nbsp;function,&nbsp;which&nbsp;accepts&nbsp;a&nbsp;<a href="#RarInfo">RarInfo</a>&nbsp;<a href="__builtin__.html#object">object</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;returns&nbsp;either&nbsp;boolean&nbsp;True&nbsp;(extract)&nbsp;or&nbsp;boolean&nbsp;False&nbsp;(skip).<br>
DEPRECATED:&nbsp;If&nbsp;"condition"&nbsp;callback&nbsp;returns&nbsp;string&nbsp;(only&nbsp;supported&nbsp;for&nbsp;Windows)&nbsp;-&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;string&nbsp;will&nbsp;be&nbsp;used&nbsp;as&nbsp;a&nbsp;new&nbsp;name&nbsp;to&nbsp;save&nbsp;the&nbsp;file&nbsp;under.<br>
If&nbsp;"condition"&nbsp;is&nbsp;omitted,&nbsp;all&nbsp;files&nbsp;are&nbsp;extracted.<br>
&nbsp;<br>
"path"&nbsp;is&nbsp;a&nbsp;directory&nbsp;to&nbsp;extract&nbsp;to<br>
"withSubpath"&nbsp;flag&nbsp;denotes&nbsp;whether&nbsp;files&nbsp;are&nbsp;extracted&nbsp;with&nbsp;their&nbsp;full&nbsp;path&nbsp;in&nbsp;the&nbsp;archive.<br>
"overwrite"&nbsp;flag&nbsp;denotes&nbsp;whether&nbsp;extracted&nbsp;files&nbsp;will&nbsp;overwrite&nbsp;old&nbsp;ones.&nbsp;Defaults&nbsp;to&nbsp;true.<br>
&nbsp;<br>
Returns&nbsp;list&nbsp;of&nbsp;RarInfos&nbsp;for&nbsp;extracted&nbsp;files.</tt></dd></dl>
<dl><dt><a name="RarFile-infoiter"><strong>infoiter</strong></a>(self)</dt><dd><tt>Iterate&nbsp;over&nbsp;all&nbsp;the&nbsp;files&nbsp;in&nbsp;the&nbsp;archive,&nbsp;generating&nbsp;RarInfos.<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;import&nbsp;os<br>
&gt;&gt;&gt;&nbsp;for&nbsp;fileInArchive&nbsp;in&nbsp;<a href="#RarFile">RarFile</a>('test.rar').<a href="#RarFile-infoiter">infoiter</a>():<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;os.path.split(fileInArchive.filename)[-1],<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;fileInArchive.isdir,<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;fileInArchive.size,<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;fileInArchive.comment,<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;tuple(fileInArchive.datetime)[0:5],<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;time.strftime('%a,&nbsp;%d&nbsp;%b&nbsp;%Y&nbsp;%H:%M',&nbsp;fileInArchive.datetime)<br>
test&nbsp;True&nbsp;0&nbsp;None&nbsp;(2003,&nbsp;6,&nbsp;30,&nbsp;1,&nbsp;59)&nbsp;Mon,&nbsp;30&nbsp;Jun&nbsp;2003&nbsp;01:59<br>
test.txt&nbsp;False&nbsp;20&nbsp;None&nbsp;(2003,&nbsp;6,&nbsp;30,&nbsp;2,&nbsp;1)&nbsp;Mon,&nbsp;30&nbsp;Jun&nbsp;2003&nbsp;02:01<br>
this.py&nbsp;False&nbsp;1030&nbsp;None&nbsp;(2002,&nbsp;2,&nbsp;8,&nbsp;16,&nbsp;47)&nbsp;Fri,&nbsp;08&nbsp;Feb&nbsp;2002&nbsp;16:47</tt></dd></dl>
<dl><dt><a name="RarFile-infolist"><strong>infolist</strong></a>(self)</dt><dd><tt>Return&nbsp;a&nbsp;list&nbsp;of&nbsp;RarInfos,&nbsp;descripting&nbsp;the&nbsp;contents&nbsp;of&nbsp;the&nbsp;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&nbsp;specific&nbsp;files&nbsp;from&nbsp;archive&nbsp;into&nbsp;memory.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;list&nbsp;of&nbsp;numbers,&nbsp;then&nbsp;return&nbsp;files&nbsp;which&nbsp;have&nbsp;those&nbsp;positions&nbsp;in&nbsp;infolist.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;string,&nbsp;then&nbsp;it&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;wildcard&nbsp;for&nbsp;names&nbsp;of&nbsp;files&nbsp;to&nbsp;extract.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;function,&nbsp;it&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;callback&nbsp;function,&nbsp;which&nbsp;accepts&nbsp;a&nbsp;<a href="#RarInfo">RarInfo</a>&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;returns&nbsp;boolean&nbsp;True&nbsp;(extract)&nbsp;or&nbsp;False&nbsp;(skip).<br>
If&nbsp;"condition"&nbsp;is&nbsp;omitted,&nbsp;all&nbsp;files&nbsp;are&nbsp;returned.<br>
&nbsp;<br>
Returns&nbsp;list&nbsp;of&nbsp;tuples&nbsp;(<a href="#RarInfo">RarInfo</a>&nbsp;info,&nbsp;str&nbsp;contents)</tt></dd></dl>
<hr>
Methods inherited from <a href="UnRAR2.unix.html#RarFileImplementation">UnRAR2.unix.RarFileImplementation</a>:<br>
<dl><dt><a name="RarFile-call"><strong>call</strong></a>(self, cmd, options<font color="#909090">=[]</font>, files<font color="#909090">=[]</font>)</dt></dl>
<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&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;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>&nbsp;<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>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>Represents&nbsp;a&nbsp;file&nbsp;header&nbsp;in&nbsp;an&nbsp;archive.&nbsp;Don't&nbsp;instantiate&nbsp;directly.<br>
Use&nbsp;only&nbsp;to&nbsp;obtain&nbsp;information&nbsp;about&nbsp;file.<br>
YOU&nbsp;CANNOT&nbsp;EXTRACT&nbsp;FILE&nbsp;CONTENTS&nbsp;USING&nbsp;THIS&nbsp;OBJECT.<br>
USE&nbsp;METHODS&nbsp;OF&nbsp;<a href="#RarFile">RarFile</a>&nbsp;CLASS&nbsp;INSTEAD.<br>
&nbsp;<br>
Properties:<br>
&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;-&nbsp;index&nbsp;of&nbsp;file&nbsp;within&nbsp;the&nbsp;archive<br>
&nbsp;&nbsp;&nbsp;&nbsp;filename&nbsp;-&nbsp;name&nbsp;of&nbsp;the&nbsp;file&nbsp;in&nbsp;the&nbsp;archive&nbsp;including&nbsp;path&nbsp;(if&nbsp;any)<br>
&nbsp;&nbsp;&nbsp;&nbsp;datetime&nbsp;-&nbsp;file&nbsp;date/time&nbsp;as&nbsp;a&nbsp;struct_time&nbsp;suitable&nbsp;for&nbsp;time.strftime<br>
&nbsp;&nbsp;&nbsp;&nbsp;isdir&nbsp;-&nbsp;True&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;a&nbsp;directory<br>
&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;-&nbsp;size&nbsp;in&nbsp;bytes&nbsp;of&nbsp;the&nbsp;uncompressed&nbsp;file<br>
&nbsp;&nbsp;&nbsp;&nbsp;comment&nbsp;-&nbsp;comment&nbsp;associated&nbsp;with&nbsp;the&nbsp;file<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
Note&nbsp;-&nbsp;this&nbsp;is&nbsp;not&nbsp;currently&nbsp;intended&nbsp;to&nbsp;be&nbsp;a&nbsp;Python&nbsp;file-like&nbsp;<a href="__builtin__.html#object">object</a>.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</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&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;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>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-condition2checker"><strong>condition2checker</strong></a>(condition)</dt><dd><tt>Converts&nbsp;different&nbsp;condition&nbsp;types&nbsp;to&nbsp;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>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>__version__</strong> = '0.99.2'<br>
<strong>in_windows</strong> = False</td></tr></table>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: package UnRAR2</title>
<meta charset="utf-8">
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong>UnRAR2</strong></big></big> (version 0.99.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&nbsp;is&nbsp;a&nbsp;ctypes&nbsp;based&nbsp;wrapper&nbsp;around&nbsp;the&nbsp;free&nbsp;UnRAR.dll.&nbsp;<br>
&nbsp;<br>
It&nbsp;is&nbsp;an&nbsp;modified&nbsp;version&nbsp;of&nbsp;Jimmy&nbsp;Retzlaff's&nbsp;pyUnRAR&nbsp;-&nbsp;more&nbsp;simple,<br>
stable&nbsp;and&nbsp;foolproof.<br>
Notice&nbsp;that&nbsp;it&nbsp;has&nbsp;INCOMPATIBLE&nbsp;interface.<br>
&nbsp;<br>
It&nbsp;enables&nbsp;reading&nbsp;and&nbsp;unpacking&nbsp;of&nbsp;archives&nbsp;created&nbsp;with&nbsp;the<br>
RAR/WinRAR&nbsp;archivers.&nbsp;There&nbsp;is&nbsp;a&nbsp;low-level&nbsp;interface&nbsp;which&nbsp;is&nbsp;very<br>
similar&nbsp;to&nbsp;the&nbsp;C&nbsp;interface&nbsp;provided&nbsp;by&nbsp;UnRAR.&nbsp;There&nbsp;is&nbsp;also&nbsp;a<br>
higher&nbsp;level&nbsp;interface&nbsp;which&nbsp;makes&nbsp;some&nbsp;common&nbsp;operations&nbsp;easier.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="UnRAR2.UnRAR2.html"><strong>UnRAR2</strong>&nbsp;(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>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="UnRAR2.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>&nbsp;<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>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="UnRAR2.html#RarFile">RarFile</a></dd>
<dd><a href="UnRAR2.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&nbsp;the&nbsp;archive.<br>
&nbsp;<br>
archiveName&nbsp;is&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;RAR&nbsp;file.<br>
password&nbsp;is&nbsp;used&nbsp;to&nbsp;decrypt&nbsp;the&nbsp;files&nbsp;in&nbsp;the&nbsp;archive.<br>
&nbsp;<br>
Properties:<br>
&nbsp;&nbsp;&nbsp;&nbsp;comment&nbsp;-&nbsp;comment&nbsp;associated&nbsp;with&nbsp;the&nbsp;archive<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;print&nbsp;<a href="#RarFile">RarFile</a>('test.rar').comment<br>
This&nbsp;is&nbsp;a&nbsp;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&nbsp;specific&nbsp;files&nbsp;from&nbsp;archive&nbsp;to&nbsp;disk.<br>
&nbsp;<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;list&nbsp;of&nbsp;numbers,&nbsp;then&nbsp;extract&nbsp;files&nbsp;which&nbsp;have&nbsp;those&nbsp;positions&nbsp;in&nbsp;infolist.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;string,&nbsp;then&nbsp;it&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;wildcard&nbsp;for&nbsp;names&nbsp;of&nbsp;files&nbsp;to&nbsp;extract.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;function,&nbsp;it&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;callback&nbsp;function,&nbsp;which&nbsp;accepts&nbsp;a&nbsp;<a href="#RarInfo">RarInfo</a>&nbsp;<a href="__builtin__.html#object">object</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;returns&nbsp;either&nbsp;boolean&nbsp;True&nbsp;(extract)&nbsp;or&nbsp;boolean&nbsp;False&nbsp;(skip).<br>
DEPRECATED:&nbsp;If&nbsp;"condition"&nbsp;callback&nbsp;returns&nbsp;string&nbsp;(only&nbsp;supported&nbsp;for&nbsp;Windows)&nbsp;-&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;string&nbsp;will&nbsp;be&nbsp;used&nbsp;as&nbsp;a&nbsp;new&nbsp;name&nbsp;to&nbsp;save&nbsp;the&nbsp;file&nbsp;under.<br>
If&nbsp;"condition"&nbsp;is&nbsp;omitted,&nbsp;all&nbsp;files&nbsp;are&nbsp;extracted.<br>
&nbsp;<br>
"path"&nbsp;is&nbsp;a&nbsp;directory&nbsp;to&nbsp;extract&nbsp;to<br>
"withSubpath"&nbsp;flag&nbsp;denotes&nbsp;whether&nbsp;files&nbsp;are&nbsp;extracted&nbsp;with&nbsp;their&nbsp;full&nbsp;path&nbsp;in&nbsp;the&nbsp;archive.<br>
"overwrite"&nbsp;flag&nbsp;denotes&nbsp;whether&nbsp;extracted&nbsp;files&nbsp;will&nbsp;overwrite&nbsp;old&nbsp;ones.&nbsp;Defaults&nbsp;to&nbsp;true.<br>
&nbsp;<br>
Returns&nbsp;list&nbsp;of&nbsp;RarInfos&nbsp;for&nbsp;extracted&nbsp;files.</tt></dd></dl>
<dl><dt><a name="RarFile-get_volume"><strong>get_volume</strong></a>(self)</dt><dd><tt>Determine&nbsp;which&nbsp;volume&nbsp;is&nbsp;it&nbsp;in&nbsp;a&nbsp;multi-volume&nbsp;archive.&nbsp;Returns&nbsp;None&nbsp;if&nbsp;it's&nbsp;not&nbsp;a&nbsp;<br>
multi-volume&nbsp;archive,&nbsp;0-based&nbsp;volume&nbsp;number&nbsp;otherwise.</tt></dd></dl>
<dl><dt><a name="RarFile-infoiter"><strong>infoiter</strong></a>(self)</dt><dd><tt>Iterate&nbsp;over&nbsp;all&nbsp;the&nbsp;files&nbsp;in&nbsp;the&nbsp;archive,&nbsp;generating&nbsp;RarInfos.<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;import&nbsp;os<br>
&gt;&gt;&gt;&nbsp;for&nbsp;fileInArchive&nbsp;in&nbsp;<a href="#RarFile">RarFile</a>('test.rar').<a href="#RarFile-infoiter">infoiter</a>():<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;os.path.split(fileInArchive.filename)[-1],<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;fileInArchive.isdir,<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;fileInArchive.size,<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;fileInArchive.comment,<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;tuple(fileInArchive.datetime)[0:5],<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;time.strftime('%a,&nbsp;%d&nbsp;%b&nbsp;%Y&nbsp;%H:%M',&nbsp;fileInArchive.datetime)<br>
test&nbsp;True&nbsp;0&nbsp;None&nbsp;(2003,&nbsp;6,&nbsp;30,&nbsp;1,&nbsp;59)&nbsp;Mon,&nbsp;30&nbsp;Jun&nbsp;2003&nbsp;01:59<br>
test.txt&nbsp;False&nbsp;20&nbsp;None&nbsp;(2003,&nbsp;6,&nbsp;30,&nbsp;2,&nbsp;1)&nbsp;Mon,&nbsp;30&nbsp;Jun&nbsp;2003&nbsp;02:01<br>
this.py&nbsp;False&nbsp;1030&nbsp;None&nbsp;(2002,&nbsp;2,&nbsp;8,&nbsp;16,&nbsp;47)&nbsp;Fri,&nbsp;08&nbsp;Feb&nbsp;2002&nbsp;16:47</tt></dd></dl>
<dl><dt><a name="RarFile-infolist"><strong>infolist</strong></a>(self)</dt><dd><tt>Return&nbsp;a&nbsp;list&nbsp;of&nbsp;RarInfos,&nbsp;descripting&nbsp;the&nbsp;contents&nbsp;of&nbsp;the&nbsp;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&nbsp;specific&nbsp;files&nbsp;from&nbsp;archive&nbsp;into&nbsp;memory.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;list&nbsp;of&nbsp;numbers,&nbsp;then&nbsp;return&nbsp;files&nbsp;which&nbsp;have&nbsp;those&nbsp;positions&nbsp;in&nbsp;infolist.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;string,&nbsp;then&nbsp;it&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;wildcard&nbsp;for&nbsp;names&nbsp;of&nbsp;files&nbsp;to&nbsp;extract.<br>
If&nbsp;"condition"&nbsp;is&nbsp;a&nbsp;function,&nbsp;it&nbsp;is&nbsp;treated&nbsp;as&nbsp;a&nbsp;callback&nbsp;function,&nbsp;which&nbsp;accepts&nbsp;a&nbsp;<a href="#RarInfo">RarInfo</a>&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;returns&nbsp;boolean&nbsp;True&nbsp;(extract)&nbsp;or&nbsp;False&nbsp;(skip).<br>
If&nbsp;"condition"&nbsp;is&nbsp;omitted,&nbsp;all&nbsp;files&nbsp;are&nbsp;returned.<br>
&nbsp;<br>
Returns&nbsp;list&nbsp;of&nbsp;tuples&nbsp;(<a href="#RarInfo">RarInfo</a>&nbsp;info,&nbsp;str&nbsp;contents)</tt></dd></dl>
<hr>
Methods inherited from <a href="UnRAR2.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&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;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>&nbsp;<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>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>Represents&nbsp;a&nbsp;file&nbsp;header&nbsp;in&nbsp;an&nbsp;archive.&nbsp;Don't&nbsp;instantiate&nbsp;directly.<br>
Use&nbsp;only&nbsp;to&nbsp;obtain&nbsp;information&nbsp;about&nbsp;file.<br>
YOU&nbsp;CANNOT&nbsp;EXTRACT&nbsp;FILE&nbsp;CONTENTS&nbsp;USING&nbsp;THIS&nbsp;OBJECT.<br>
USE&nbsp;METHODS&nbsp;OF&nbsp;<a href="#RarFile">RarFile</a>&nbsp;CLASS&nbsp;INSTEAD.<br>
&nbsp;<br>
Properties:<br>
&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;-&nbsp;index&nbsp;of&nbsp;file&nbsp;within&nbsp;the&nbsp;archive<br>
&nbsp;&nbsp;&nbsp;&nbsp;filename&nbsp;-&nbsp;name&nbsp;of&nbsp;the&nbsp;file&nbsp;in&nbsp;the&nbsp;archive&nbsp;including&nbsp;path&nbsp;(if&nbsp;any)<br>
&nbsp;&nbsp;&nbsp;&nbsp;datetime&nbsp;-&nbsp;file&nbsp;date/time&nbsp;as&nbsp;a&nbsp;struct_time&nbsp;suitable&nbsp;for&nbsp;time.strftime<br>
&nbsp;&nbsp;&nbsp;&nbsp;isdir&nbsp;-&nbsp;True&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;a&nbsp;directory<br>
&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;-&nbsp;size&nbsp;in&nbsp;bytes&nbsp;of&nbsp;the&nbsp;uncompressed&nbsp;file<br>
&nbsp;&nbsp;&nbsp;&nbsp;comment&nbsp;-&nbsp;comment&nbsp;associated&nbsp;with&nbsp;the&nbsp;file<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
Note&nbsp;-&nbsp;this&nbsp;is&nbsp;not&nbsp;currently&nbsp;intended&nbsp;to&nbsp;be&nbsp;a&nbsp;Python&nbsp;file-like&nbsp;<a href="__builtin__.html#object">object</a>.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</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&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;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>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-condition2checker"><strong>condition2checker</strong></a>(condition)</dt><dd><tt>Converts&nbsp;different&nbsp;condition&nbsp;types&nbsp;to&nbsp;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>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>__version__</strong> = '0.99.5'<br>
<strong>in_windows</strong> = True</td></tr></table>
</body></html>

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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.

View File

@ -1 +1 @@
This is x64 version of unrar.dll.
This is x64 version of unrar.dll.

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

Binary file not shown.

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

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

View File

@ -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

View File

@ -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.

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