2 # -*- coding: utf-8 -*-
7 from shutil import rmtree,copytree
9 from libxmp import consts
10 from libxmp import XMPFiles
11 from lxml import etree
12 from lxml.builder import ElementMaker
14 from treecutter import constants as const
16 class PhotoAlbum(object):
17 def __init__(self, uri):
18 self.uri = unicode(uri)
19 self.albumid = abs(hash(self.uri))
21 self.filelist_thumb = []
22 self.filelist_slider = []
25 for infile in self.filelist:
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)
33 self.filelist_thumb.append(outfile)
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))
43 self.filelist_slider.append(outfile)
47 for root, subdir, files in os.walk(d):
49 self.filelist.append(os.path.join(root,f))
52 db = ElementMaker(namespace=const.DB_NS, nsmap=const.NSMAP)
53 sl = db.itemizedlist(**{const.XML+"id": "slider"})
55 for fs, f in zip(self.filelist_slider, self.filelist):
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]')
62 cap = "Beskrivning saknas"
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)}))
69 th = db.itemizedlist(**{const.XML+"id": "thumb"})
71 for f in self.filelist_thumb:
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"})
76 def recursively_empty(e):
79 return all((recursively_empty(c) for c in e.iterchildren()))
82 context = etree.iterwalk(xml)
83 for action, elem in context:
84 parent = elem.getparent()
85 if recursively_empty(elem):
88 if __name__ == "__main__":
89 for arg in sys.argv[1:]:
96 album = PhotoAlbum(argument)
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))