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
1a458fe3
Commit
1a458fe3
authored
May 21, 2020
by
Ozzieisaacs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix for #1407 converting books should now be possible again
parent
a4841836
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
397 additions
and
324 deletions
+397
-324
__init__.py
cps/__init__.py
+7
-1
about.py
cps/about.py
+5
-5
admin.py
cps/admin.py
+6
-6
db.py
cps/db.py
+175
-136
editbooks.py
cps/editbooks.py
+70
-69
helper.py
cps/helper.py
+21
-21
kobo.py
cps/kobo.py
+9
-9
opds.py
cps/opds.py
+17
-17
server.py
cps/server.py
+3
-0
shelf.py
cps/shelf.py
+5
-5
web.py
cps/web.py
+48
-47
worker.py
cps/worker.py
+31
-8
No files found.
cps/__init__.py
View file @
1a458fe3
...
@@ -37,6 +37,9 @@ from . import config_sql, logger, cache_buster, cli, ub, db
...
@@ -37,6 +37,9 @@ from . import config_sql, logger, cache_buster, cli, ub, db
from
.reverseproxy
import
ReverseProxied
from
.reverseproxy
import
ReverseProxied
from
.server
import
WebServer
from
.server
import
WebServer
# import queue
# queue = queue.Queue()
mimetypes
.
init
()
mimetypes
.
init
()
mimetypes
.
add_type
(
'application/xhtml+xml'
,
'.xhtml'
)
mimetypes
.
add_type
(
'application/xhtml+xml'
,
'.xhtml'
)
mimetypes
.
add_type
(
'application/epub+zip'
,
'.epub'
)
mimetypes
.
add_type
(
'application/epub+zip'
,
'.epub'
)
...
@@ -82,6 +85,8 @@ log = logger.create()
...
@@ -82,6 +85,8 @@ log = logger.create()
from
.
import
services
from
.
import
services
calibre_db
=
db
.
CalibreDB
()
def
create_app
():
def
create_app
():
app
.
wsgi_app
=
ReverseProxied
(
app
.
wsgi_app
)
app
.
wsgi_app
=
ReverseProxied
(
app
.
wsgi_app
)
# For python2 convert path to unicode
# For python2 convert path to unicode
...
@@ -98,7 +103,8 @@ def create_app():
...
@@ -98,7 +103,8 @@ def create_app():
app
.
secret_key
=
os
.
getenv
(
'SECRET_KEY'
,
config_sql
.
get_flask_session_key
(
ub
.
session
))
app
.
secret_key
=
os
.
getenv
(
'SECRET_KEY'
,
config_sql
.
get_flask_session_key
(
ub
.
session
))
web_server
.
init_app
(
app
,
config
)
web_server
.
init_app
(
app
,
config
)
db
.
setup_db
(
config
,
cli
.
settingspath
)
calibre_db
.
setup_db
(
config
,
cli
.
settingspath
)
calibre_db
.
start
()
babel
.
init_app
(
app
)
babel
.
init_app
(
app
)
_BABEL_TRANSLATIONS
.
update
(
str
(
item
)
for
item
in
babel
.
list_translations
())
_BABEL_TRANSLATIONS
.
update
(
str
(
item
)
for
item
in
babel
.
list_translations
())
...
...
cps/about.py
View file @
1a458fe3
...
@@ -30,7 +30,7 @@ import babel, pytz, requests, sqlalchemy
...
@@ -30,7 +30,7 @@ import babel, pytz, requests, sqlalchemy
import
werkzeug
,
flask
,
flask_login
,
flask_principal
,
jinja2
import
werkzeug
,
flask
,
flask_login
,
flask_principal
,
jinja2
from
flask_babel
import
gettext
as
_
from
flask_babel
import
gettext
as
_
from
.
import
db
,
converter
,
uploader
,
server
,
isoLanguages
,
constants
from
.
import
db
,
c
alibre_db
,
c
onverter
,
uploader
,
server
,
isoLanguages
,
constants
from
.web
import
render_title_template
from
.web
import
render_title_template
try
:
try
:
from
flask_login
import
__version__
as
flask_loginVersion
from
flask_login
import
__version__
as
flask_loginVersion
...
@@ -85,10 +85,10 @@ _VERSIONS.update(uploader.get_versions())
...
@@ -85,10 +85,10 @@ _VERSIONS.update(uploader.get_versions())
@
about
.
route
(
"/stats"
)
@
about
.
route
(
"/stats"
)
@
flask_login
.
login_required
@
flask_login
.
login_required
def
stats
():
def
stats
():
counter
=
db
.
session
.
query
(
db
.
Books
)
.
count
()
counter
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
count
()
authors
=
db
.
session
.
query
(
db
.
Authors
)
.
count
()
authors
=
calibre_
db
.
session
.
query
(
db
.
Authors
)
.
count
()
categorys
=
db
.
session
.
query
(
db
.
Tags
)
.
count
()
categorys
=
calibre_
db
.
session
.
query
(
db
.
Tags
)
.
count
()
series
=
db
.
session
.
query
(
db
.
Series
)
.
count
()
series
=
calibre_
db
.
session
.
query
(
db
.
Series
)
.
count
()
_VERSIONS
[
'ebook converter'
]
=
_
(
converter
.
get_calibre_version
())
_VERSIONS
[
'ebook converter'
]
=
_
(
converter
.
get_calibre_version
())
_VERSIONS
[
'unrar'
]
=
_
(
converter
.
get_unrar_version
())
_VERSIONS
[
'unrar'
]
=
_
(
converter
.
get_unrar_version
())
_VERSIONS
[
'kepubify'
]
=
_
(
converter
.
get_kepubify_version
())
_VERSIONS
[
'kepubify'
]
=
_
(
converter
.
get_kepubify_version
())
...
...
cps/admin.py
View file @
1a458fe3
...
@@ -38,7 +38,7 @@ from sqlalchemy.exc import IntegrityError
...
@@ -38,7 +38,7 @@ from sqlalchemy.exc import IntegrityError
from
sqlalchemy.sql.expression
import
func
from
sqlalchemy.sql.expression
import
func
from
.
import
constants
,
logger
,
helper
,
services
from
.
import
constants
,
logger
,
helper
,
services
from
.
import
db
,
ub
,
web_server
,
get_locale
,
config
,
updater_thread
,
babel
,
gdriveutils
from
.
import
db
,
calibre_db
,
ub
,
web_server
,
get_locale
,
config
,
updater_thread
,
babel
,
gdriveutils
from
.helper
import
speaking_language
,
check_valid_domain
,
send_test_mail
,
reset_password
,
generate_password_hash
from
.helper
import
speaking_language
,
check_valid_domain
,
send_test_mail
,
reset_password
,
generate_password_hash
from
.gdriveutils
import
is_gdrive_ready
,
gdrive_support
from
.gdriveutils
import
is_gdrive_ready
,
gdrive_support
from
.web
import
admin_required
,
render_title_template
,
before_request
,
unconfigured
,
login_required_if_no_ano
from
.web
import
admin_required
,
render_title_template
,
before_request
,
unconfigured
,
login_required_if_no_ano
...
@@ -86,7 +86,7 @@ def shutdown():
...
@@ -86,7 +86,7 @@ def shutdown():
showtext
=
{}
showtext
=
{}
if
task
in
(
0
,
1
):
# valid commandos received
if
task
in
(
0
,
1
):
# valid commandos received
# close all database connections
# close all database connections
db
.
dispose
()
calibre_
db
.
dispose
()
ub
.
dispose
()
ub
.
dispose
()
if
task
==
0
:
if
task
==
0
:
...
@@ -99,7 +99,7 @@ def shutdown():
...
@@ -99,7 +99,7 @@ def shutdown():
if
task
==
2
:
if
task
==
2
:
log
.
warning
(
"reconnecting to calibre database"
)
log
.
warning
(
"reconnecting to calibre database"
)
db
.
setup_db
(
config
,
ub
.
app_DB_path
)
calibre_
db
.
setup_db
(
config
,
ub
.
app_DB_path
)
showtext
[
'text'
]
=
_
(
u'Reconnect successful'
)
showtext
[
'text'
]
=
_
(
u'Reconnect successful'
)
return
json
.
dumps
(
showtext
)
return
json
.
dumps
(
showtext
)
...
@@ -148,9 +148,9 @@ def configuration():
...
@@ -148,9 +148,9 @@ def configuration():
@
login_required
@
login_required
@
admin_required
@
admin_required
def
view_configuration
():
def
view_configuration
():
readColumn
=
db
.
session
.
query
(
db
.
Custom_Columns
)
\
readColumn
=
calibre_
db
.
session
.
query
(
db
.
Custom_Columns
)
\
.
filter
(
and_
(
db
.
Custom_Columns
.
datatype
==
'bool'
,
db
.
Custom_Columns
.
mark_for_delete
==
0
))
.
all
()
.
filter
(
and_
(
db
.
Custom_Columns
.
datatype
==
'bool'
,
db
.
Custom_Columns
.
mark_for_delete
==
0
))
.
all
()
restrictColumns
=
db
.
session
.
query
(
db
.
Custom_Columns
)
\
restrictColumns
=
calibre_
db
.
session
.
query
(
db
.
Custom_Columns
)
\
.
filter
(
and_
(
db
.
Custom_Columns
.
datatype
==
'text'
,
db
.
Custom_Columns
.
mark_for_delete
==
0
))
.
all
()
.
filter
(
and_
(
db
.
Custom_Columns
.
datatype
==
'text'
,
db
.
Custom_Columns
.
mark_for_delete
==
0
))
.
all
()
return
render_title_template
(
"config_view_edit.html"
,
conf
=
config
,
readColumns
=
readColumn
,
return
render_title_template
(
"config_view_edit.html"
,
conf
=
config
,
readColumns
=
readColumn
,
restrictColumns
=
restrictColumns
,
restrictColumns
=
restrictColumns
,
...
@@ -944,7 +944,7 @@ def edit_user(user_id):
...
@@ -944,7 +944,7 @@ def edit_user(user_id):
translations
=
babel
.
list_translations
()
+
[
LC
(
'en'
)]
translations
=
babel
.
list_translations
()
+
[
LC
(
'en'
)]
kobo_support
=
feature_support
[
'kobo'
]
and
config
.
config_kobo_sync
kobo_support
=
feature_support
[
'kobo'
]
and
config
.
config_kobo_sync
for
book
in
content
.
downloads
:
for
book
in
content
.
downloads
:
downloadbook
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
first
()
downloadbook
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
first
()
if
downloadbook
:
if
downloadbook
:
downloads
.
append
(
downloadbook
)
downloads
.
append
(
downloadbook
)
else
:
else
:
...
...
cps/db.py
100755 → 100644
View file @
1a458fe3
...
@@ -23,18 +23,22 @@ import os
...
@@ -23,18 +23,22 @@ import os
import
re
import
re
import
ast
import
ast
from
datetime
import
datetime
from
datetime
import
datetime
import
threading
import
time
import
queue
from
sqlalchemy
import
create_engine
,
event
from
sqlalchemy
import
create_engine
from
sqlalchemy
import
Table
,
Column
,
ForeignKey
,
CheckConstraint
from
sqlalchemy
import
Table
,
Column
,
ForeignKey
,
CheckConstraint
from
sqlalchemy
import
String
,
Integer
,
Boolean
,
TIMESTAMP
,
Float
from
sqlalchemy
import
String
,
Integer
,
Boolean
,
TIMESTAMP
,
Float
from
sqlalchemy.orm
import
relationship
,
sessionmaker
,
scoped_session
from
sqlalchemy.orm
import
relationship
,
sessionmaker
,
scoped_session
from
sqlalchemy.ext.declarative
import
declarative_base
from
sqlalchemy.ext.declarative
import
declarative_base
from
sqlalchemy.exc
import
OperationalError
from
.
import
logger
session
=
None
#
session = None
cc_exceptions
=
[
'datetime'
,
'comments'
,
'composite'
,
'series'
]
cc_exceptions
=
[
'datetime'
,
'comments'
,
'composite'
,
'series'
]
cc_classes
=
{}
cc_classes
=
{}
engine
=
None
#
engine = None
Base
=
declarative_base
()
Base
=
declarative_base
()
...
@@ -226,6 +230,7 @@ class Publishers(Base):
...
@@ -226,6 +230,7 @@ class Publishers(Base):
class
Data
(
Base
):
class
Data
(
Base
):
__tablename__
=
'data'
__tablename__
=
'data'
__table_args__
=
{
'schema'
:
'calibre'
}
id
=
Column
(
Integer
,
primary_key
=
True
)
id
=
Column
(
Integer
,
primary_key
=
True
)
book
=
Column
(
Integer
,
ForeignKey
(
'books.id'
),
nullable
=
False
)
book
=
Column
(
Integer
,
ForeignKey
(
'books.id'
),
nullable
=
False
)
...
@@ -314,24 +319,45 @@ class Custom_Columns(Base):
...
@@ -314,24 +319,45 @@ class Custom_Columns(Base):
return
display_dict
return
display_dict
def
update_title_sort
(
config
,
conn
=
None
):
class
CalibreDB
(
threading
.
Thread
):
# user defined sort function for calibre databases (Series, etc.)
def
_title_sort
(
title
):
def
__init__
(
self
):
# calibre sort stuff
threading
.
Thread
.
__init__
(
self
)
title_pat
=
re
.
compile
(
config
.
config_title_regex
,
re
.
IGNORECASE
)
self
.
engine
=
None
match
=
title_pat
.
search
(
title
)
self
.
session
=
None
if
match
:
self
.
queue
=
None
prep
=
match
.
group
(
1
)
self
.
log
=
None
title
=
title
.
replace
(
prep
,
''
)
+
', '
+
prep
return
title
.
strip
()
def
add_queue
(
self
,
queue
):
self
.
queue
=
queue
self
.
log
=
logger
.
create
()
def
run
(
self
):
while
True
:
i
=
self
.
queue
.
get
()
if
i
==
'dummy'
:
self
.
queue
.
task_done
()
break
if
i
[
'task'
]
==
'add_format'
:
cur_book
=
self
.
session
.
query
(
Books
)
.
filter
(
Books
.
id
==
i
[
'id'
])
.
first
()
cur_book
.
data
.
append
(
i
[
'format'
])
try
:
# db.session.merge(cur_book)
self
.
session
.
commit
()
except
OperationalError
as
e
:
self
.
session
.
rollback
()
self
.
log
.
error
(
"Database error:
%
s"
,
e
)
# self._handleError(_(u"Database error: %(error)s.", error=e))
# return
self
.
queue
.
task_done
()
conn
=
conn
or
session
.
connection
()
.
connection
.
connection
conn
.
create_function
(
"title_sort"
,
1
,
_title_sort
)
def
stop
(
self
):
self
.
queue
.
put
(
'dummy'
)
def
setup_db
(
config
,
app_db_path
):
def
setup_db
(
self
,
config
,
app_db_path
):
dispose
()
self
.
dispose
()
global
engine
#
global engine
if
not
config
.
config_calibre_dir
:
if
not
config
.
config_calibre_dir
:
config
.
invalidate
()
config
.
invalidate
()
...
@@ -344,21 +370,21 @@ def setup_db(config, app_db_path):
...
@@ -344,21 +370,21 @@ def setup_db(config, app_db_path):
try
:
try
:
#engine = create_engine('sqlite:///{0}'.format(dbpath),
#engine = create_engine('sqlite:///{0}'.format(dbpath),
engine
=
create_engine
(
'sqlite://'
,
self
.
engine
=
create_engine
(
'sqlite://'
,
echo
=
False
,
echo
=
False
,
isolation_level
=
"SERIALIZABLE"
,
isolation_level
=
"SERIALIZABLE"
,
connect_args
=
{
'check_same_thread'
:
False
})
connect_args
=
{
'check_same_thread'
:
False
})
engine
.
execute
(
"attach database '{}' as calibre;"
.
format
(
dbpath
))
self
.
engine
.
execute
(
"attach database '{}' as calibre;"
.
format
(
dbpath
))
engine
.
execute
(
"attach database '{}' as app_settings;"
.
format
(
app_db_path
))
self
.
engine
.
execute
(
"attach database '{}' as app_settings;"
.
format
(
app_db_path
))
conn
=
engine
.
connect
()
conn
=
self
.
engine
.
connect
()
# conn.text_factory = lambda b: b.decode(errors = 'ignore') possible fix for #1302
# conn.text_factory = lambda b: b.decode(errors = 'ignore') possible fix for #1302
except
Exception
as
e
:
except
Exception
as
e
:
config
.
invalidate
(
e
)
config
.
invalidate
(
e
)
return
False
return
False
config
.
db_configured
=
True
config
.
db_configured
=
True
update_title_sort
(
config
,
conn
.
connection
)
self
.
update_title_sort
(
config
,
conn
.
connection
)
if
not
cc_classes
:
if
not
cc_classes
:
cc
=
conn
.
execute
(
"SELECT id, datatype FROM custom_columns"
)
cc
=
conn
.
execute
(
"SELECT id, datatype FROM custom_columns"
)
...
@@ -408,19 +434,32 @@ def setup_db(config, app_db_path):
...
@@ -408,19 +434,32 @@ def setup_db(config, app_db_path):
backref
=
'books'
))
backref
=
'books'
))
global
session
#
global session
Session
=
scoped_session
(
sessionmaker
(
autocommit
=
False
,
Session
=
scoped_session
(
sessionmaker
(
autocommit
=
False
,
autoflush
=
False
,
autoflush
=
False
,
bind
=
engine
))
bind
=
self
.
engine
))
session
=
Session
()
self
.
session
=
Session
()
return
True
return
True
def
update_title_sort
(
self
,
config
,
conn
=
None
):
# user defined sort function for calibre databases (Series, etc.)
def
_title_sort
(
title
):
# calibre sort stuff
title_pat
=
re
.
compile
(
config
.
config_title_regex
,
re
.
IGNORECASE
)
match
=
title_pat
.
search
(
title
)
if
match
:
prep
=
match
.
group
(
1
)
title
=
title
.
replace
(
prep
,
''
)
+
', '
+
prep
return
title
.
strip
()
conn
=
conn
or
self
.
session
.
connection
()
.
connection
.
connection
conn
.
create_function
(
"title_sort"
,
1
,
_title_sort
)
def
dispose
(
):
def
dispose
(
self
):
global
session
#
global session
old_session
=
session
old_session
=
self
.
session
session
=
None
self
.
session
=
None
if
old_session
:
if
old_session
:
try
:
old_session
.
close
()
try
:
old_session
.
close
()
except
:
pass
except
:
pass
...
@@ -443,7 +482,7 @@ def dispose():
...
@@ -443,7 +482,7 @@ def dispose():
Base
.
metadata
.
remove
(
table
)
Base
.
metadata
.
remove
(
table
)
def
reconnect_db
(
config
,
app_db_path
):
def
reconnect_db
(
self
,
config
,
app_db_path
):
session
.
close
()
self
.
session
.
close
()
engine
.
dispose
()
self
.
engine
.
dispose
()
setup_db
(
config
,
app_db_path
)
self
.
setup_db
(
config
,
app_db_path
)
cps/editbooks.py
View file @
1a458fe3
This diff is collapsed.
Click to expand it.
cps/helper.py
View file @
1a458fe3
...
@@ -23,7 +23,6 @@ import os
...
@@ -23,7 +23,6 @@ import os
import
io
import
io
import
json
import
json
import
mimetypes
import
mimetypes
import
random
import
re
import
re
import
shutil
import
shutil
import
time
import
time
...
@@ -42,6 +41,7 @@ from flask_login import current_user
...
@@ -42,6 +41,7 @@ from flask_login import current_user
from
sqlalchemy.sql.expression
import
true
,
false
,
and_
,
or_
,
text
,
func
from
sqlalchemy.sql.expression
import
true
,
false
,
and_
,
or_
,
text
,
func
from
werkzeug.datastructures
import
Headers
from
werkzeug.datastructures
import
Headers
from
werkzeug.security
import
generate_password_hash
from
werkzeug.security
import
generate_password_hash
from
.
import
calibre_db
try
:
try
:
from
urllib.parse
import
quote
from
urllib.parse
import
quote
...
@@ -74,8 +74,8 @@ log = logger.create()
...
@@ -74,8 +74,8 @@ log = logger.create()
# Convert existing book entry to new format
# Convert existing book entry to new format
def
convert_book_format
(
book_id
,
calibrepath
,
old_book_format
,
new_book_format
,
user_id
,
kindle_mail
=
None
):
def
convert_book_format
(
book_id
,
calibrepath
,
old_book_format
,
new_book_format
,
user_id
,
kindle_mail
=
None
):
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
book
=
calibre_
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
==
old_book_format
)
.
first
()
data
=
calibre_
db
.
session
.
query
(
db
.
Data
)
.
filter
(
db
.
Data
.
book
==
book
.
id
)
.
filter
(
db
.
Data
.
format
==
old_book_format
)
.
first
()
if
not
data
:
if
not
data
:
error_message
=
_
(
u"
%(format)
s format not found for book id:
%(book)
d"
,
format
=
old_book_format
,
book
=
book_id
)
error_message
=
_
(
u"
%(format)
s format not found for book id:
%(book)
d"
,
format
=
old_book_format
,
book
=
book_id
)
log
.
error
(
"convert_book_format:
%
s"
,
error_message
)
log
.
error
(
"convert_book_format:
%
s"
,
error_message
)
...
@@ -212,7 +212,7 @@ def check_read_formats(entry):
...
@@ -212,7 +212,7 @@ def check_read_formats(entry):
# 3: If Pdf file is existing, it's directly send to kindle email
# 3: If Pdf file is existing, it's directly send to kindle email
def
send_mail
(
book_id
,
book_format
,
convert
,
kindle_mail
,
calibrepath
,
user_id
):
def
send_mail
(
book_id
,
book_format
,
convert
,
kindle_mail
,
calibrepath
,
user_id
):
"""Send email with attachments"""
"""Send email with attachments"""
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
if
convert
==
1
:
if
convert
==
1
:
# returns None if success, otherwise errormessage
# returns None if success, otherwise errormessage
...
@@ -324,7 +324,7 @@ def delete_book_file(book, calibrepath, book_format=None):
...
@@ -324,7 +324,7 @@ def delete_book_file(book, calibrepath, book_format=None):
def
update_dir_structure_file
(
book_id
,
calibrepath
,
first_author
):
def
update_dir_structure_file
(
book_id
,
calibrepath
,
first_author
):
localbook
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
localbook
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
path
=
os
.
path
.
join
(
calibrepath
,
localbook
.
path
)
path
=
os
.
path
.
join
(
calibrepath
,
localbook
.
path
)
authordir
=
localbook
.
path
.
split
(
'/'
)[
0
]
authordir
=
localbook
.
path
.
split
(
'/'
)[
0
]
...
@@ -383,7 +383,7 @@ def update_dir_structure_file(book_id, calibrepath, first_author):
...
@@ -383,7 +383,7 @@ def update_dir_structure_file(book_id, calibrepath, first_author):
def
update_dir_structure_gdrive
(
book_id
,
first_author
):
def
update_dir_structure_gdrive
(
book_id
,
first_author
):
error
=
False
error
=
False
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
first
()
path
=
book
.
path
path
=
book
.
path
authordir
=
book
.
path
.
split
(
'/'
)[
0
]
authordir
=
book
.
path
.
split
(
'/'
)[
0
]
...
@@ -494,13 +494,13 @@ def get_cover_on_failure(use_generic_cover):
...
@@ -494,13 +494,13 @@ def get_cover_on_failure(use_generic_cover):
def
get_book_cover
(
book_id
):
def
get_book_cover
(
book_id
):
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
filter
(
common_filters
(
allow_show_archived
=
True
))
.
first
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
filter
(
common_filters
(
allow_show_archived
=
True
))
.
first
()
return
get_book_cover_internal
(
book
,
use_generic_cover_on_failure
=
True
)
return
get_book_cover_internal
(
book
,
use_generic_cover_on_failure
=
True
)
def
get_book_cover_with_uuid
(
book_uuid
,
def
get_book_cover_with_uuid
(
book_uuid
,
use_generic_cover_on_failure
=
True
):
use_generic_cover_on_failure
=
True
):
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
book_uuid
)
.
first
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
book_uuid
)
.
first
()
return
get_book_cover_internal
(
book
,
use_generic_cover_on_failure
)
return
get_book_cover_internal
(
book
,
use_generic_cover_on_failure
)
...
@@ -775,7 +775,7 @@ def tags_filters():
...
@@ -775,7 +775,7 @@ def tags_filters():
# Creates for all stored languages a translated speaking name in the array for the UI
# Creates for all stored languages a translated speaking name in the array for the UI
def
speaking_language
(
languages
=
None
):
def
speaking_language
(
languages
=
None
):
if
not
languages
:
if
not
languages
:
languages
=
db
.
session
.
query
(
db
.
Languages
)
.
join
(
db
.
books_languages_link
)
.
join
(
db
.
Books
)
\
languages
=
calibre_
db
.
session
.
query
(
db
.
Languages
)
.
join
(
db
.
books_languages_link
)
.
join
(
db
.
Books
)
\
.
filter
(
common_filters
())
\
.
filter
(
common_filters
())
\
.
group_by
(
text
(
'books_languages_link.lang_code'
))
.
all
()
.
group_by
(
text
(
'books_languages_link.lang_code'
))
.
all
()
for
lang
in
languages
:
for
lang
in
languages
:
...
@@ -808,7 +808,7 @@ def order_authors(entry):
...
@@ -808,7 +808,7 @@ def order_authors(entry):
error
=
False
error
=
False
for
auth
in
sort_authors
:
for
auth
in
sort_authors
:
# ToDo: How to handle not found authorname
# ToDo: How to handle not found authorname
result
=
db
.
session
.
query
(
db
.
Authors
)
.
filter
(
db
.
Authors
.
sort
==
auth
.
lstrip
()
.
strip
())
.
first
()
result
=
calibre_
db
.
session
.
query
(
db
.
Authors
)
.
filter
(
db
.
Authors
.
sort
==
auth
.
lstrip
()
.
strip
())
.
first
()
if
not
result
:
if
not
result
:
error
=
True
error
=
True
break
break
...
@@ -825,12 +825,12 @@ def fill_indexpage(page, database, db_filter, order, *join):
...
@@ -825,12 +825,12 @@ def fill_indexpage(page, database, db_filter, order, *join):
def
fill_indexpage_with_archived_books
(
page
,
database
,
db_filter
,
order
,
allow_show_archived
,
*
join
):
def
fill_indexpage_with_archived_books
(
page
,
database
,
db_filter
,
order
,
allow_show_archived
,
*
join
):
if
current_user
.
show_detail_random
():
if
current_user
.
show_detail_random
():
randm
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
common_filters
(
allow_show_archived
))
\
randm
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
common_filters
(
allow_show_archived
))
\
.
order_by
(
func
.
random
())
.
limit
(
config
.
config_random_books
)
.
order_by
(
func
.
random
())
.
limit
(
config
.
config_random_books
)
else
:
else
:
randm
=
false
()
randm
=
false
()
off
=
int
(
int
(
config
.
config_books_per_page
)
*
(
page
-
1
))
off
=
int
(
int
(
config
.
config_books_per_page
)
*
(
page
-
1
))
query
=
db
.
session
.
query
(
database
)
.
join
(
*
join
,
isouter
=
True
)
.
\
query
=
calibre_
db
.
session
.
query
(
database
)
.
join
(
*
join
,
isouter
=
True
)
.
\
filter
(
db_filter
)
.
\
filter
(
db_filter
)
.
\
filter
(
common_filters
(
allow_show_archived
))
filter
(
common_filters
(
allow_show_archived
))
pagination
=
Pagination
(
page
,
config
.
config_books_per_page
,
pagination
=
Pagination
(
page
,
config
.
config_books_per_page
,
...
@@ -843,8 +843,8 @@ def fill_indexpage_with_archived_books(page, database, db_filter, order, allow_s
...
@@ -843,8 +843,8 @@ def fill_indexpage_with_archived_books(page, database, db_filter, order, allow_s
def
get_typeahead
(
database
,
query
,
replace
=
(
''
,
''
),
tag_filter
=
true
()):
def
get_typeahead
(
database
,
query
,
replace
=
(
''
,
''
),
tag_filter
=
true
()):
query
=
query
or
''
query
=
query
or
''
db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
"lower"
,
1
,
lcase
)
calibre_
db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
"lower"
,
1
,
lcase
)
entries
=
db
.
session
.
query
(
database
)
.
filter
(
tag_filter
)
.
\
entries
=
calibre_
db
.
session
.
query
(
database
)
.
filter
(
tag_filter
)
.
\
filter
(
func
.
lower
(
database
.
name
)
.
ilike
(
"
%
"
+
query
+
"
%
"
))
.
all
()
filter
(
func
.
lower
(
database
.
name
)
.
ilike
(
"
%
"
+
query
+
"
%
"
))
.
all
()
json_dumps
=
json
.
dumps
([
dict
(
name
=
r
.
name
.
replace
(
*
replace
))
for
r
in
entries
])
json_dumps
=
json
.
dumps
([
dict
(
name
=
r
.
name
.
replace
(
*
replace
))
for
r
in
entries
])
return
json_dumps
return
json_dumps
...
@@ -852,7 +852,7 @@ def get_typeahead(database, query, replace=('', ''), tag_filter=true()):
...
@@ -852,7 +852,7 @@ def get_typeahead(database, query, replace=('', ''), tag_filter=true()):
# read search results from calibre-database and return it (function is used for feed and simple search
# read search results from calibre-database and return it (function is used for feed and simple search
def
get_search_results
(
term
):
def
get_search_results
(
term
):
db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
"lower"
,
1
,
lcase
)
calibre_
db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
"lower"
,
1
,
lcase
)
q
=
list
()
q
=
list
()
authorterms
=
re
.
split
(
"[, ]+"
,
term
)
authorterms
=
re
.
split
(
"[, ]+"
,
term
)
for
authorterm
in
authorterms
:
for
authorterm
in
authorterms
:
...
@@ -860,7 +860,7 @@ def get_search_results(term):
...
@@ -860,7 +860,7 @@ def get_search_results(term):
db
.
Books
.
authors
.
any
(
func
.
lower
(
db
.
Authors
.
name
)
.
ilike
(
"
%
"
+
term
+
"
%
"
))
db
.
Books
.
authors
.
any
(
func
.
lower
(
db
.
Authors
.
name
)
.
ilike
(
"
%
"
+
term
+
"
%
"
))
return
db
.
session
.
query
(
db
.
Books
)
.
filter
(
common_filters
())
.
filter
(
return
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
common_filters
())
.
filter
(
or_
(
db
.
Books
.
tags
.
any
(
func
.
lower
(
db
.
Tags
.
name
)
.
ilike
(
"
%
"
+
term
+
"
%
"
)),
or_
(
db
.
Books
.
tags
.
any
(
func
.
lower
(
db
.
Tags
.
name
)
.
ilike
(
"
%
"
+
term
+
"
%
"
)),
db
.
Books
.
series
.
any
(
func
.
lower
(
db
.
Series
.
name
)
.
ilike
(
"
%
"
+
term
+
"
%
"
)),
db
.
Books
.
series
.
any
(
func
.
lower
(
db
.
Series
.
name
)
.
ilike
(
"
%
"
+
term
+
"
%
"
)),
db
.
Books
.
authors
.
any
(
and_
(
*
q
)),
db
.
Books
.
authors
.
any
(
and_
(
*
q
)),
...
@@ -870,7 +870,7 @@ def get_search_results(term):
...
@@ -870,7 +870,7 @@ def get_search_results(term):
def
get_cc_columns
(
filter_config_custom_read
=
False
):
def
get_cc_columns
(
filter_config_custom_read
=
False
):
tmpcc
=
db
.
session
.
query
(
db
.
Custom_Columns
)
.
filter
(
db
.
Custom_Columns
.
datatype
.
notin_
(
db
.
cc_exceptions
))
.
all
()
tmpcc
=
calibre_
db
.
session
.
query
(
db
.
Custom_Columns
)
.
filter
(
db
.
Custom_Columns
.
datatype
.
notin_
(
db
.
cc_exceptions
))
.
all
()
cc
=
[]
cc
=
[]
r
=
None
r
=
None
if
config
.
config_columns_to_ignore
:
if
config
.
config_columns_to_ignore
:
...
@@ -887,9 +887,9 @@ def get_cc_columns(filter_config_custom_read=False):
...
@@ -887,9 +887,9 @@ def get_cc_columns(filter_config_custom_read=False):
def
get_download_link
(
book_id
,
book_format
,
client
):
def
get_download_link
(
book_id
,
book_format
,
client
):
book_format
=
book_format
.
split
(
"."
)[
0
]
book_format
=
book_format
.
split
(
"."
)[
0
]
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
filter
(
common_filters
())
.
first
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_id
)
.
filter
(
common_filters
())
.
first
()
if
book
:
if
book
:
data1
=
db
.
session
.
query
(
db
.
Data
)
.
filter
(
db
.
Data
.
book
==
book
.
id
)
\
data1
=
calibre_
db
.
session
.
query
(
db
.
Data
)
.
filter
(
db
.
Data
.
book
==
book
.
id
)
\
.
filter
(
db
.
Data
.
format
==
book_format
.
upper
())
.
first
()
.
filter
(
db
.
Data
.
format
==
book_format
.
upper
())
.
first
()
else
:
else
:
abort
(
404
)
abort
(
404
)
...
@@ -911,13 +911,13 @@ def get_download_link(book_id, book_format, client):
...
@@ -911,13 +911,13 @@ def get_download_link(book_id, book_format, client):
def
check_exists_book
(
authr
,
title
):
def
check_exists_book
(
authr
,
title
):
db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
"lower"
,
1
,
lcase
)
calibre_
db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
"lower"
,
1
,
lcase
)
q
=
list
()
q
=
list
()
authorterms
=
re
.
split
(
r'\s*&\s*'
,
authr
)
authorterms
=
re
.
split
(
r'\s*&\s*'
,
authr
)
for
authorterm
in
authorterms
:
for
authorterm
in
authorterms
:
q
.
append
(
db
.
Books
.
authors
.
any
(
func
.
lower
(
db
.
Authors
.
name
)
.
ilike
(
"
%
"
+
authorterm
+
"
%
"
)))
q
.
append
(
db
.
Books
.
authors
.
any
(
func
.
lower
(
db
.
Authors
.
name
)
.
ilike
(
"
%
"
+
authorterm
+
"
%
"
)))
return
db
.
session
.
query
(
db
.
Books
)
.
filter
(
return
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
and_
(
db
.
Books
.
authors
.
any
(
and_
(
*
q
)),
and_
(
db
.
Books
.
authors
.
any
(
and_
(
*
q
)),
func
.
lower
(
db
.
Books
.
title
)
.
ilike
(
"
%
"
+
title
+
"
%
"
)
func
.
lower
(
db
.
Books
.
title
)
.
ilike
(
"
%
"
+
title
+
"
%
"
)
))
.
first
()
))
.
first
()
...
...
cps/kobo.py
View file @
1a458fe3
...
@@ -48,7 +48,7 @@ from sqlalchemy.sql.expression import and_, or_
...
@@ -48,7 +48,7 @@ from sqlalchemy.sql.expression import and_, or_
from
sqlalchemy.exc
import
StatementError
from
sqlalchemy.exc
import
StatementError
import
requests
import
requests
from
.
import
config
,
logger
,
kobo_auth
,
db
,
helper
,
shelf
as
shelf_lib
,
ub
from
.
import
config
,
logger
,
kobo_auth
,
db
,
calibre_db
,
helper
,
shelf
as
shelf_lib
,
ub
from
.services
import
SyncToken
as
SyncToken
from
.services
import
SyncToken
as
SyncToken
from
.web
import
download_required
from
.web
import
download_required
from
.kobo_auth
import
requires_kobo_auth
from
.kobo_auth
import
requires_kobo_auth
...
@@ -170,7 +170,7 @@ def HandleSyncRequest():
...
@@ -170,7 +170,7 @@ def HandleSyncRequest():
# It looks like it's treating the db.Books.last_modified field as a string and may fail
# It looks like it's treating the db.Books.last_modified field as a string and may fail
# the comparison because of the +00:00 suffix.
# the comparison because of the +00:00 suffix.
changed_entries
=
(
changed_entries
=
(
db
.
session
.
query
(
db
.
Books
)
calibre_
db
.
session
.
query
(
db
.
Books
)
.
join
(
db
.
Data
)
.
join
(
db
.
Data
)
.
filter
(
or_
(
func
.
datetime
(
db
.
Books
.
last_modified
)
>
sync_token
.
books_last_modified
,
.
filter
(
or_
(
func
.
datetime
(
db
.
Books
.
last_modified
)
>
sync_token
.
books_last_modified
,
db
.
Books
.
id
.
in_
(
recently_restored_or_archived_books
)))
db
.
Books
.
id
.
in_
(
recently_restored_or_archived_books
)))
...
@@ -207,7 +207,7 @@ def HandleSyncRequest():
...
@@ -207,7 +207,7 @@ def HandleSyncRequest():
ub
.
KoboReadingState
.
user_id
==
current_user
.
id
,
ub
.
KoboReadingState
.
user_id
==
current_user
.
id
,
ub
.
KoboReadingState
.
book_id
.
notin_
(
reading_states_in_new_entitlements
))))
ub
.
KoboReadingState
.
book_id
.
notin_
(
reading_states_in_new_entitlements
))))
for
kobo_reading_state
in
changed_reading_states
.
all
():
for
kobo_reading_state
in
changed_reading_states
.
all
():
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
kobo_reading_state
.
book_id
)
.
one_or_none
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
kobo_reading_state
.
book_id
)
.
one_or_none
()
if
book
:
if
book
:
sync_results
.
append
({
sync_results
.
append
({
"ChangedReadingState"
:
{
"ChangedReadingState"
:
{
...
@@ -256,7 +256,7 @@ def HandleMetadataRequest(book_uuid):
...
@@ -256,7 +256,7 @@ def HandleMetadataRequest(book_uuid):
if
not
current_app
.
wsgi_app
.
is_proxied
:
if
not
current_app
.
wsgi_app
.
is_proxied
:
log
.
debug
(
'Kobo: Received unproxied request, changed request port to server port'
)
log
.
debug
(
'Kobo: Received unproxied request, changed request port to server port'
)
log
.
info
(
"Kobo library metadata request received for book
%
s"
%
book_uuid
)
log
.
info
(
"Kobo library metadata request received for book
%
s"
%
book_uuid
)
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
book_uuid
)
.
first
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
book_uuid
)
.
first
()
if
not
book
or
not
book
.
data
:
if
not
book
or
not
book
.
data
:
log
.
info
(
u"Book
%
s not found in database"
,
book_uuid
)
log
.
info
(
u"Book
%
s not found in database"
,
book_uuid
)
return
redirect_or_proxy_request
()
return
redirect_or_proxy_request
()
...
@@ -474,7 +474,7 @@ def add_items_to_shelf(items, shelf):
...
@@ -474,7 +474,7 @@ def add_items_to_shelf(items, shelf):
items_unknown_to_calibre
.
append
(
item
)
items_unknown_to_calibre
.
append
(
item
)
continue
continue
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
item
[
"RevisionId"
])
.
one_or_none
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
item
[
"RevisionId"
])
.
one_or_none
()
if
not
book
:
if
not
book
:
items_unknown_to_calibre
.
append
(
item
)
items_unknown_to_calibre
.
append
(
item
)
continue
continue
...
@@ -545,7 +545,7 @@ def HandleTagRemoveItem(tag_id):
...
@@ -545,7 +545,7 @@ def HandleTagRemoveItem(tag_id):
items_unknown_to_calibre
.
append
(
item
)
items_unknown_to_calibre
.
append
(
item
)
continue
continue
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
item
[
"RevisionId"
])
.
one_or_none
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
item
[
"RevisionId"
])
.
one_or_none
()
if
not
book
:
if
not
book
:
items_unknown_to_calibre
.
append
(
item
)
items_unknown_to_calibre
.
append
(
item
)
continue
continue
...
@@ -613,7 +613,7 @@ def create_kobo_tag(shelf):
...
@@ -613,7 +613,7 @@ def create_kobo_tag(shelf):
"Type"
:
"UserTag"
"Type"
:
"UserTag"
}
}
for
book_shelf
in
shelf
.
books
:
for
book_shelf
in
shelf
.
books
:
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_shelf
.
book_id
)
.
one_or_none
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book_shelf
.
book_id
)
.
one_or_none
()
if
not
book
:
if
not
book
:
log
.
info
(
u"Book (id:
%
s) in BookShelf (id:
%
s) not found in book database"
,
book_shelf
.
book_id
,
shelf
.
id
)
log
.
info
(
u"Book (id:
%
s) in BookShelf (id:
%
s) not found in book database"
,
book_shelf
.
book_id
,
shelf
.
id
)
continue
continue
...
@@ -629,7 +629,7 @@ def create_kobo_tag(shelf):
...
@@ -629,7 +629,7 @@ def create_kobo_tag(shelf):
@
kobo
.
route
(
"/v1/library/<book_uuid>/state"
,
methods
=
[
"GET"
,
"PUT"
])
@
kobo
.
route
(
"/v1/library/<book_uuid>/state"
,
methods
=
[
"GET"
,
"PUT"
])
@
login_required
@
login_required
def
HandleStateRequest
(
book_uuid
):
def
HandleStateRequest
(
book_uuid
):
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
book_uuid
)
.
first
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
book_uuid
)
.
first
()
if
not
book
or
not
book
.
data
:
if
not
book
or
not
book
.
data
:
log
.
info
(
u"Book
%
s not found in database"
,
book_uuid
)
log
.
info
(
u"Book
%
s not found in database"
,
book_uuid
)
return
redirect_or_proxy_request
()
return
redirect_or_proxy_request
()
...
@@ -804,7 +804,7 @@ def TopLevelEndpoint():
...
@@ -804,7 +804,7 @@ def TopLevelEndpoint():
@
login_required
@
login_required
def
HandleBookDeletionRequest
(
book_uuid
):
def
HandleBookDeletionRequest
(
book_uuid
):
log
.
info
(
"Kobo book deletion request received for book
%
s"
%
book_uuid
)
log
.
info
(
"Kobo book deletion request received for book
%
s"
%
book_uuid
)
book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
book_uuid
)
.
first
()
book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
==
book_uuid
)
.
first
()
if
not
book
:
if
not
book
:
log
.
info
(
u"Book
%
s not found in database"
,
book_uuid
)
log
.
info
(
u"Book
%
s not found in database"
,
book_uuid
)
return
redirect_or_proxy_request
()
return
redirect_or_proxy_request
()
...
...
cps/opds.py
View file @
1a458fe3
...
@@ -30,7 +30,7 @@ from flask_login import current_user
...
@@ -30,7 +30,7 @@ from flask_login import current_user
from
sqlalchemy.sql.expression
import
func
,
text
,
or_
,
and_
from
sqlalchemy.sql.expression
import
func
,
text
,
or_
,
and_
from
werkzeug.security
import
check_password_hash
from
werkzeug.security
import
check_password_hash
from
.
import
constants
,
logger
,
config
,
db
,
ub
,
services
,
get_locale
,
isoLanguages
from
.
import
constants
,
logger
,
config
,
db
,
calibre_db
,
ub
,
services
,
get_locale
,
isoLanguages
from
.helper
import
fill_indexpage
,
get_download_link
,
get_book_cover
,
speaking_language
from
.helper
import
fill_indexpage
,
get_download_link
,
get_book_cover
,
speaking_language
from
.pagination
import
Pagination
from
.pagination
import
Pagination
from
.web
import
common_filters
,
get_search_results
,
render_read_books
,
download_required
from
.web
import
common_filters
,
get_search_results
,
render_read_books
,
download_required
...
@@ -108,7 +108,7 @@ def feed_new():
...
@@ -108,7 +108,7 @@ def feed_new():
@
opds
.
route
(
"/opds/discover"
)
@
opds
.
route
(
"/opds/discover"
)
@
requires_basic_auth_if_no_ano
@
requires_basic_auth_if_no_ano
def
feed_discover
():
def
feed_discover
():
entries
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
common_filters
())
.
order_by
(
func
.
random
())
\
entries
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
common_filters
())
.
order_by
(
func
.
random
())
\
.
limit
(
config
.
config_books_per_page
)
.
limit
(
config
.
config_books_per_page
)
pagination
=
Pagination
(
1
,
config
.
config_books_per_page
,
int
(
config
.
config_books_per_page
))
pagination
=
Pagination
(
1
,
config
.
config_books_per_page
,
int
(
config
.
config_books_per_page
))
return
render_xml_template
(
'feed.xml'
,
entries
=
entries
,
pagination
=
pagination
)
return
render_xml_template
(
'feed.xml'
,
entries
=
entries
,
pagination
=
pagination
)
...
@@ -133,10 +133,10 @@ def feed_hot():
...
@@ -133,10 +133,10 @@ def feed_hot():
hot_books
=
all_books
.
offset
(
off
)
.
limit
(
config
.
config_books_per_page
)
hot_books
=
all_books
.
offset
(
off
)
.
limit
(
config
.
config_books_per_page
)
entries
=
list
()
entries
=
list
()
for
book
in
hot_books
:
for
book
in
hot_books
:
downloadBook
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
Downloads
.
book_id
)
.
first
()
downloadBook
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
Downloads
.
book_id
)
.
first
()
if
downloadBook
:
if
downloadBook
:
entries
.
append
(
entries
.
append
(
db
.
session
.
query
(
db
.
Books
)
.
filter
(
common_filters
())
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
common_filters
())
.
filter
(
db
.
Books
.
id
==
book
.
Downloads
.
book_id
)
.
first
()
.
filter
(
db
.
Books
.
id
==
book
.
Downloads
.
book_id
)
.
first
()
)
)
else
:
else
:
...
@@ -153,11 +153,11 @@ def feed_hot():
...
@@ -153,11 +153,11 @@ def feed_hot():
@
requires_basic_auth_if_no_ano
@
requires_basic_auth_if_no_ano
def
feed_authorindex
():
def
feed_authorindex
():
off
=
request
.
args
.
get
(
"offset"
)
or
0
off
=
request
.
args
.
get
(
"offset"
)
or
0
entries
=
db
.
session
.
query
(
db
.
Authors
)
.
join
(
db
.
books_authors_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
entries
=
calibre_
db
.
session
.
query
(
db
.
Authors
)
.
join
(
db
.
books_authors_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
.
group_by
(
text
(
'books_authors_link.author'
))
.
order_by
(
db
.
Authors
.
sort
)
.
limit
(
config
.
config_books_per_page
)
\
.
group_by
(
text
(
'books_authors_link.author'
))
.
order_by
(
db
.
Authors
.
sort
)
.
limit
(
config
.
config_books_per_page
)
\
.
offset
(
off
)
.
offset
(
off
)
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
len
(
db
.
session
.
query
(
db
.
Authors
)
.
all
()))
len
(
calibre_
db
.
session
.
query
(
db
.
Authors
)
.
all
()))
return
render_xml_template
(
'feed.xml'
,
listelements
=
entries
,
folder
=
'opds.feed_author'
,
pagination
=
pagination
)
return
render_xml_template
(
'feed.xml'
,
listelements
=
entries
,
folder
=
'opds.feed_author'
,
pagination
=
pagination
)
...
@@ -176,11 +176,11 @@ def feed_author(book_id):
...
@@ -176,11 +176,11 @@ def feed_author(book_id):
@
requires_basic_auth_if_no_ano
@
requires_basic_auth_if_no_ano
def
feed_publisherindex
():
def
feed_publisherindex
():
off
=
request
.
args
.
get
(
"offset"
)
or
0
off
=
request
.
args
.
get
(
"offset"
)
or
0
entries
=
db
.
session
.
query
(
db
.
Publishers
)
.
join
(
db
.
books_publishers_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
entries
=
calibre_
db
.
session
.
query
(
db
.
Publishers
)
.
join
(
db
.
books_publishers_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
.
group_by
(
text
(
'books_publishers_link.publisher'
))
.
order_by
(
db
.
Publishers
.
sort
)
\
.
group_by
(
text
(
'books_publishers_link.publisher'
))
.
order_by
(
db
.
Publishers
.
sort
)
\
.
limit
(
config
.
config_books_per_page
)
.
offset
(
off
)
.
limit
(
config
.
config_books_per_page
)
.
offset
(
off
)
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
len
(
db
.
session
.
query
(
db
.
Publishers
)
.
all
()))
len
(
calibre_
db
.
session
.
query
(
db
.
Publishers
)
.
all
()))
return
render_xml_template
(
'feed.xml'
,
listelements
=
entries
,
folder
=
'opds.feed_publisher'
,
pagination
=
pagination
)
return
render_xml_template
(
'feed.xml'
,
listelements
=
entries
,
folder
=
'opds.feed_publisher'
,
pagination
=
pagination
)
...
@@ -199,10 +199,10 @@ def feed_publisher(book_id):
...
@@ -199,10 +199,10 @@ def feed_publisher(book_id):
@
requires_basic_auth_if_no_ano
@
requires_basic_auth_if_no_ano
def
feed_categoryindex
():
def
feed_categoryindex
():
off
=
request
.
args
.
get
(
"offset"
)
or
0
off
=
request
.
args
.
get
(
"offset"
)
or
0
entries
=
db
.
session
.
query
(
db
.
Tags
)
.
join
(
db
.
books_tags_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
entries
=
calibre_
db
.
session
.
query
(
db
.
Tags
)
.
join
(
db
.
books_tags_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
.
group_by
(
text
(
'books_tags_link.tag'
))
.
order_by
(
db
.
Tags
.
name
)
.
offset
(
off
)
.
limit
(
config
.
config_books_per_page
)
.
group_by
(
text
(
'books_tags_link.tag'
))
.
order_by
(
db
.
Tags
.
name
)
.
offset
(
off
)
.
limit
(
config
.
config_books_per_page
)
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
len
(
db
.
session
.
query
(
db
.
Tags
)
.
all
()))
len
(
calibre_
db
.
session
.
query
(
db
.
Tags
)
.
all
()))
return
render_xml_template
(
'feed.xml'
,
listelements
=
entries
,
folder
=
'opds.feed_category'
,
pagination
=
pagination
)
return
render_xml_template
(
'feed.xml'
,
listelements
=
entries
,
folder
=
'opds.feed_category'
,
pagination
=
pagination
)
...
@@ -221,10 +221,10 @@ def feed_category(book_id):
...
@@ -221,10 +221,10 @@ def feed_category(book_id):
@
requires_basic_auth_if_no_ano
@
requires_basic_auth_if_no_ano
def
feed_seriesindex
():
def
feed_seriesindex
():
off
=
request
.
args
.
get
(
"offset"
)
or
0
off
=
request
.
args
.
get
(
"offset"
)
or
0
entries
=
db
.
session
.
query
(
db
.
Series
)
.
join
(
db
.
books_series_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
entries
=
calibre_
db
.
session
.
query
(
db
.
Series
)
.
join
(
db
.
books_series_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
.
group_by
(
text
(
'books_series_link.series'
))
.
order_by
(
db
.
Series
.
sort
)
.
offset
(
off
)
.
all
()
.
group_by
(
text
(
'books_series_link.series'
))
.
order_by
(
db
.
Series
.
sort
)
.
offset
(
off
)
.
all
()
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
len
(
db
.
session
.
query
(
db
.
Series
)
.
all
()))
len
(
calibre_
db
.
session
.
query
(
db
.
Series
)
.
all
()))
return
render_xml_template
(
'feed.xml'
,
listelements
=
entries
,
folder
=
'opds.feed_series'
,
pagination
=
pagination
)
return
render_xml_template
(
'feed.xml'
,
listelements
=
entries
,
folder
=
'opds.feed_series'
,
pagination
=
pagination
)
...
@@ -243,7 +243,7 @@ def feed_series(book_id):
...
@@ -243,7 +243,7 @@ def feed_series(book_id):
@
requires_basic_auth_if_no_ano
@
requires_basic_auth_if_no_ano
def
feed_ratingindex
():
def
feed_ratingindex
():
off
=
request
.
args
.
get
(
"offset"
)
or
0
off
=
request
.
args
.
get
(
"offset"
)
or
0
entries
=
db
.
session
.
query
(
db
.
Ratings
,
func
.
count
(
'books_ratings_link.book'
)
.
label
(
'count'
),
entries
=
calibre_
db
.
session
.
query
(
db
.
Ratings
,
func
.
count
(
'books_ratings_link.book'
)
.
label
(
'count'
),
(
db
.
Ratings
.
rating
/
2
)
.
label
(
'name'
))
\
(
db
.
Ratings
.
rating
/
2
)
.
label
(
'name'
))
\
.
join
(
db
.
books_ratings_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
.
join
(
db
.
books_ratings_link
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
.
group_by
(
text
(
'books_ratings_link.rating'
))
.
order_by
(
db
.
Ratings
.
rating
)
.
all
()
.
group_by
(
text
(
'books_ratings_link.rating'
))
.
order_by
(
db
.
Ratings
.
rating
)
.
all
()
...
@@ -271,7 +271,7 @@ def feed_ratings(book_id):
...
@@ -271,7 +271,7 @@ def feed_ratings(book_id):
@
requires_basic_auth_if_no_ano
@
requires_basic_auth_if_no_ano
def
feed_formatindex
():
def
feed_formatindex
():
off
=
request
.
args
.
get
(
"offset"
)
or
0
off
=
request
.
args
.
get
(
"offset"
)
or
0
entries
=
db
.
session
.
query
(
db
.
Data
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
entries
=
calibre_
db
.
session
.
query
(
db
.
Data
)
.
join
(
db
.
Books
)
.
filter
(
common_filters
())
\
.
group_by
(
db
.
Data
.
format
)
.
order_by
(
db
.
Data
.
format
)
.
all
()
.
group_by
(
db
.
Data
.
format
)
.
order_by
(
db
.
Data
.
format
)
.
all
()
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
len
(
entries
))
len
(
entries
))
...
@@ -305,7 +305,7 @@ def feed_languagesindex():
...
@@ -305,7 +305,7 @@ def feed_languagesindex():
cur_l
=
LC
.
parse
(
current_user
.
filter_language
())
cur_l
=
LC
.
parse
(
current_user
.
filter_language
())
except
UnknownLocaleError
:
except
UnknownLocaleError
:
cur_l
=
None
cur_l
=
None
languages
=
db
.
session
.
query
(
db
.
Languages
)
.
filter
(
languages
=
calibre_
db
.
session
.
query
(
db
.
Languages
)
.
filter
(
db
.
Languages
.
lang_code
==
current_user
.
filter_language
())
.
all
()
db
.
Languages
.
lang_code
==
current_user
.
filter_language
())
.
all
()
if
cur_l
:
if
cur_l
:
languages
[
0
]
.
name
=
cur_l
.
get_language_name
(
get_locale
())
languages
[
0
]
.
name
=
cur_l
.
get_language_name
(
get_locale
())
...
@@ -356,7 +356,7 @@ def feed_shelf(book_id):
...
@@ -356,7 +356,7 @@ def feed_shelf(book_id):
books_in_shelf
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
book_id
)
.
order_by
(
books_in_shelf
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
book_id
)
.
order_by
(
ub
.
BookShelf
.
order
.
asc
())
.
all
()
ub
.
BookShelf
.
order
.
asc
())
.
all
()
for
book
in
books_in_shelf
:
for
book
in
books_in_shelf
:
cur_book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
first
()
cur_book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
first
()
result
.
append
(
cur_book
)
result
.
append
(
cur_book
)
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
pagination
=
Pagination
((
int
(
off
)
/
(
int
(
config
.
config_books_per_page
))
+
1
),
config
.
config_books_per_page
,
len
(
result
))
len
(
result
))
...
@@ -378,7 +378,7 @@ def opds_download_link(book_id, book_format):
...
@@ -378,7 +378,7 @@ def opds_download_link(book_id, book_format):
@
opds
.
route
(
"/ajax/book/<string:uuid>"
,
defaults
=
{
'library'
:
""
})
@
opds
.
route
(
"/ajax/book/<string:uuid>"
,
defaults
=
{
'library'
:
""
})
@
requires_basic_auth_if_no_ano
@
requires_basic_auth_if_no_ano
def
get_metadata_calibre_companion
(
uuid
,
library
):
def
get_metadata_calibre_companion
(
uuid
,
library
):
entry
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
.
like
(
"
%
"
+
uuid
+
"
%
"
))
.
first
()
entry
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
uuid
.
like
(
"
%
"
+
uuid
+
"
%
"
))
.
first
()
if
entry
is
not
None
:
if
entry
is
not
None
:
js
=
render_template
(
'json.txt'
,
entry
=
entry
)
js
=
render_template
(
'json.txt'
,
entry
=
entry
)
response
=
make_response
(
js
)
response
=
make_response
(
js
)
...
...
cps/server.py
View file @
1a458fe3
...
@@ -196,6 +196,9 @@ class WebServer(object):
...
@@ -196,6 +196,9 @@ class WebServer(object):
def
stop
(
self
,
restart
=
False
):
def
stop
(
self
,
restart
=
False
):
from
.
import
updater_thread
from
.
import
updater_thread
updater_thread
.
stop
()
updater_thread
.
stop
()
from
.
import
calibre_db
calibre_db
.
stop
()
log
.
info
(
"webserver stop (restart=
%
s)"
,
restart
)
log
.
info
(
"webserver stop (restart=
%
s)"
,
restart
)
self
.
restart
=
restart
self
.
restart
=
restart
...
...
cps/shelf.py
View file @
1a458fe3
...
@@ -28,7 +28,7 @@ from flask_babel import gettext as _
...
@@ -28,7 +28,7 @@ from flask_babel import gettext as _
from
flask_login
import
login_required
,
current_user
from
flask_login
import
login_required
,
current_user
from
sqlalchemy.sql.expression
import
func
from
sqlalchemy.sql.expression
import
func
from
.
import
logger
,
ub
,
searched_ids
,
db
from
.
import
logger
,
ub
,
searched_ids
,
db
,
calibre_db
from
.web
import
render_title_template
from
.web
import
render_title_template
from
.helper
import
common_filters
from
.helper
import
common_filters
...
@@ -320,11 +320,11 @@ def show_shelf(shelf_type, shelf_id):
...
@@ -320,11 +320,11 @@ def show_shelf(shelf_type, shelf_id):
books_in_shelf
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
\
books_in_shelf
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
\
.
order_by
(
ub
.
BookShelf
.
order
.
asc
())
.
all
()
.
order_by
(
ub
.
BookShelf
.
order
.
asc
())
.
all
()
for
book
in
books_in_shelf
:
for
book
in
books_in_shelf
:
cur_book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
filter
(
common_filters
())
.
first
()
cur_book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
filter
(
common_filters
())
.
first
()
if
cur_book
:
if
cur_book
:
result
.
append
(
cur_book
)
result
.
append
(
cur_book
)
else
:
else
:
cur_book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
first
()
cur_book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
first
()
if
not
cur_book
:
if
not
cur_book
:
log
.
info
(
'Not existing book
%
s in
%
s deleted'
,
book
.
book_id
,
shelf
)
log
.
info
(
'Not existing book
%
s in
%
s deleted'
,
book
.
book_id
,
shelf
)
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
book_id
==
book
.
book_id
)
.
delete
()
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
book_id
==
book
.
book_id
)
.
delete
()
...
@@ -356,7 +356,7 @@ def order_shelf(shelf_id):
...
@@ -356,7 +356,7 @@ def order_shelf(shelf_id):
books_in_shelf2
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
\
books_in_shelf2
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
\
.
order_by
(
ub
.
BookShelf
.
order
.
asc
())
.
all
()
.
order_by
(
ub
.
BookShelf
.
order
.
asc
())
.
all
()
for
book
in
books_in_shelf2
:
for
book
in
books_in_shelf2
:
cur_book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
filter
(
common_filters
())
.
first
()
cur_book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
filter
(
common_filters
())
.
first
()
if
cur_book
:
if
cur_book
:
result
.
append
({
'title'
:
cur_book
.
title
,
result
.
append
({
'title'
:
cur_book
.
title
,
'id'
:
cur_book
.
id
,
'id'
:
cur_book
.
id
,
...
@@ -364,7 +364,7 @@ def order_shelf(shelf_id):
...
@@ -364,7 +364,7 @@ def order_shelf(shelf_id):
'series'
:
cur_book
.
series
,
'series'
:
cur_book
.
series
,
'series_index'
:
cur_book
.
series_index
})
'series_index'
:
cur_book
.
series_index
})
else
:
else
:
cur_book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
first
()
cur_book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
book
.
book_id
)
.
first
()
result
.
append
({
'title'
:
_
(
'Hidden Book'
),
result
.
append
({
'title'
:
_
(
'Hidden Book'
),
'id'
:
cur_book
.
id
,
'id'
:
cur_book
.
id
,
'author'
:
[],
'author'
:
[],
...
...
cps/web.py
View file @
1a458fe3
This diff is collapsed.
Click to expand it.
cps/worker.py
View file @
1a458fe3
...
@@ -24,10 +24,10 @@ import smtplib
...
@@ -24,10 +24,10 @@ import smtplib
import
socket
import
socket
import
time
import
time
import
threading
import
threading
import
queue
from
glob
import
glob
from
glob
import
glob
from
shutil
import
copyfile
from
shutil
import
copyfile
from
datetime
import
datetime
from
datetime
import
datetime
from
sqlalchemy.exc
import
OperationalError
try
:
try
:
from
StringIO
import
StringIO
from
StringIO
import
StringIO
...
@@ -46,7 +46,8 @@ from email.utils import make_msgid
...
@@ -46,7 +46,8 @@ from email.utils import make_msgid
from
email.generator
import
Generator
from
email.generator
import
Generator
from
flask_babel
import
gettext
as
_
from
flask_babel
import
gettext
as
_
from
.
import
db
,
logger
,
config
from
.
import
calibre_db
,
db
from
.
import
logger
,
config
from
.subproc_wrapper
import
process_open
from
.subproc_wrapper
import
process_open
from
.
import
gdriveutils
from
.
import
gdriveutils
...
@@ -190,6 +191,8 @@ class WorkerThread(threading.Thread):
...
@@ -190,6 +191,8 @@ class WorkerThread(threading.Thread):
self
.
UIqueue
=
list
()
self
.
UIqueue
=
list
()
self
.
asyncSMTP
=
None
self
.
asyncSMTP
=
None
self
.
id
=
0
self
.
id
=
0
self
.
db_queue
=
queue
.
Queue
()
calibre_db
.
add_queue
(
self
.
db_queue
)
self
.
doLock
=
threading
.
Lock
()
self
.
doLock
=
threading
.
Lock
()
# Main thread loop starting the different tasks
# Main thread loop starting the different tasks
...
@@ -275,6 +278,18 @@ class WorkerThread(threading.Thread):
...
@@ -275,6 +278,18 @@ class WorkerThread(threading.Thread):
self
.
doLock
.
acquire
()
self
.
doLock
.
acquire
()
index
=
self
.
current
index
=
self
.
current
self
.
doLock
.
release
()
self
.
doLock
.
release
()
'''dbpath = os.path.join(config.config_calibre_dir, "metadata.db")
engine = create_engine('sqlite://',
echo=False,
isolation_level="SERIALIZABLE",
connect_args={'check_same_thread': True})
engine.execute("attach database '{}' as calibre;".format(dbpath))
conn = engine.connect()
Session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
w_session = Session()
engine.execute("attach database '{}' as calibre;".format(dbpath))'''
file_path
=
self
.
queue
[
index
][
'file_path'
]
file_path
=
self
.
queue
[
index
][
'file_path'
]
bookid
=
self
.
queue
[
index
][
'bookid'
]
bookid
=
self
.
queue
[
index
][
'bookid'
]
format_old_ext
=
u'.'
+
self
.
queue
[
index
][
'settings'
][
'old_book_format'
]
.
lower
()
format_old_ext
=
u'.'
+
self
.
queue
[
index
][
'settings'
][
'old_book_format'
]
.
lower
()
...
@@ -285,7 +300,7 @@ class WorkerThread(threading.Thread):
...
@@ -285,7 +300,7 @@ class WorkerThread(threading.Thread):
# this will allow send to kindle workflow to continue to work
# this will allow send to kindle workflow to continue to work
if
os
.
path
.
isfile
(
file_path
+
format_new_ext
):
if
os
.
path
.
isfile
(
file_path
+
format_new_ext
):
log
.
info
(
"Book id
%
d already converted to
%
s"
,
bookid
,
format_new_ext
)
log
.
info
(
"Book id
%
d already converted to
%
s"
,
bookid
,
format_new_ext
)
cur_book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
bookid
)
.
first
()
cur_book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
bookid
)
.
first
()
self
.
queue
[
index
][
'path'
]
=
file_path
self
.
queue
[
index
][
'path'
]
=
file_path
self
.
queue
[
index
][
'title'
]
=
cur_book
.
title
self
.
queue
[
index
][
'title'
]
=
cur_book
.
title
self
.
_handleSuccess
()
self
.
_handleSuccess
()
...
@@ -309,19 +324,26 @@ class WorkerThread(threading.Thread):
...
@@ -309,19 +324,26 @@ class WorkerThread(threading.Thread):
check
,
error_message
=
self
.
_convert_calibre
(
file_path
,
format_old_ext
,
format_new_ext
,
index
)
check
,
error_message
=
self
.
_convert_calibre
(
file_path
,
format_old_ext
,
format_new_ext
,
index
)
if
check
==
0
:
if
check
==
0
:
cur_book
=
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
bookid
)
.
first
()
cur_book
=
calibre_
db
.
session
.
query
(
db
.
Books
)
.
filter
(
db
.
Books
.
id
==
bookid
)
.
first
()
if
os
.
path
.
isfile
(
file_path
+
format_new_ext
):
if
os
.
path
.
isfile
(
file_path
+
format_new_ext
):
# self.db_queue.join()
new_format
=
db
.
Data
(
name
=
cur_book
.
data
[
0
]
.
name
,
new_format
=
db
.
Data
(
name
=
cur_book
.
data
[
0
]
.
name
,
book_format
=
self
.
queue
[
index
][
'settings'
][
'new_book_format'
]
.
upper
(),
book_format
=
self
.
queue
[
index
][
'settings'
][
'new_book_format'
]
.
upper
(),
book
=
bookid
,
uncompressed_size
=
os
.
path
.
getsize
(
file_path
+
format_new_ext
))
book
=
bookid
,
uncompressed_size
=
os
.
path
.
getsize
(
file_path
+
format_new_ext
))
cur_book
.
data
.
append
(
new_format
)
task
=
{
'task'
:
'add_format'
,
'id'
:
bookid
,
'format'
:
new_format
}
self
.
db_queue
.
put
(
task
)
# To Do how to handle error?
print
(
'finished'
)
'''cur_book.data.append(new_format)
try:
try:
db
.
session
.
commit
()
# db.session.merge(cur_book)
calibre_db.session.commit()
except OperationalError as e:
except OperationalError as e:
db
.
session
.
rollback
()
calibre_
db.session.rollback()
log.error("Database error:
%
s", e)
log.error("Database error:
%
s", e)
self._handleError(_(u"Database error:
%(error)
s.", error=e))
self._handleError(_(u"Database error:
%(error)
s.", error=e))
return
return
'''
self
.
queue
[
index
][
'path'
]
=
cur_book
.
path
self
.
queue
[
index
][
'path'
]
=
cur_book
.
path
self
.
queue
[
index
][
'title'
]
=
cur_book
.
title
self
.
queue
[
index
][
'title'
]
=
cur_book
.
title
...
@@ -375,6 +397,7 @@ class WorkerThread(threading.Thread):
...
@@ -375,6 +397,7 @@ class WorkerThread(threading.Thread):
# process returncode
# process returncode
check
=
p
.
returncode
check
=
p
.
returncode
calibre_traceback
=
p
.
stderr
.
readlines
()
calibre_traceback
=
p
.
stderr
.
readlines
()
error_message
=
""
for
ele
in
calibre_traceback
:
for
ele
in
calibre_traceback
:
if
sys
.
version_info
<
(
3
,
0
):
if
sys
.
version_info
<
(
3
,
0
):
ele
=
ele
.
decode
(
'utf-8'
)
ele
=
ele
.
decode
(
'utf-8'
)
...
...
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