]> Untitled Git - web-gallery.git/blob - navigator/app/app.py
e6bc9b23dc3c84fa8840f43bc91b386af50a59a4
[web-gallery.git] / navigator / app / app.py
1 from flask import Flask, render_template
2 import os
3 import re
4
5 app = Flask(__name__)
6 gallery_root = "/app/gallery"
7 gallery_desc_filename = "description.html"
8 get_num_regex = re.compile(r'\d+')
9
10 @app.route('/')
11 def render_gallery():
12     gallery_names = []
13     with os.scandir(gallery_root) as galleries:
14         for gallery in galleries:
15             if not gallery.is_file():
16                 gallery_names.append(gallery.name)
17     gallery_names.sort()
18     return render_template( 'gallery.html',
19         title="My Comics",
20         galleries=gallery_names
21         )
22
23 def get_page_number_from_name(name):
24     try:
25         return int(get_num_regex.findall(name)[-1]) 
26     except IndexError:
27         print ("Index error on name " + name, flush=True)
28         return -1
29
30 @app.route('/<gallery>')
31 def render_pages(gallery=None):
32     gallery_dir = gallery_root + "/" + gallery
33
34     # get list of available pages in gallery
35     template_pages = []
36     with os.scandir(gallery_dir) as pages:
37         for page in pages:
38             if page.is_file() and page.name.endswith('.png') or page.name.endswith('.jpg'):
39                 template_pages.append({
40                     'name': page.name, 
41                     'number': get_page_number_from_name(page.name)
42                     })
43     template_pages = sorted(template_pages, key=lambda page: page['number'])
44
45     # get description for gallery (if available)
46     desc_filename = gallery_dir + "/" + gallery_desc_filename
47     description = None
48     try:
49         with open(desc_filename, 'r') as file:
50             description = file.read()
51     except:
52         print("Description file not found at " + desc_filename)
53
54     # render!
55     return render_template( 'pages.html',
56         title=gallery,
57         gallery=gallery,
58         description=description,
59         pages=template_pages
60         )
61
62 @app.route('/<gallery>/<int:page_num>')
63 def render_page(gallery=None, page_num=None):
64
65     # find a page that I think corrosponds to this page number
66     page_name = None
67     with os.scandir(gallery_root + "/" + gallery) as pages:
68         for page in pages:
69             if page.is_file():
70                 num = get_page_number_from_name(page.name)
71                 if int(page_num) == int(num):
72                     page_name = page.name
73                     break
74
75     # if found, create src link to that page
76     if page_name:
77         src = '/images/{}/{}'.format( gallery, page_name )
78         prev_page_url = "/{}/{}".format( gallery, page_num - 1)
79         next_page_url = "/{}/{}".format( gallery, page_num + 1)
80
81         return render_template( 'page.html',
82             gallery=gallery, page_num=page_num,
83             title='{} {}'.format(gallery, page_num), src=src, alt=page_name,
84             prev_page_url=prev_page_url,
85             next_page_url=next_page_url )
86     else:
87         return 'No page found'