mirror of
https://github.com/janeczku/calibre-web
synced 2024-11-04 12:00:17 +00:00
353 lines
13 KiB
HTML
353 lines
13 KiB
HTML
<!DOCTYPE html>
|
|
<html class="no-js">
|
|
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
<title>{{ entry.title }}</title>
|
|
<meta name="description" content="">
|
|
<meta name="viewport" content="width=device-width">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
{% if g.google_site_verification|length > 0 %}
|
|
<meta name="google-site-verification" content="{{g.google_site_verification}}">
|
|
{% endif %}
|
|
|
|
<script src="{{ url_for('static', filename='js/libs/jquery.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/libs/soundmanager2.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/libs/bar-ui.js') }}"></script>
|
|
|
|
<link rel="apple-touch-icon" sizes="140x140" href="{{ url_for('static', filename='favicon.ico') }}">
|
|
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
|
|
<link href="{{ url_for('static', filename='css/libs/bootstrap.min.css') }}" rel="stylesheet" media="screen">
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/libs/bar-ui.css') }}" />
|
|
|
|
<script>
|
|
"use strict";
|
|
</script>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div class="row" style="display: inline-block; width: 100%;">
|
|
<div class="col-sm-3 col-lg-3 col-xs-5">
|
|
|
|
</div>
|
|
<div class="col-sm-6 col-lg-6 book-meta" style="margin-bottom: 2%;">
|
|
<img id="detailcover" title="{{entry.title}}" src="{{url_for('web.get_cover', book_id=entry.id, resolution='og', c=entry|last_modified)}}" style="float: right; margin-top: 20px"/>
|
|
<h2 id="title">{{entry.title}}</h2>
|
|
<p class="author">
|
|
{% for author in entry.ordered_authors %}
|
|
<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 %}
|
|
{% endfor %}
|
|
</p>
|
|
{% if entry.ratings.__len__() > 0 %}
|
|
<div class="rating">
|
|
<p>
|
|
{% for number in range((entry.ratings[0].rating/2)|int(2)) %}
|
|
<span class="glyphicon glyphicon-star good"></span>
|
|
{% if loop.last and loop.index < 5 %}
|
|
{% for numer in range(5 - loop.index) %}
|
|
<span class="glyphicon glyphicon-star-empty"></span>
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
</p>
|
|
</div>
|
|
{% endif %}
|
|
{% if entry.series|length > 0 %}
|
|
<p>{{_("Book %(index)s of %(range)s", index=entry.series_index | formatfloat(2), range=(url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id)|escapedlink(entry.series[0].name))|safe)}}</p>
|
|
|
|
{% endif %}
|
|
|
|
{% if entry.languages.__len__() > 0 %}
|
|
<div class="languages">
|
|
<p>
|
|
<span class="label label-default">{{_('Language')}}: {% for language in entry.languages %}{{language.language_name}}{% if not loop.last %}, {% endif %}{% endfor %}</span>
|
|
</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if entry.identifiers|length > 0 %}
|
|
<div class="identifiers">
|
|
<p>
|
|
<span class="glyphicon glyphicon-link"></span>
|
|
{% for identifier in entry.identifiers %}
|
|
<a href="{{identifier}}" target="_blank" class="btn btn-xs btn-success" role="button">{{identifier.format_type()}}</a>
|
|
{%endfor%}
|
|
</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if entry.tags|length > 0 %}
|
|
|
|
<div class="tags">
|
|
<p>
|
|
<span class="glyphicon glyphicon-tags"></span>
|
|
|
|
{% for tag in entry.tags %}
|
|
<a href="{{ url_for('web.books_list', data='category', sort_param='stored', book_id=tag.id) }}" class="btn btn-xs btn-info" role="button">{{tag.name}}</a>
|
|
{%endfor%}
|
|
</p>
|
|
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if entry.publishers|length > 0 %}
|
|
<div class="publishers">
|
|
<p>
|
|
<span>{{_('Publisher')}}:
|
|
<a href="{{url_for('web.books_list', data='publisher', sort_param='stored', book_id=entry.publishers[0].id ) }}">{{entry.publishers[0].name}}</a>
|
|
</span>
|
|
</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if (entry.pubdate|string)[:10] != '0101-01-01' %}
|
|
<div class="publishing-date">
|
|
<p>{{_('Published')}}: {{entry.pubdate|formatdate}} </p>
|
|
</div>
|
|
{% endif %}
|
|
{% if cc|length > 0 %}
|
|
|
|
|
|
{% for c in cc %}
|
|
<div class="real_custom_columns">
|
|
{% if entry['custom_column_' ~ c.id]|length > 0 %}
|
|
{{ c.name }}:
|
|
{% for column in entry['custom_column_' ~ c.id] %}
|
|
{% if c.datatype == 'rating' %}
|
|
{{ (column.value / 2)|formatfloat }}
|
|
{% else %}
|
|
{% if c.datatype == 'bool' %}
|
|
{% if column.value == true %}
|
|
<span class="glyphicon glyphicon-ok"></span>
|
|
{% else %}
|
|
<span class="glyphicon glyphicon-remove"></span>
|
|
{% endif %}
|
|
{% else %}
|
|
{% if c.datatype == 'float' %}
|
|
{{ column.value|formatfloat(2) }}
|
|
{% elif c.datatype == 'datetime' %}
|
|
{{ column.value|formatdate }}
|
|
{% elif c.datatype == 'comments' %}
|
|
{{column.value|safe}}
|
|
{% elif c.datatype == 'series' %}
|
|
{{ '%s [%s]' % (column.value, column.extra|formatfloat(2)) }}
|
|
{% elif c.datatype == 'text' %}
|
|
{{ column.value.strip() }}{% if not loop.last %}, {% endif %}
|
|
{% else %}
|
|
{{ column.value }}
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% if not g.user.is_anonymous %}
|
|
|
|
<div class="custom_columns">
|
|
<p>
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
|
<label class="block-label">
|
|
<input id="have_read_cb" data-checked="{{_('Mark As Unread')}}" data-unchecked="{{_('Mark As Read')}}" type="checkbox" {% if entry.read_status %}checked{% endif %} disabled>
|
|
<span>{{_('Read')}}</span>
|
|
</label>
|
|
</p>
|
|
{% if g.user.check_visibility(32768) %}
|
|
<p>
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
|
<label class="block-label">
|
|
<input id="archived_cb" data-checked="{{_('Restore from archive')}}" data-unchecked="{{_('Add to archive')}}" type="checkbox" {% if entry.is_archived %}checked{% endif %} disabled>
|
|
<span>{{_('Archived')}}</span>
|
|
</label>
|
|
</p>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
|
|
{% if entry.comments|length > 0 and entry.comments[0].text|length > 0%}
|
|
<div class="comments">
|
|
<h3 id="decription">{{_('Description:')}}</h3>
|
|
{{entry.comments[0].text|safe}}
|
|
</div>
|
|
{% endif %}
|
|
|
|
|
|
<div class="more-stuff">
|
|
|
|
{% if g.user.is_authenticated %}
|
|
{% if g.user.shelf.all() or g.shelves_access %}
|
|
<div id="shelf-actions" class="btn-toolbar" role="toolbar">
|
|
<div class="btn-group" role="group" aria-label="Add to shelves">
|
|
<button id="add-to-shelf" type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
<span class="glyphicon glyphicon-list"></span> {{_('Add to shelf')}}
|
|
<span class="caret"></span>
|
|
</button>
|
|
<ul id="add-to-shelves" class="dropdown-menu" aria-labelledby="add-to-shelf">
|
|
{% for shelf in g.shelves_access %}
|
|
{% if not shelf.id in books_shelfs and ( not shelf.is_public or g.user.role_edit_shelfs() ) %}
|
|
<li>
|
|
<a data-href="{{ url_for('shelf.add_to_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
|
|
data-remove-href="{{ url_for('shelf.remove_from_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
|
|
data-shelf-action="add"
|
|
>
|
|
{{shelf.name}}{% if shelf.is_public == 1 %} {{_('(Public)')}}{% endif %}
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
{%endfor%}
|
|
</ul>
|
|
</div>
|
|
<div id="remove-from-shelves" class="btn-group" role="group" aria-label="Remove from shelves">
|
|
{% if books_shelfs %}
|
|
{% for shelf in g.shelves_access %}
|
|
{% if shelf.id in books_shelfs %}
|
|
<a data-href="{{ url_for('shelf.remove_from_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
|
|
data-add-href="{{ url_for('shelf.add_to_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
|
|
class="btn btn-sm btn-default" role="button" data-shelf-action="remove"
|
|
>
|
|
<span {% if not shelf.is_public or g.user.role_edit_shelfs() %}
|
|
class="glyphicon glyphicon-remove"
|
|
{% endif %}></span> {{shelf.name}}{% if shelf.is_public == 1 %} {{_('(Public)')}}{% endif %}
|
|
</a>
|
|
{% endif %}
|
|
{%endfor%}
|
|
{% endif %}
|
|
</div>
|
|
<div id="shelf-action-errors" class="pull-left" role="alert"></div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% endif %}
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sm2-bar-ui full-width fixed">
|
|
|
|
<div class="bd sm2-main-controls">
|
|
|
|
<div class="sm2-inline-texture"></div>
|
|
<div class="sm2-inline-gradient"></div>
|
|
|
|
<div class="sm2-inline-element sm2-button-element">
|
|
<div class="sm2-button-bd">
|
|
<a href="#play" class="sm2-inline-button sm2-icon-play-pause">Play / Pause</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sm2-inline-element sm2-inline-status">
|
|
|
|
<div class="sm2-playlist">
|
|
<div class="sm2-playlist-target">
|
|
<noscript><p>JavaScript Required.</p></noscript>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sm2-progress">
|
|
<div class="sm2-row">
|
|
<div class="sm2-inline-time">0:00</div>
|
|
<div class="sm2-progress-bd">
|
|
<div class="sm2-progress-track">
|
|
<div class="sm2-progress-bar"></div>
|
|
<div class="sm2-progress-ball"><div class="icon-overlay"></div></div>
|
|
</div>
|
|
</div>
|
|
<div class="sm2-inline-duration">0:00</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="sm2-inline-element sm2-button-element sm2-volume">
|
|
<div class="sm2-button-bd">
|
|
<span class="sm2-inline-button sm2-volume-control volume-shade"></span>
|
|
<a href="#volume" class="sm2-inline-button sm2-volume-control">Volume</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sm2-inline-element sm2-button-element">
|
|
<div class="sm2-button-bd">
|
|
<a href="#prev" title="Previous" class="sm2-inline-button sm2-icon-previous">< Previous</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sm2-inline-element sm2-button-element">
|
|
<div class="sm2-button-bd">
|
|
<a href="#next" title="Next" class="sm2-inline-button sm2-icon-next">> Next</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sm2-inline-element sm2-button-element">
|
|
<div class="sm2-button-bd">
|
|
<a href="#repeat" title="Repeat playlist" class="sm2-inline-button sm2-icon-repeat">∞ Repeat</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sm2-inline-element sm2-button-element sm2-menu">
|
|
<div class="sm2-button-bd">
|
|
<a href="#menu" class="sm2-inline-button sm2-icon-menu">Menu</a>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="bd sm2-playlist-drawer sm2-element">
|
|
|
|
<div class="sm2-inline-texture">
|
|
<div class="sm2-box-shadow"></div>
|
|
</div>
|
|
|
|
<!-- playlist content is mirrored here -->
|
|
|
|
<div class="sm2-playlist-wrapper">
|
|
<ul class="sm2-playlist-bd">
|
|
<li><a href="{{ url_for('web.serve_book', book_id=mp3file,book_format=audioformat)}}"><b>{% for author in entry.ordered_authors %}{{author.name.replace('|',',')}}
|
|
{% if not loop.last %} & {% endif %} {% endfor %}</b> - {{entry.title}}</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
|
|
|
<script>
|
|
soundManager.setup({
|
|
useHTML5Audio: true,
|
|
preferFlash: false,
|
|
url: '/path/to/swf-files/',
|
|
onready: function() {
|
|
var mySound = soundManager.createSound({
|
|
// id: 'aSound',
|
|
// url: "{{ url_for('web.serve_book', book_id=mp3file,book_format=audioformat)}}"
|
|
});
|
|
mySound.play();
|
|
},
|
|
ontimeout: function() {
|
|
// Hrmm, SM2 could not start. Missing SWF? Flash blocked? Show an error, etc.?
|
|
}
|
|
});
|
|
window.calibre = {
|
|
filePath: "{{ url_for('static', filename='js/libs/') }}",
|
|
cssPath: "{{ url_for('static', filename='css/') }}",
|
|
bookUrl: "{{ url_for('static', filename=mp3file) }}/",
|
|
bookmarkUrl: "{{ url_for('web.set_bookmark', book_id=mp3file, book_format=audioformat.upper()) }}",
|
|
bookmark: "{{ bookmark.bookmark_key if bookmark != None }}",
|
|
useBookmarks: "{{ g.user.is_authenticated | tojson }}"
|
|
|
|
};
|
|
</script>
|
|
</body>
|
|
|
|
</html>
|