mirror of
https://github.com/ajurna/cbwebreader.git
synced 2025-12-06 06:17:17 +00:00
Changed the way it handles paths to urlencode.
now supports subdirectories added breadcrumbs
This commit is contained in:
@@ -50,7 +50,13 @@
|
|||||||
</div><!--/.nav-collapse -->
|
</div><!--/.nav-collapse -->
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
{% block breadcrumb %}
|
||||||
|
<li><a href="#">Home</a></li>
|
||||||
|
<li><a href="#">Library</a></li>
|
||||||
|
<li class="active">Data</li>
|
||||||
|
{% endblock %}
|
||||||
|
</ol>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
{% block content %}{% endblock %}
|
{% block content %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,11 +1,22 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% block title %}My amazing blog{% endblock %}
|
{% block title %}My amazing blog{% endblock %}
|
||||||
|
|
||||||
|
{% block breadcrumb %}
|
||||||
|
{% for crumb in breadcrumbs %}
|
||||||
|
<li><a href="{{ crumb.url }}"{% if forloop.last %} class="active"{% endif %}>{{ crumb.name }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2 class="center">Comics</h2>
|
<h2 class="center">Comics</h2>
|
||||||
<div class="list-group">
|
<div class="list-group">
|
||||||
{% if file_list %}
|
{% if file_list %}
|
||||||
{% for file in file_list %}
|
{% for file in file_list %}
|
||||||
<a href="/comic/file/0/{{ file }}/" class="list-group-item">{{ file }}</a>
|
{% if file.isdir %}
|
||||||
|
<a href="/comic/{{ file.location }}/" class="glyphicon {{ file.icon }} list-group-item"> {{ file }}</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if file.iscb %}
|
||||||
|
<a href="/comic/read/{{ file.location }}/0/" class="glyphicon {{ file.icon }} list-group-item"> {{ file }}</a>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<p class="list-group-item">No comics.</p>
|
<p class="list-group-item">No comics.</p>
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<center>
|
<center>
|
||||||
<br/>
|
<br/>
|
||||||
<a href="/comic/file/{{ nav.next }}/{{ file_name }}/">
|
<a href="/comic/read/{{ file_name }}/{{ nav.next }}/">
|
||||||
<img src="/comic/file/{{ nav.cur }}/{{ file_name }}/img" height="900"></img>
|
<img src="/comic/read/{{ file_name }}/{{ nav.cur }}/img" height="900" class="img-rounded"></img>
|
||||||
</a>
|
</a>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<a href="/comic/file/{{ nav.prev }}/{{ file_name }}/">Prev</a>
|
<a href="/comic/read/{{ file_name }}/{{ nav.prev }}/">Prev</a>
|
||||||
{% if pages %}
|
{% if pages %}
|
||||||
<select>
|
<select>
|
||||||
{% for file in pages %}
|
{% for file in pages %}
|
||||||
@@ -17,6 +17,6 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<p>No comics.</p>
|
<p>No comics.</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="/comic/file/{{ nav.next }}/{{ file_name }}/">Next</a>
|
<a href="/comic/read/{{ file_name }}/{{ nav.next }}/">Next</a>
|
||||||
</center>
|
</center>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -4,6 +4,9 @@ from . import views
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^$', views.index, name='index'),
|
url(r'^$', views.index, name='index'),
|
||||||
|
url(r'^(?P<comic_path>[\w=]+)\/$', views.index, name='index'),
|
||||||
|
url(r'^read\/(?P<comic_path>[\w=]+)\/(?P<page>[0-9]+)\/$', views.read_comic, name='read_comic'),
|
||||||
|
url(r'^read\/(?P<comic_path>[\w=]+)\/(?P<page>[0-9]+)\/img$', views.get_image, name='get_image'),
|
||||||
url(r"^file\/(?P<page>[0-9]+)\/(?P<file_name>[\w.\s'\(\)\-]+)\/$", views.read_comic, name='read_comic'),
|
url(r"^file\/(?P<page>[0-9]+)\/(?P<file_name>[\w.\s'\(\)\-]+)\/$", views.read_comic, name='read_comic'),
|
||||||
url(r"^file\/(?P<page>[0-9]+)\/(?P<file_name>[\w.\s'\(\)\-]+)\/img$", views.get_image, name='get_image'),
|
url(r"^file\/(?P<page>[0-9]+)\/(?P<file_name>[\w.\s'\(\)\-]+)\/img$", views.get_image, name='get_image'),
|
||||||
]
|
]
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.template import RequestContext, loader
|
from django.template import RequestContext, loader
|
||||||
|
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
|
||||||
|
|
||||||
from comic.models import Setting
|
from comic.models import Setting
|
||||||
|
|
||||||
from unrar import rarfile
|
from unrar import rarfile
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
import os
|
import os
|
||||||
|
from os import path
|
||||||
|
|
||||||
class Comic:
|
class Comic:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -15,25 +18,56 @@ class Navigation:
|
|||||||
self.next = 0
|
self.next = 0
|
||||||
self.prev = 0
|
self.prev = 0
|
||||||
self.cur = 0
|
self.cur = 0
|
||||||
|
class DirFile:
|
||||||
|
def __init__(self):
|
||||||
|
self.name = ''
|
||||||
|
self.isdir = False
|
||||||
|
self.icon = ''
|
||||||
|
self.iscb = False
|
||||||
|
self.location = ''
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
def index(request):
|
def index(request, comic_path=''):
|
||||||
base_dir = Setting.objects.get(name='BASE_DIR')
|
base_dir = Setting.objects.get(name='BASE_DIR')
|
||||||
files = os.listdir(base_dir.value)
|
comic_path = urlsafe_base64_decode(comic_path)
|
||||||
|
breadcrumbs = generate_breadcrumbs(comic_path)
|
||||||
|
|
||||||
|
|
||||||
|
#list and classify files
|
||||||
|
files = []
|
||||||
|
for fn in os.listdir(path.join(base_dir.value, comic_path)):
|
||||||
|
df = DirFile()
|
||||||
|
df.name = fn
|
||||||
|
if path.isdir(path.join(base_dir.value, comic_path, fn)):
|
||||||
|
df.isdir = True
|
||||||
|
df.icon = 'glyphicon-folder-open'
|
||||||
|
df.location = urlsafe_base64_encode(path.join(comic_path, fn))
|
||||||
|
elif fn.lower().endswith('cbz') or fn.lower().endswith('cbr'):
|
||||||
|
df.iscb = True
|
||||||
|
df.icon = 'glyphicon-book'
|
||||||
|
df.location = urlsafe_base64_encode(path.join(comic_path, fn))
|
||||||
|
files.append(df)
|
||||||
template = loader.get_template('comic/index.html')
|
template = loader.get_template('comic/index.html')
|
||||||
context = RequestContext(request, {
|
context = RequestContext(request, {
|
||||||
'file_list': files,
|
'file_list': files,
|
||||||
|
'breadcrumbs': breadcrumbs,
|
||||||
})
|
})
|
||||||
|
|
||||||
return HttpResponse(template.render(context))
|
return HttpResponse(template.render(context))
|
||||||
|
|
||||||
|
|
||||||
def read_comic(request, file_name, page):
|
def read_comic(request, comic_path, page):
|
||||||
|
encoded = comic_path
|
||||||
|
comic_path = urlsafe_base64_decode(comic_path)
|
||||||
base_dir = Setting.objects.get(name='BASE_DIR')
|
base_dir = Setting.objects.get(name='BASE_DIR')
|
||||||
template = loader.get_template('comic/read_comic.html')
|
template = loader.get_template('comic/read_comic.html')
|
||||||
if file_name.lower().endswith('cbr'):
|
if comic_path.lower().endswith('cbr'):
|
||||||
cbx = rarfile.RarFile(os.path.join(base_dir.value, file_name))
|
cbx = rarfile.RarFile(path.join(base_dir.value, comic_path))
|
||||||
elif file_name.lower().endswith('cbz'):
|
elif comic_path.lower().endswith('cbz'):
|
||||||
cbx = ZipFile(os.path.join(base_dir.value, file_name))
|
cbx = ZipFile(path.join(base_dir.value, comic_path))
|
||||||
nav = Navigation()
|
nav = Navigation()
|
||||||
page = int(page)
|
page = int(page)
|
||||||
nav.cur = page
|
nav.cur = page
|
||||||
@@ -46,21 +80,20 @@ def read_comic(request, file_name, page):
|
|||||||
comic.index = idx
|
comic.index = idx
|
||||||
pages.append(comic)
|
pages.append(comic)
|
||||||
|
|
||||||
img_src = '/comic/file/0/' + file_name + '/img'
|
|
||||||
context = RequestContext(request, {
|
context = RequestContext(request, {
|
||||||
'pages': pages,
|
'pages': pages,
|
||||||
'file_name': file_name,
|
'file_name': encoded,
|
||||||
'img_src': img_src,
|
|
||||||
'nav': nav,
|
'nav': nav,
|
||||||
})
|
})
|
||||||
return HttpResponse(template.render(context))
|
return HttpResponse(template.render(context))
|
||||||
|
|
||||||
def get_image(request, file_name, page):
|
def get_image(request, comic_path, page):
|
||||||
base_dir = Setting.objects.get(name='BASE_DIR')
|
base_dir = Setting.objects.get(name='BASE_DIR')
|
||||||
if file_name.lower().endswith('cbr'):
|
comic_path = urlsafe_base64_decode(comic_path)
|
||||||
cbx = rarfile.RarFile(os.path.join(base_dir.value, file_name))
|
if comic_path.lower().endswith('cbr'):
|
||||||
elif file_name.lower().endswith('cbz'):
|
cbx = rarfile.RarFile(path.join(base_dir.value, comic_path))
|
||||||
cbx = ZipFile(os.path.join(base_dir.value, file_name))
|
elif comic_path.lower().endswith('cbz'):
|
||||||
|
cbx = ZipFile(path.join(base_dir.value, comic_path))
|
||||||
page = int(page)
|
page = int(page)
|
||||||
page_file = cbx.namelist()[page]
|
page_file = cbx.namelist()[page]
|
||||||
file_name = str(page_file).lower()
|
file_name = str(page_file).lower()
|
||||||
@@ -79,3 +112,26 @@ def get_image(request, file_name, page):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
img = cbx.open(page_file)
|
img = cbx.open(page_file)
|
||||||
return HttpResponse(img.read(), content_type=content)
|
return HttpResponse(img.read(), content_type=content)
|
||||||
|
|
||||||
|
class Breadcrumb:
|
||||||
|
def __init__(self):
|
||||||
|
self.name = 'Home'
|
||||||
|
self.url = '/comic/'
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
def generate_breadcrumbs(comic_path):
|
||||||
|
output = [Breadcrumb()]
|
||||||
|
prefix = '/comic/'
|
||||||
|
last = ''
|
||||||
|
comic_path = path.normpath(comic_path)
|
||||||
|
folders = comic_path.split(os.sep)
|
||||||
|
for item in folders:
|
||||||
|
if item == '.':
|
||||||
|
continue
|
||||||
|
bc = Breadcrumb()
|
||||||
|
bc.name = item
|
||||||
|
bc.url = prefix + urlsafe_base64_encode(item)
|
||||||
|
output.append(bc)
|
||||||
|
last = path.join(last, item)
|
||||||
|
return output
|
||||||
Reference in New Issue
Block a user