mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-10-30 23:03:02 +00:00 
			
		
		
		
	Merge branch 'master' into cover_thumbnail
This commit is contained in:
		| @@ -43,7 +43,7 @@ Calibre-Web is a web app providing a clean interface for browsing, reading and d | ||||
| 1. To avoid problems with already installed python dependencies, it's recommended to create a virtual environment for Calibre-Web | ||||
| 2. Install Calibre-Web via pip with the command `pip install calibreweb` (Depending on your OS and or distro the command could also be `pip3`).  | ||||
| 3. Optional features can also be installed via pip, please refer to [this page](https://github.com/janeczku/calibre-web/wiki/Dependencies-in-Calibre-Web-Linux-Windows) for details  | ||||
| 4. Calibre-Web can be started afterwards by typing `cps` or `python3 -m cps`  | ||||
| 4. Calibre-Web can be started afterwards by typing `cps`  | ||||
|  | ||||
| In the Wiki there are also examples for a [manual installation](https://github.com/janeczku/calibre-web/wiki/Manual-installation) and for installation on [Linux Mint](https://github.com/janeczku/calibre-web/wiki/How-To:Install-Calibre-Web-in-Linux-Mint-19-or-20) | ||||
|  | ||||
|   | ||||
| @@ -25,7 +25,7 @@ from google.oauth2.credentials import Credentials | ||||
| from datetime import datetime | ||||
| import base64 | ||||
| from flask_babel import gettext as _ | ||||
| from ..constants import BASE_DIR | ||||
| from ..constants import CONFIG_DIR | ||||
| from .. import logger | ||||
|  | ||||
|  | ||||
| @@ -53,11 +53,11 @@ def setup_gmail(token): | ||||
|         if creds and creds.expired and creds.refresh_token: | ||||
|             creds.refresh(Request()) | ||||
|         else: | ||||
|             cred_file = os.path.join(BASE_DIR, 'gmail.json') | ||||
|             cred_file = os.path.join(CONFIG_DIR, 'gmail.json') | ||||
|             if not os.path.exists(cred_file): | ||||
|                 raise Exception(_("Found no valid gmail.json file with OAuth information")) | ||||
|             flow = InstalledAppFlow.from_client_secrets_file( | ||||
|                 os.path.join(BASE_DIR, 'gmail.json'), SCOPES) | ||||
|                 os.path.join(CONFIG_DIR, 'gmail.json'), SCOPES) | ||||
|             creds = flow.run_local_server(port=0) | ||||
|             user_info = get_user_info(creds) | ||||
|         return { | ||||
|   | ||||
| @@ -52,7 +52,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span class="author-hidden-divider">&</span> | ||||
| 			  {% endif %} | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               {% if loop.last %} | ||||
|                 <a href="#" class="author-expand" data-authors-max="{{g.config_authors_max}}" data-collapse-caption="({{_('reduce')}})">(...)</a> | ||||
|               {% endif %} | ||||
| @@ -60,7 +60,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span>&</span> | ||||
|               {% endif %} | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|             {% endif %} | ||||
|           {% endfor %} | ||||
|           {% for format in entry.data %} | ||||
| @@ -71,7 +71,7 @@ | ||||
|         </p> | ||||
|         {% if entry.series.__len__() > 0 %} | ||||
|         <p class="series"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='new', book_id=entry.series[0].id )}}"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id )}}"> | ||||
|             {{entry.series[0].name}} | ||||
|           </a> | ||||
|           ({{entry.series_index|formatseriesindex}}) | ||||
| @@ -123,7 +123,7 @@ | ||||
|         </p> | ||||
|         {% if entry.series.__len__() > 0 %} | ||||
|         <p class="series"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='new', book_id=entry.series[0].id )}}"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id )}}"> | ||||
|             {{entry.series[0].name}} | ||||
|           </a> | ||||
|           ({{entry.series_index|formatseriesindex}}) | ||||
|   | ||||
| @@ -26,7 +26,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span class="author-hidden-divider">&</span> | ||||
| 			  {% endif %} | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               {% if loop.last %} | ||||
|                 <a href="#" class="author-expand" data-authors-max="{{g.config_authors_max}}" data-collapse-caption="({{_('reduce')}})">(...)</a> | ||||
|               {% endif %} | ||||
| @@ -34,13 +34,13 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span>&</span> | ||||
|               {% endif %} | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|             {% endif %} | ||||
|           {% endfor %} | ||||
|         </p> | ||||
|         {% if entry.series.__len__() > 0 %} | ||||
|         <p class="series"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='new', book_id=entry.series[0].id )}}"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id )}}"> | ||||
|             {{entry.series[0].name}} | ||||
|           </a> | ||||
|           ({{entry.series_index|formatseriesindex}}) | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span class="author-hidden-divider">&</span> | ||||
| 			  {% endif %} | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               {% if loop.last %} | ||||
|                 <a href="#" class="author-expand" data-authors-max="{{g.config_authors_max}}" data-collapse-caption="({{_('reduce')}})">(...)</a> | ||||
|               {% endif %} | ||||
| @@ -33,13 +33,13 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span>&</span> | ||||
|               {% endif %} | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|             {% endif %} | ||||
|           {% endfor %} | ||||
|         </p> | ||||
|         {% if entry.series.__len__() > 0 %} | ||||
|         <p class="series"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='new', book_id=entry.series[0].id )}}"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id )}}"> | ||||
|             {{entry.series[0].name}} | ||||
|           </a> | ||||
|           ({{entry.series_index|formatseriesindex}}) | ||||
| @@ -107,7 +107,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span class="author-hidden-divider">&</span> | ||||
| 			  {% endif %} | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list', data='author', book_id=author.id, sort_param='new') }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list', data='author', book_id=author.id, sort_param='stored') }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               {% if loop.last %} | ||||
|                 <a href="#" class="author-expand" data-authors-max="{{g.config_authors_max}}" data-collapse-caption="({{_('reduce')}})">(...)</a> | ||||
|               {% endif %} | ||||
| @@ -115,7 +115,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span>&</span> | ||||
|               {% endif %} | ||||
|               <a class="author-name" href="{{url_for('web.books_list', data='author', book_id=author.id, sort_param='new') }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name" href="{{url_for('web.books_list', data='author', book_id=author.id, sort_param='stored') }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|             {% endif %} | ||||
|           {% endfor %} | ||||
|           {% for format in entry.data %} | ||||
| @@ -126,7 +126,7 @@ | ||||
|         </p> | ||||
|         {% if entry.series.__len__() > 0 %} | ||||
|         <p class="series"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='new', book_id=entry.series[0].id )}}"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id )}}"> | ||||
|             {{entry.series[0].name}} | ||||
|           </a> | ||||
|           ({{entry.series_index|formatseriesindex}}) | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
|     {% endif %} | ||||
|     <div class="row" data-id="{{lang[0].name}}"> | ||||
|         <div class="col-xs-2 col-sm-2 col-md-1" align="left"><span class="badge">{{lang[1]}}</span></div> | ||||
|         <div class="col-xs-10 col-sm-10 col-md-11"><a id="list_{{loop.index0}}" href="{{url_for('web.books_list', book_id=lang[0].lang_code, data=data, sort_param='new')}}">{{lang[0].name}}</a></div> | ||||
|         <div class="col-xs-10 col-sm-10 col-md-11"><a id="list_{{loop.index0}}" href="{{url_for('web.books_list', book_id=lang[0].lang_code, data=data, sort_param='stored')}}">{{lang[0].name}}</a></div> | ||||
|     </div> | ||||
|   {% endfor %} | ||||
|       </div> | ||||
|   | ||||
| @@ -62,7 +62,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span class="author-hidden-divider">&</span> | ||||
|               {% endif %} | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               {% if loop.last %} | ||||
|                 <a href="#" class="author-expand" data-authors-max="{{g.config_authors_max}}" data-collapse-caption="({{_('reduce')}})">(...)</a> | ||||
|               {% endif %} | ||||
| @@ -70,7 +70,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span>&</span> | ||||
|               {% endif %} | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|             {% endif %} | ||||
|           {% endfor %} | ||||
|           {% for format in entry.Books.data %} | ||||
| @@ -81,7 +81,7 @@ | ||||
|         </p> | ||||
|         {% if entry.Books.series.__len__() > 0 %} | ||||
|         <p class="series"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='new', book_id=entry.Books.series[0].id )}}"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='stored', book_id=entry.Books.series[0].id )}}"> | ||||
|             {{entry.Books.series[0].name}} | ||||
|           </a> | ||||
|           ({{entry.Books.series_index|formatseriesindex}}) | ||||
|   | ||||
| @@ -50,7 +50,7 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span class="author-hidden-divider">&</span> | ||||
| 			  {% endif %} | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name author-hidden" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               {% if loop.last %} | ||||
|                 <a href="#" class="author-expand" data-authors-max="{{g.config_authors_max}}" data-collapse-caption="({{_('reduce')}})">(...)</a> | ||||
|               {% endif %} | ||||
| @@ -58,13 +58,13 @@ | ||||
|               {% if not loop.first %} | ||||
|                 <span>&</span> | ||||
|               {% endif %} | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|               <a class="author-name" href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')|shortentitle(30)}}</a> | ||||
|             {% endif %} | ||||
|           {% endfor %} | ||||
|         </p> | ||||
|         {% if entry.series.__len__() > 0 %} | ||||
|         <p class="series"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='new', book_id=entry.series[0].id )}}"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id )}}"> | ||||
|             {{entry.series[0].name}} | ||||
|           </a> | ||||
|           ({{entry.series_index|formatseriesindex}}) | ||||
|   | ||||
| @@ -38,7 +38,7 @@ | ||||
|         <p title="{{entry.title}}" class="title">{{entry.title|shortentitle}}</p> | ||||
|         <p class="author"> | ||||
|           {% for author in entry.ordered_authors %} | ||||
|             <a href="{{url_for('web.books_list',  data='author', sort_param='new', book_id=author.id) }}">{{author.name.replace('|',',')}}</a> | ||||
|             <a href="{{url_for('web.books_list',  data='author', sort_param='stored', book_id=author.id) }}">{{author.name.replace('|',',')}}</a> | ||||
|             {% if not loop.last %} | ||||
|               & | ||||
|             {% endif %} | ||||
| @@ -46,7 +46,7 @@ | ||||
|         </p> | ||||
|         {% if entry.series.__len__() > 0 %} | ||||
|         <p class="series"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='new', book_id=entry.series[0].id )}}"> | ||||
|           <a href="{{url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id )}}"> | ||||
|             {{entry.series[0].name}} | ||||
|           </a> | ||||
|           ({{entry.series_index}}) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Ozzie Isaacs
					Ozzie Isaacs