b33f4f04c517da0874b59dcf774385a7f8d9a771
[treecutter.git] / xinclude / photoalbum.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 import os
5 import sys
6 import glob
7 from shutil import rmtree,copytree
8 from PIL import Image
9 from libxmp import consts
10 from libxmp import XMPFiles
11 from lxml import etree
12 from lxml.builder import ElementMaker
13
14 from treecutter import constants as const
15
16 class PhotoAlbum(object):
17     def __init__(self, uri):
18         self.uri = unicode(uri)
19         self.albumid = abs(hash(self.uri))
20         self.filelist = []
21         self.filelist_thumb = []
22         self.filelist_slider = []
23
24     def format(self):
25         for infile in self.filelist:
26             size = (50, 50)
27             outfile, ext = os.path.splitext(infile)
28             outfile = outfile+"."+str(size[0])+"x"+str(size[1])+ext
29             if not os.path.exists(outfile):
30                 im = Image.open(infile)
31                 im.thumbnail(size, Image.ANTIALIAS)
32                 im.save(outfile)
33                 self.filelist_thumb.append(outfile)
34             size = (700, 438)
35             outfile, ext = os.path.splitext(infile)
36             outfile = outfile+"."+str(size[0])+"x"+str(size[1])+ext
37             if not os.path.exists(outfile):
38                 im = Image.open(infile)
39                 im.thumbnail(size, Image.ANTIALIAS)
40                 bg = Image.new('RGBA', size, (0, 0, 0, 0))
41                 bg.paste(im,((size[0]-im.size[0])/2, (size[1]-im.size[1])/2))
42                 bg.save(outfile)
43                 self.filelist_slider.append(outfile)
44
45     def files(self):
46         d = self.uri
47         for root, subdir, files in os.walk(d):
48             for f in files:
49                 self.filelist.append(os.path.join(root,f))
50
51     def db_xml(self):
52         db = ElementMaker(namespace=const.DB_NS, nsmap=const.NSMAP)
53         sl = db.itemizedlist(**{const.XML+"id": "slider"})
54         cnt = 0
55         for fs, f in zip(self.filelist_slider, self.filelist):
56             cnt = cnt + 1
57             xmpfile = XMPFiles(file_path=f)
58             xmp = xmpfile.get_xmp()
59             if xmp.does_property_exist(consts.XMP_NS_DC, 'description[1]'):
60                 cap = xmp.get_property(consts.XMP_NS_DC, 'description[1]')
61             else:
62                 cap = "Beskrivning saknas"
63             xmpfile.close_file()
64             sl.append(
65                 db.listitem(db.mediaobject(
66                         db.imageobject(db.imagedata(fileref=fs)),
67                         db.caption(db.para(cap, db.link("[]",**{const.XLINK+"href": f})))),**{const.XML+"id": "p%x%d" % (self.albumid,cnt)}))
68
69         th = db.itemizedlist(**{const.XML+"id": "thumb"})
70         cnt = 0
71         for f in self.filelist_thumb:
72             cnt = cnt + 1
73             th.append(db.listitem(db.para(db.link(db.inlinemediaobject(db.imageobject(db.imagedata(fileref=f))),**{const.XLINK+"href": "#p%x%d" % (self.albumid, cnt)}))))
74         return db.informalfigure(sl,th,**{const.XML+"id": "box"})
75
76 def recursively_empty(e):
77     if e.text:
78         return False
79     return all((recursively_empty(c) for c in e.iterchildren()))
80
81 def clean_db(xml):
82     context = etree.iterwalk(xml)
83     for action, elem in context:
84         parent = elem.getparent()
85         if recursively_empty(elem):
86             parent.remove(elem)
87
88 if __name__ == "__main__":
89     for arg in sys.argv[1:]:
90         al = arg.split("=",1)
91         if al[0] == "lang":
92             lang = al[1]
93         if al[0] == "xptr":
94             argument = al[1]
95
96     album = PhotoAlbum(argument)
97     album.files()
98     album.format()
99     axml = album.db_xml()
100 #    clean_db(axml)
101
102     #print(etree.tostring(cxml, pretty_print=True))
103     #sys.stderr.write(axml.encode('utf-8'))
104     #sys.stderr.write(etree.tostring(axml,encoding='UTF-8',pretty_print=True))
105     sys.stdout.write(etree.tostring(axml,encoding='UTF-8',pretty_print=True))