[Edit Linked Library] Fixes based on code review from Campbell
[blender-addons-contrib.git] / render_notify.py
1 # ***** BEGIN GPL LICENSE BLOCK *****
2 #
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software Foundation,
16 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 #
18 # ***** END GPL LICENCE BLOCK *****
19
20
21 bl_info = {
22     "name": "Render Notify",
23     "author": "Campbell Barton",
24     "version": (0, 0, 1),
25     "blender": (2, 65, 0),
26     "location": "Uses desktop notify facilities",
27     "description": "Notify when a rendered completes",
28     "warning": "Currently only Linux/Unix supported (using 'notify-send')",
29     "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6"
30                 "/Py/Scripts/Render/Render_Notify",
31     "category": "Render"}
32
33 # TODO. add Win/OSX support if possible.
34
35
36 import bpy
37 import time
38 from bpy.app.handlers import persistent
39 from datetime import timedelta
40
41 timer = [0.0]
42
43
44 def clean_float(text):
45     # strip trailing zeros: 0.000 -> 0.0
46     index = text.rfind(".")
47     if index != -1:
48         index += 2
49         head, tail = text[:index], text[index:]
50         tail = tail.rstrip("0")
51         text = head + tail
52     return text
53
54
55 @persistent
56 def render_begin(scene):
57     timer[0] = time.time()
58
59
60 @persistent
61 def render_complete(scene):
62     import os
63     import shlex
64     time_val = round(time.time() - timer[0], 2)
65     time_str = clean_float(str(timedelta(seconds=time_val)))
66     file_str = os.path.basename(bpy.data.filepath)
67     msg = "%s render complete in %s" % (file_str, time_str)
68     os.system("notify-send --app-name=Blender --icon=blender %s" %
69               shlex.quote(msg))
70
71
72 def register():
73     bpy.app.handlers.render_complete.append(render_complete)
74     bpy.app.handlers.render_pre.append(render_begin)
75
76
77 def unregister():
78     bpy.app.handlers.render_complete.remove(render_complete)
79     bpy.app.handlers.render_pre.remove(render_begin)
80
81
82 if __name__ == '__main__':
83     register()