1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 from datetime import datetime
20 import colorsys
21 import os.path
22
23 from timelinelib.calendar.gregorian.gregorian import GregorianDateTime
24 from timelinelib.canvas.data.db import MemoryDB
25 from timelinelib.canvas.data.exceptions import TimelineIOError
26 from timelinelib.canvas.data import Category
27 from timelinelib.canvas.data import Event
28
29
36
37
39 """
40 Load timeline data from the given directory.
41
42 Each filename inside the directory (at any level) becomes an event where
43 the text is the filename name and the time is the modification time for
44 the filename.
45
46 For each sub-directory a category is created and all events (files)
47 belong the category (directory) in which they are.
48 """
49 if not os.path.exists(dir_path):
50
51 return
52 if not os.path.isdir(dir_path):
53
54 return
55 try:
56 color_ranges = {}
57 color_ranges[dir_path] = (0.0, 1.0, 1.0)
58 all_cats = []
59 parents = {}
60 for (dirpath, dirnames, filenames) in os.walk(dir_path):
61
62 (rstart, rend, b) = color_ranges[dirpath]
63 step = (rend - rstart) // (len(dirnames) + 1)
64 next_start = rstart + step
65 new_b = b - 0.2
66 if new_b < 0:
67 new_b = 0
68 for dirname in dirnames:
69 next_end = next_start + step
70 color_ranges[os.path.join(dirpath, dirname)] = (next_start, next_end, new_b)
71 next_start = next_end
72
73 p = parents.get(os.path.normpath(os.path.join(dirpath, "..")),
74 None)
75 cat = Category().update(dirpath, (233, 233, 233), None, parent=p)
76 parents[os.path.normpath(dirpath)] = cat
77 all_cats.append(cat)
78 db.save_category(cat)
79 for filename in filenames:
80 path_inner = os.path.join(dirpath, filename)
81 evt = _event_from_path(db, path_inner)
82 db.save_event(evt)
83
84 db.set_hidden_categories(all_cats[1:])
85
86 used_names = []
87 for cat in db.get_categories():
88 cat.color = _color_from_range(color_ranges[cat.name])
89 cat.name = get_unique_cat_name(os.path.basename(cat.name), used_names)
90 db.save_category(cat)
91 except Exception as e:
92 msg = _("Unable to read from filename '%s'.") % dir_path
93 whole_msg = "%s\n\n%s" % (msg, e)
94 print(whole_msg)
95 raise TimelineIOError(whole_msg)
96
97
99 cat_name = name
100 if cat_name in used_names:
101 i = 1
102 cat_name = "%s(%d)" % (name, i)
103 while cat_name in used_names:
104 i += 1
105 cat_name = "%s(%d)" % (name, i)
106 used_names.append(cat_name)
107 return cat_name
108
109
111 stat = os.stat(file_path)
112
113
114
115
116 dt = datetime.fromtimestamp(int(stat.st_mtime))
117 start_time = GregorianDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second).to_time()
118 end_time = start_time
119 if start_time > end_time:
120 start_time, end_time = end_time, start_time
121 text = os.path.basename(file_path)
122 category = _category_from_path(db, file_path)
123 evt = Event().update(start_time, end_time, text, category)
124 return evt
125
126
128 for cat in db.get_categories():
129 if cat.name == os.path.dirname(file_path):
130 return cat
131 return None
132
133
135 (rstart, _, b) = color_range
136 (r, g, b) = colorsys.hsv_to_rgb(rstart, b, 1)
137 return (r * 255, g * 255, b * 255)
138