1 from degal.command import command |
1 from degal.command import command |
|
2 from degal.concurrent import task |
2 from degal import templates |
3 from degal import templates |
3 |
4 |
4 def render_image_html (ctx, image) : |
5 def render_image_html (ctx, image) : |
5 """ |
6 """ |
6 Render the thumbnails and .html for one image |
7 Render the thumbnails and .html for one image |
14 ) |
15 ) |
15 |
16 |
16 # write output |
17 # write output |
17 tpl.render_file(image.html) |
18 tpl.render_file(image.html) |
18 |
19 |
19 def render_image_thumbs (image) : |
20 def update_image_thumbs (image) : |
20 """ |
21 """ |
21 Render the thubmnails for the given image |
22 Render the thubmnails for the given image, returning the image. |
|
23 |
|
24 This /should/ be threadsafe. |
22 """ |
25 """ |
|
26 |
|
27 # this will unconditionally update the image |
|
28 image.update() |
23 |
29 |
24 image.update() |
30 return image |
25 |
31 |
26 def render_folder_images (ctx, images, for_update=True) : |
32 def render_folder_images (ctx, images, for_update=True) : |
27 """ |
33 """ |
28 Render the given series of images |
34 Render the given series of images |
29 """ |
35 """ |
30 |
36 |
31 # render them in parallel as required |
37 # XXX: this breaks force_html |
32 for image in images : |
38 |
|
39 # render the thumbnails concurrently |
|
40 for image in ctx.concurrent.execute( |
|
41 task(update_image_thumbs, image) |
|
42 |
|
43 for image in images |
|
44 |
|
45 # only test if not already filtered for update |
|
46 # XXX: externalize logic |
|
47 if for_update or ctx.config.force_thumb or image.stale() |
|
48 ) : |
33 # log image path |
49 # log image path |
34 ctx.log_info("%s", image) |
50 ctx.log_info("%s", image) |
35 |
|
36 # only test if not already filtered for update |
|
37 if for_update or ctx.config.force_thumb or image.stale() : |
|
38 # render output thumbs |
|
39 render_image_thumbs(image) |
|
40 |
51 |
41 # render HTML |
52 # render HTML |
42 render_image_html(ctx, image) |
53 render_image_html(ctx, image) |
43 |
54 |
44 # release large objects that are not needed anymore |
55 # release large objects that are not needed anymore |
45 # XXX: verify that this works |
56 # XXX: verify that this works |
46 del image.img |
57 del image.img |
47 |
58 |
48 def render_folder_page (ctx, folder) : |
59 def render_folder_html (ctx, folder) : |
49 """ |
60 """ |
50 Render the .html output for one folder |
61 Render the .html output for one folder |
51 """ |
62 """ |
52 |
63 |
53 # render each page separately |
64 # render each page separately |
84 # index selected images |
95 # index selected images |
85 new_images = list(folder.index_images(for_update=for_update)) |
96 new_images = list(folder.index_images(for_update=for_update)) |
86 |
97 |
87 if new_images or ctx.config.force_html : |
98 if new_images or ctx.config.force_html : |
88 # update folder index |
99 # update folder index |
89 render_folder_page(ctx, folder) |
100 render_folder_html(ctx, folder) |
90 |
101 |
91 ctx.log_info("%s - render %d/%d images", folder, len(new_images), image_count) |
102 ctx.log_info("%s - render %d/%d images", folder, len(new_images), image_count) |
92 |
103 |
93 # update images |
104 # update images |
94 render_folder_images(ctx, new_images, for_update) |
105 render_folder_images(ctx, new_images, for_update) |