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