Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
douban-api-proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
captainwong
douban-api-proxy
Commits
34cd613e
Commit
34cd613e
authored
Mar 27, 2016
by
Jan Broer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixes broken send-to-kindle
parent
6bfaeb4b
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
100 additions
and
41 deletions
+100
-41
helper.py
cps/helper.py
+70
-31
favicon.ico
cps/static/favicon.ico
+0
-0
main.js
cps/static/js/main.js
+7
-1
detail.html
cps/templates/detail.html
+1
-1
email_edit.html
cps/templates/email_edit.html
+5
-1
layout.html
cps/templates/layout.html
+2
-1
user_list.html
cps/templates/user_list.html
+2
-0
ub.py
cps/ub.py
+3
-0
web.py
cps/web.py
+10
-6
No files found.
cps/helper.py
View file @
34cd613e
...
@@ -29,12 +29,18 @@ def update_download(book_id, user_id):
...
@@ -29,12 +29,18 @@ def update_download(book_id, user_id):
def
make_mobi
(
book_id
):
def
make_mobi
(
book_id
):
kindlegen
=
os
.
path
.
join
(
config
.
MAIN_DIR
,
"vendor"
,
"kindlegen"
)
kindlegen
=
os
.
path
.
join
(
config
.
MAIN_DIR
,
"vendor"
,
"kindlegen"
)
if
not
os
.
path
.
exists
(
kindlegen
):
if
not
os
.
path
.
exists
(
kindlegen
):
return
False
print
"make_mobie: kindlegen binary not found in:
%
s"
%
kindlegen
return
None
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
data
=
db
.
session
.
query
(
db
.
Data
)
.
filter
(
db
.
Data
.
book
==
book
.
id
)
.
filter
(
db
.
Data
.
format
==
'EPUB'
)
.
first
()
if
not
data
:
print
"make_mobie: epub format not found for book id:
%
d"
%
book_id
return
None
file_path
=
os
.
path
.
join
(
config
.
DB_ROOT
,
book
.
path
,
data
.
name
)
file_path
=
os
.
path
.
join
(
config
.
DB_ROOT
,
book
.
path
,
book
.
data
[
0
]
.
name
)
# print os.path.getsize(file_path + ".epub")
# print os.path.getsize(file_path + ".epub")
if
os
.
path
.
exists
(
file_path
+
".epub"
)
and
not
os
.
path
.
exists
(
file_path
+
".mobi"
)
:
if
os
.
path
.
exists
(
file_path
+
".epub"
):
# print u"conversion started for %s" % book.title
# print u"conversion started for %s" % book.title
check
=
subprocess
.
call
([
kindlegen
,
file_path
+
".epub"
],
stdout
=
subprocess
.
PIPE
)
check
=
subprocess
.
call
([
kindlegen
,
file_path
+
".epub"
],
stdout
=
subprocess
.
PIPE
)
if
not
check
or
check
<
2
:
if
not
check
or
check
<
2
:
...
@@ -47,47 +53,75 @@ def make_mobi(book_id):
...
@@ -47,47 +53,75 @@ def make_mobi(book_id):
db
.
session
.
commit
()
db
.
session
.
commit
()
return
file_path
+
".mobi"
return
file_path
+
".mobi"
else
:
else
:
return
False
print
"make_mobie: kindlegen failed to convert book"
return
None
else
:
else
:
return
file_path
+
".mobi"
print
"make_mobie: epub not found: "
+
file_path
+
".epub"
return
None
def
send_mail
(
book_id
,
kindle_mail
):
def
send_mail
(
book_id
,
kindle_mail
):
'''Send email with attachments'''
'''Send email with attachments'''
is_mobi
=
False
is_mobi
=
False
is_azw
=
False
is_azw3
=
False
is_epub
=
False
is_epub
=
False
is_pdf
=
False
file_path
=
None
settings
=
ub
.
get_mail_settings
()
settings
=
ub
.
get_mail_settings
()
# create MIME message
# create MIME message
msg
=
MIMEMultipart
()
msg
=
MIMEMultipart
()
msg
[
'From'
]
=
settings
[
"mail_from"
]
msg
[
'From'
]
=
settings
[
"mail_from"
]
msg
[
'To'
]
=
kindle_mail
msg
[
'To'
]
=
kindle_mail
msg
[
'Subject'
]
=
'Sent to Kindle'
msg
[
'Subject'
]
=
'Sent to Kindle'
text
=
'This email has been
automatically sent by library
.'
text
=
'This email has been
sent via calibre web
.'
msg
.
attach
(
MIMEText
(
text
))
msg
.
attach
(
MIMEText
(
text
))
use_ssl
=
settings
.
get
(
'mail_use_ssl'
,
0
)
print
"use ssl:
%
d"
%
use_ssl
# attach files
# attach files
#msg.attach(self.get_attachment(file_path))
#msg.attach(self.get_attachment(file_path))
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
for
format
in
book
.
data
:
data
=
db
.
session
.
query
(
db
.
Data
)
.
filter
(
db
.
Data
.
book
==
book
.
id
)
if
format
.
format
==
"MOBI"
:
is_mobi
==
True
formats
=
{}
if
format
.
format
==
"EPUB"
:
is_epub
=
True
for
entry
in
data
:
if
entry
.
format
==
"MOBI"
:
formats
[
"mobi"
]
=
os
.
path
.
join
(
config
.
DB_ROOT
,
book
.
path
,
entry
.
name
+
".mobi"
)
if
is_mobi
:
if
entry
.
format
==
"AZW"
:
file_path
=
os
.
path
.
join
(
config
.
DB_ROOT
,
book
.
path
,
format
.
name
+
".mobi"
)
formats
[
"azw"
]
=
os
.
path
.
join
(
config
.
DB_ROOT
,
book
.
path
,
entry
.
name
+
".azw"
)
if
entry
.
format
==
"AZW3"
:
if
is_epub
and
not
is_mobi
:
formats
[
"azw3"
]
=
os
.
path
.
join
(
config
.
DB_ROOT
,
book
.
path
,
entry
.
name
+
".azw3"
)
file_path
=
make_mobi
(
book
.
id
)
if
entry
.
format
==
"EPUB"
:
formats
[
"epub"
]
=
os
.
path
.
join
(
config
.
DB_ROOT
,
book
.
path
,
entry
.
name
+
".epub"
)
if
file_path
:
if
entry
.
format
==
"PDF"
:
msg
.
attach
(
get_attachment
(
file_path
))
formats
[
"pdf"
]
=
os
.
path
.
join
(
config
.
DB_ROOT
,
book
.
path
,
entry
.
name
+
".pdf"
)
if
len
(
formats
)
==
0
:
print
"no formats found"
return
"Could not find any formats that can be send by email"
if
'azw3'
in
formats
:
msg
.
attach
(
get_attachment
(
formats
[
'azw3'
]))
elif
'azw'
in
formats
:
msg
.
attach
(
get_attachment
(
formats
[
'azw'
]))
elif
'mobi'
in
formats
:
msg
.
attach
(
get_attachment
(
formats
[
'mobi'
]))
elif
'epub'
in
formats
:
filepath
=
make_mobi
(
book
.
id
)
if
filepath
is
not
None
:
msg
.
attach
(
get_attachment
(
filepath
))
elif
'pdf'
in
formats
:
msg
.
attach
(
get_attachment
(
formats
[
'pdf'
]))
elif
'pdf'
in
formats
:
msg
.
attach
(
get_attachment
(
formats
[
'pdf'
]))
else
:
else
:
return
False
return
"Could not find any formats that can be send by email"
#sys.exit()
# convert MIME message to string
# convert MIME message to string
fp
=
StringIO
()
fp
=
StringIO
()
gen
=
Generator
(
fp
,
mangle_from_
=
False
)
gen
=
Generator
(
fp
,
mangle_from_
=
False
)
...
@@ -96,17 +130,22 @@ def send_mail(book_id, kindle_mail):
...
@@ -96,17 +130,22 @@ def send_mail(book_id, kindle_mail):
# send email
# send email
try
:
try
:
mail_server
=
smtplib
.
SMTP
(
host
=
settings
[
"mail_server"
],
mailserver
=
smtplib
.
SMTP
(
settings
[
"mail_server"
],
settings
[
"mail_port"
])
port
=
settings
[
"mail_port"
])
mailserver
.
set_debuglevel
(
0
)
mail_server
.
login
(
settings
[
"mail_login"
],
settings
[
"mail_password"
])
mail_server
.
sendmail
(
settings
[
"mail_login"
],
kindle_mail
,
msg
)
if
int
(
use_ssl
)
==
1
:
mail_server
.
close
()
mailserver
.
ehlo
()
mailserver
.
starttls
()
mailserver
.
ehlo
()
mailserver
.
login
(
settings
[
"mail_login"
],
settings
[
"mail_password"
])
mailserver
.
sendmail
(
settings
[
"mail_login"
],
kindle_mail
,
msg
)
mailserver
.
quit
()
except
smtplib
.
SMTPException
:
except
smtplib
.
SMTPException
:
traceback
.
print_exc
()
traceback
.
print_exc
()
return
False
return
"Error communicating with the mail server, please check the logs for details."
#sys.exit(7)
return
Tru
e
return
Non
e
def
get_attachment
(
file_path
):
def
get_attachment
(
file_path
):
...
...
cps/static/favicon.ico
0 → 100644
View file @
34cd613e
519 Bytes
cps/static/js/main.js
View file @
34cd613e
$
(
function
()
{
$
(
function
()
{
$
(
'.discover .row'
).
isotope
({
$
(
'.discover .row'
).
isotope
({
// options
// options
...
@@ -20,6 +19,13 @@ $(function() {
...
@@ -20,6 +19,13 @@ $(function() {
},
function
(
data
){
},
function
(
data
){
$
(
'.load-more .row'
).
isotope
(
'appended'
,
$
(
data
),
null
);
$
(
'.load-more .row'
).
isotope
(
'appended'
,
$
(
data
),
null
);
});
});
$
(
'#sendbtn'
).
click
(
function
(){
var
$this
=
$
(
this
);
$this
.
text
(
'Please wait...'
);
$this
.
addClass
(
'disabled'
);
});
});
});
$
(
window
).
resize
(
function
(
event
)
{
$
(
window
).
resize
(
function
(
event
)
{
...
...
cps/templates/detail.html
View file @
34cd613e
...
@@ -76,7 +76,7 @@
...
@@ -76,7 +76,7 @@
</ul>
</ul>
</div>
</div>
{% if g.user.kindle_mail %}
{% if g.user.kindle_mail %}
<a
target=
"_blank"
href=
"{{url_for('send_to_kindle', book_id=entry.id)}}
"
class=
"btn btn-primary"
role=
"button"
><span
class=
"glyphicon glyphicon-send"
></span>
Send to Kindle
</a>
<a
href=
"{{url_for('send_to_kindle', book_id=entry.id)}}"
id=
"sendbtn
"
class=
"btn btn-primary"
role=
"button"
><span
class=
"glyphicon glyphicon-send"
></span>
Send to Kindle
</a>
{% endif %}
{% endif %}
<a
target=
"_blank"
href=
"{{url_for('read_book', book_id=entry.id)}}"
class=
"btn btn-primary"
role=
"button"
><span
class=
"glyphicon glyphicon-eye-open"
></span>
Read in browser
</a>
<a
target=
"_blank"
href=
"{{url_for('read_book', book_id=entry.id)}}"
class=
"btn btn-primary"
role=
"button"
><span
class=
"glyphicon glyphicon-eye-open"
></span>
Read in browser
</a>
...
...
cps/templates/email_edit.html
View file @
34cd613e
...
@@ -8,9 +8,13 @@
...
@@ -8,9 +8,13 @@
<input
type=
"text"
class=
"form-control"
name=
"mail_server"
id=
"mail_server"
value=
"{{content.mail_server}}"
>
<input
type=
"text"
class=
"form-control"
name=
"mail_server"
id=
"mail_server"
value=
"{{content.mail_server}}"
>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"mail_port"
>
SMTP port
</label>
<label
for=
"mail_port"
>
SMTP port
(usually 25 for unencrypted and 587 for StartTLS)
</label>
<input
type=
"text"
class=
"form-control"
name=
"mail_port"
id=
"mail_port"
value=
"{{content.mail_port}}"
>
<input
type=
"text"
class=
"form-control"
name=
"mail_port"
id=
"mail_port"
value=
"{{content.mail_port}}"
>
</div>
</div>
<div
class=
"form-group"
>
<label
for=
"mail_use_ssl"
>
Server requires encryption (StartTLS)
</label>
<input
type=
"checkbox"
name=
"mail_use_ssl"
id=
"mail_use_ssl"
{%
if
content
.
mail_use_ssl
%}
checked
{%
endif
%}
>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"mail_login"
>
SMTP login
</label>
<label
for=
"mail_login"
>
SMTP login
</label>
<input
type=
"text"
class=
"form-control"
name=
"mail_login"
id=
"mail_login"
value=
"{{content.mail_login}}"
>
<input
type=
"text"
class=
"form-control"
name=
"mail_login"
id=
"mail_login"
value=
"{{content.mail_login}}"
>
...
...
cps/templates/layout.html
View file @
34cd613e
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<html>
<head>
<head>
<title>
library
| {{title}}
</title>
<title>
calibre web
| {{title}}
</title>
<meta
charset=
"utf-8"
>
<meta
charset=
"utf-8"
>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1.0"
>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1.0"
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge,chrome=1"
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge,chrome=1"
>
<meta
name=
"apple-mobile-web-app-capable"
content=
"yes"
>
<meta
name=
"apple-mobile-web-app-capable"
content=
"yes"
>
<!-- Bootstrap -->
<!-- Bootstrap -->
<link
rel=
"shortcut icon"
href=
"{{ url_for('static', filename='favicon.ico') }}"
>
<link
href=
"{{ url_for('static', filename='css/bootstrap.min.css') }}"
rel=
"stylesheet"
media=
"screen"
>
<link
href=
"{{ url_for('static', filename='css/bootstrap.min.css') }}"
rel=
"stylesheet"
media=
"screen"
>
<link
href=
"{{ url_for('static', filename='css/style.css') }}"
rel=
"stylesheet"
media=
"screen"
>
<link
href=
"{{ url_for('static', filename='css/style.css') }}"
rel=
"stylesheet"
media=
"screen"
>
...
...
cps/templates/user_list.html
View file @
34cd613e
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
<tr>
<tr>
<th>
SMTP hostname
</th>
<th>
SMTP hostname
</th>
<th>
SMTP port
</th>
<th>
SMTP port
</th>
<th>
Server requires SSL
</th>
<th>
SMTP login
</th>
<th>
SMTP login
</th>
<th>
SMTP password
</th>
<th>
SMTP password
</th>
<th>
From mail
</th>
<th>
From mail
</th>
...
@@ -32,6 +33,7 @@
...
@@ -32,6 +33,7 @@
<tr>
<tr>
<td>
{{email.mail_server}}
</td>
<td>
{{email.mail_server}}
</td>
<td>
{{email.mail_port}}
</td>
<td>
{{email.mail_port}}
</td>
<td>
{% if email.mail_use_ssl %}
<span
class=
"glyphicon glyphicon-ok"
></span>
{% else %}
<span
class=
"glyphicon glyphicon-remove"
></span>
{% endif %}
</td>
<td>
{{email.mail_login}}
</td>
<td>
{{email.mail_login}}
</td>
<td>
********
</td>
<td>
********
</td>
<td>
{{email.mail_from}}
</td>
<td>
{{email.mail_from}}
</td>
...
...
cps/ub.py
View file @
34cd613e
...
@@ -109,6 +109,7 @@ class Settings(Base):
...
@@ -109,6 +109,7 @@ class Settings(Base):
id
=
Column
(
Integer
,
primary_key
=
True
)
id
=
Column
(
Integer
,
primary_key
=
True
)
mail_server
=
Column
(
String
)
mail_server
=
Column
(
String
)
mail_port
=
Column
(
Integer
,
default
=
25
)
mail_port
=
Column
(
Integer
,
default
=
25
)
mail_use_ssl
=
Column
(
SmallInteger
,
default
=
0
)
mail_login
=
Column
(
String
)
mail_login
=
Column
(
String
)
mail_password
=
Column
(
String
)
mail_password
=
Column
(
String
)
mail_from
=
Column
(
String
)
mail_from
=
Column
(
String
)
...
@@ -121,6 +122,7 @@ def create_default_config():
...
@@ -121,6 +122,7 @@ def create_default_config():
settings
=
Settings
()
settings
=
Settings
()
settings
.
mail_server
=
"mail.example.com"
settings
.
mail_server
=
"mail.example.com"
settings
.
mail_port
=
25
settings
.
mail_port
=
25
settings
.
mail_use_ssl
=
0
settings
.
mail_login
=
"mail@example.com"
settings
.
mail_login
=
"mail@example.com"
settings
.
mail_password
=
"mypassword"
settings
.
mail_password
=
"mypassword"
settings
.
mail_from
=
"automailer <mail@example.com>"
settings
.
mail_from
=
"automailer <mail@example.com>"
...
@@ -137,6 +139,7 @@ def get_mail_settings():
...
@@ -137,6 +139,7 @@ def get_mail_settings():
data
=
{
data
=
{
'mail_server'
:
settings
.
mail_server
,
'mail_server'
:
settings
.
mail_server
,
'mail_port'
:
settings
.
mail_port
,
'mail_port'
:
settings
.
mail_port
,
'mail_use_ssl'
:
settings
.
mail_use_ssl
,
'mail_login'
:
settings
.
mail_login
,
'mail_login'
:
settings
.
mail_login
,
'mail_password'
:
settings
.
mail_password
,
'mail_password'
:
settings
.
mail_password
,
'mail_from'
:
settings
.
mail_from
'mail_from'
:
settings
.
mail_from
...
...
cps/web.py
View file @
34cd613e
...
@@ -450,16 +450,16 @@ def logout():
...
@@ -450,16 +450,16 @@ def logout():
def
send_to_kindle
(
book_id
):
def
send_to_kindle
(
book_id
):
settings
=
ub
.
get_mail_settings
()
settings
=
ub
.
get_mail_settings
()
if
settings
.
get
(
"mail_server"
,
"mail.example.com"
)
==
"mail.example.com"
:
if
settings
.
get
(
"mail_server"
,
"mail.example.com"
)
==
"mail.example.com"
:
flash
(
"Please configure the SMTP
email account
first..."
,
category
=
"error"
)
flash
(
"Please configure the SMTP
mail settings
first..."
,
category
=
"error"
)
elif
current_user
.
kindle_mail
:
elif
current_user
.
kindle_mail
:
x
=
helper
.
send_mail
(
book_id
,
current_user
.
kindle_mail
)
result
=
helper
.
send_mail
(
book_id
,
current_user
.
kindle_mail
)
if
x
:
if
result
is
None
:
flash
(
"
Mail
successfully send to
%
s"
%
current_user
.
kindle_mail
,
category
=
"success"
)
flash
(
"
Book
successfully send to
%
s"
%
current_user
.
kindle_mail
,
category
=
"success"
)
helper
.
update_download
(
book_id
,
int
(
current_user
.
id
))
helper
.
update_download
(
book_id
,
int
(
current_user
.
id
))
else
:
else
:
flash
(
"There was an error sending this book
"
,
category
=
"error"
)
flash
(
"There was an error sending this book
:
%
s"
%
result
,
category
=
"error"
)
else
:
else
:
flash
(
"Please
set a kindle mail
first..."
,
category
=
"error"
)
flash
(
"Please
configure your kindle email address
first..."
,
category
=
"error"
)
return
redirect
(
request
.
environ
[
"HTTP_REFERER"
])
return
redirect
(
request
.
environ
[
"HTTP_REFERER"
])
@
app
.
route
(
"/shelf/add/<int:shelf_id>/<int:book_id>"
)
@
app
.
route
(
"/shelf/add/<int:shelf_id>/<int:book_id>"
)
...
@@ -607,6 +607,10 @@ def edit_mailsettings():
...
@@ -607,6 +607,10 @@ def edit_mailsettings():
content
.
mail_login
=
to_save
[
"mail_login"
]
content
.
mail_login
=
to_save
[
"mail_login"
]
content
.
mail_password
=
to_save
[
"mail_password"
]
content
.
mail_password
=
to_save
[
"mail_password"
]
content
.
mail_from
=
to_save
[
"mail_from"
]
content
.
mail_from
=
to_save
[
"mail_from"
]
if
"mail_use_ssl"
in
to_save
:
content
.
mail_use_ssl
=
1
else
:
content
.
mail_use_ssl
=
0
try
:
try
:
ub
.
session
.
commit
()
ub
.
session
.
commit
()
flash
(
"Mail settings updated"
,
category
=
"success"
)
flash
(
"Mail settings updated"
,
category
=
"success"
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment