You've already forked calibre-web
							
							
				mirror of
				https://github.com/janeczku/calibre-web.git
				synced 2025-10-30 23:57:40 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			197 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| #   This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
 | |
| #     Copyright (C) 2019 OzzieIsaacs, pwr
 | |
| #
 | |
| #   This program is free software: you can redistribute it and/or modify
 | |
| #   it under the terms of the GNU General Public License as published by
 | |
| #   the Free Software Foundation, either version 3 of the License, or
 | |
| #   (at your option) any later version.
 | |
| #
 | |
| #   This program is distributed in the hope that it will be useful,
 | |
| #   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| #   GNU General Public License for more details.
 | |
| #
 | |
| #   You should have received a copy of the GNU General Public License
 | |
| #   along with this program. If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| import sys
 | |
| import os
 | |
| from collections import namedtuple
 | |
| 
 | |
| # APP_MODE - production, development, or test
 | |
| APP_MODE             = os.environ.get('APP_MODE', 'production')
 | |
| 
 | |
| # if installed via pip this variable is set to true (empty file with name .HOMEDIR present)
 | |
| HOME_CONFIG = os.path.isfile(os.path.join(os.path.dirname(os.path.abspath(__file__)), '.HOMEDIR'))
 | |
| 
 | |
| # In executables updater is not available, so variable is set to False there
 | |
| UPDATER_AVAILABLE = True
 | |
| 
 | |
| # Base dir is parent of current file, necessary if called from different folder
 | |
| BASE_DIR            = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir))
 | |
| # if executable file the files should be placed in the parent dir (parallel to the exe file)
 | |
| 
 | |
| STATIC_DIR          = os.path.join(BASE_DIR, 'cps', 'static')
 | |
| TEMPLATES_DIR       = os.path.join(BASE_DIR, 'cps', 'templates')
 | |
| TRANSLATIONS_DIR    = os.path.join(BASE_DIR, 'cps', 'translations')
 | |
| 
 | |
| # Cache dir - use CACHE_DIR environment variable, otherwise use the default directory: cps/cache
 | |
| DEFAULT_CACHE_DIR   = os.path.join(BASE_DIR, 'cps', 'cache')
 | |
| CACHE_DIR           = os.environ.get('CACHE_DIR', DEFAULT_CACHE_DIR)
 | |
| 
 | |
| if HOME_CONFIG:
 | |
|     home_dir = os.path.join(os.path.expanduser("~"), ".calibre-web")
 | |
|     if not os.path.exists(home_dir):
 | |
|         os.makedirs(home_dir)
 | |
|     CONFIG_DIR = os.environ.get('CALIBRE_DBPATH', home_dir)
 | |
| else:
 | |
|     CONFIG_DIR = os.environ.get('CALIBRE_DBPATH', BASE_DIR)
 | |
|     if getattr(sys, 'frozen', False):
 | |
|         CONFIG_DIR = os.path.abspath(os.path.join(CONFIG_DIR, os.pardir))
 | |
| 
 | |
| 
 | |
| DEFAULT_SETTINGS_FILE = "app.db"
 | |
| DEFAULT_GDRIVE_FILE = "gdrive.db"
 | |
| 
 | |
| ROLE_USER               = 0 << 0
 | |
| ROLE_ADMIN              = 1 << 0
 | |
| ROLE_DOWNLOAD           = 1 << 1
 | |
| ROLE_UPLOAD             = 1 << 2
 | |
| ROLE_EDIT               = 1 << 3
 | |
| ROLE_PASSWD             = 1 << 4
 | |
| ROLE_ANONYMOUS          = 1 << 5
 | |
| ROLE_EDIT_SHELFS        = 1 << 6
 | |
| ROLE_DELETE_BOOKS       = 1 << 7
 | |
| ROLE_VIEWER             = 1 << 8
 | |
| 
 | |
| ALL_ROLES = {
 | |
|                 "admin_role": ROLE_ADMIN,
 | |
|                 "download_role": ROLE_DOWNLOAD,
 | |
|                 "upload_role": ROLE_UPLOAD,
 | |
|                 "edit_role": ROLE_EDIT,
 | |
|                 "passwd_role": ROLE_PASSWD,
 | |
|                 "edit_shelf_role": ROLE_EDIT_SHELFS,
 | |
|                 "delete_role": ROLE_DELETE_BOOKS,
 | |
|                 "viewer_role": ROLE_VIEWER,
 | |
|             }
 | |
| 
 | |
| DETAIL_RANDOM           = 1 <<  0
 | |
| SIDEBAR_LANGUAGE        = 1 <<  1
 | |
| SIDEBAR_SERIES          = 1 <<  2
 | |
| SIDEBAR_CATEGORY        = 1 <<  3
 | |
| SIDEBAR_HOT             = 1 <<  4
 | |
| SIDEBAR_RANDOM          = 1 <<  5
 | |
| SIDEBAR_AUTHOR          = 1 <<  6
 | |
| SIDEBAR_BEST_RATED      = 1 <<  7
 | |
| SIDEBAR_READ_AND_UNREAD = 1 <<  8
 | |
| SIDEBAR_RECENT          = 1 <<  9
 | |
| SIDEBAR_SORTED          = 1 << 10
 | |
| MATURE_CONTENT          = 1 << 11
 | |
| SIDEBAR_PUBLISHER       = 1 << 12
 | |
| SIDEBAR_RATING          = 1 << 13
 | |
| SIDEBAR_FORMAT          = 1 << 14
 | |
| SIDEBAR_ARCHIVED        = 1 << 15
 | |
| SIDEBAR_DOWNLOAD        = 1 << 16
 | |
| SIDEBAR_LIST            = 1 << 17
 | |
| 
 | |
| sidebar_settings = {
 | |
|                 "detail_random": DETAIL_RANDOM,
 | |
|                 "sidebar_language": SIDEBAR_LANGUAGE,
 | |
|                 "sidebar_series": SIDEBAR_SERIES,
 | |
|                 "sidebar_category": SIDEBAR_CATEGORY,
 | |
|                 "sidebar_random": SIDEBAR_RANDOM,
 | |
|                 "sidebar_author": SIDEBAR_AUTHOR,
 | |
|                 "sidebar_best_rated": SIDEBAR_BEST_RATED,
 | |
|                 "sidebar_read_and_unread": SIDEBAR_READ_AND_UNREAD,
 | |
|                 "sidebar_recent": SIDEBAR_RECENT,
 | |
|                 "sidebar_sorted": SIDEBAR_SORTED,
 | |
|                 "sidebar_publisher": SIDEBAR_PUBLISHER,
 | |
|                 "sidebar_rating": SIDEBAR_RATING,
 | |
|                 "sidebar_format": SIDEBAR_FORMAT,
 | |
|                 "sidebar_archived": SIDEBAR_ARCHIVED,
 | |
|                 "sidebar_download": SIDEBAR_DOWNLOAD,
 | |
|                 "sidebar_list": SIDEBAR_LIST,
 | |
|             }
 | |
| 
 | |
| 
 | |
| ADMIN_USER_ROLES        = sum(r for r in ALL_ROLES.values()) & ~ROLE_ANONYMOUS
 | |
| ADMIN_USER_SIDEBAR      = (SIDEBAR_LIST << 1) - 1
 | |
| 
 | |
| UPDATE_STABLE       = 0 << 0
 | |
| AUTO_UPDATE_STABLE  = 1 << 0
 | |
| UPDATE_NIGHTLY      = 1 << 1
 | |
| AUTO_UPDATE_NIGHTLY = 1 << 2
 | |
| 
 | |
| LOGIN_STANDARD      = 0
 | |
| LOGIN_LDAP          = 1
 | |
| LOGIN_OAUTH         = 2
 | |
| 
 | |
| LDAP_AUTH_ANONYMOUS      = 0
 | |
| LDAP_AUTH_UNAUTHENTICATE = 1
 | |
| LDAP_AUTH_SIMPLE         = 0
 | |
| 
 | |
| DEFAULT_MAIL_SERVER = "mail.example.org"
 | |
| 
 | |
| DEFAULT_PASSWORD    = "admin123"  # nosec
 | |
| DEFAULT_PORT        = 8083
 | |
| env_CALIBRE_PORT = os.environ.get("CALIBRE_PORT", DEFAULT_PORT)
 | |
| try:
 | |
|     DEFAULT_PORT = int(env_CALIBRE_PORT)
 | |
| except ValueError:
 | |
|     print('Environment variable CALIBRE_PORT has invalid value (%s), faling back to default (8083)' % env_CALIBRE_PORT)
 | |
| del env_CALIBRE_PORT
 | |
| 
 | |
| 
 | |
| EXTENSIONS_AUDIO = {'mp3', 'mp4', 'ogg', 'opus', 'wav', 'flac', 'm4a', 'm4b'}
 | |
| EXTENSIONS_CONVERT_FROM = ['pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf',
 | |
|                            'txt', 'htmlz', 'rtf', 'odt', 'cbz', 'cbr', 'prc']
 | |
| EXTENSIONS_CONVERT_TO = ['pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2',
 | |
|                          'lit', 'lrf', 'txt', 'htmlz', 'rtf', 'odt']
 | |
| EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'kepub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'cb7', 'djvu', 'djv',
 | |
|                      'prc', 'doc', 'docx', 'fb2', 'html', 'rtf', 'lit', 'odt', 'mp3', 'mp4', 'ogg',
 | |
|                      'opus', 'wav', 'flac', 'm4a', 'm4b'}
 | |
| 
 | |
| _extension = ""
 | |
| if sys.platform == "win32":
 | |
|     _extension = ".exe"
 | |
| SUPPORTED_CALIBRE_BINARIES = {binary: binary + _extension for binary in ["ebook-convert", "calibredb"]}
 | |
| 
 | |
| 
 | |
| def has_flag(value, bit_flag):
 | |
|     return bit_flag == (bit_flag & (value or 0))
 | |
| 
 | |
| 
 | |
| def selected_roles(dictionary):
 | |
|     return sum(v for k, v in ALL_ROLES.items() if k in dictionary)
 | |
| 
 | |
| 
 | |
| # :rtype: BookMeta
 | |
| BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, description, tags, series, '
 | |
|                                   'series_id, languages, publisher, pubdate, identifiers')
 | |
| 
 | |
| # python build process likes to have x.y.zbw -> b for beta and w a counting number
 | |
| STABLE_VERSION =  '0.6.26b'
 | |
| 
 | |
| NIGHTLY_VERSION = dict()
 | |
| NIGHTLY_VERSION[0] = '$Format:%H$'
 | |
| NIGHTLY_VERSION[1] = '$Format:%cI$'
 | |
| 
 | |
| # CACHE
 | |
| CACHE_TYPE_THUMBNAILS    = 'thumbnails'
 | |
| 
 | |
| # Thumbnail Types
 | |
| THUMBNAIL_TYPE_COVER     = 1
 | |
| THUMBNAIL_TYPE_SERIES    = 2
 | |
| THUMBNAIL_TYPE_AUTHOR    = 3
 | |
| 
 | |
| # Thumbnails Sizes
 | |
| COVER_THUMBNAIL_ORIGINAL = 0
 | |
| COVER_THUMBNAIL_SMALL    = 1
 | |
| COVER_THUMBNAIL_MEDIUM   = 2
 | |
| COVER_THUMBNAIL_LARGE    = 4
 | |
| 
 | |
| # clean-up the module namespace
 | |
| del sys, os, namedtuple
 |