1
- import datetime as dt
1
+ from datetime import datetime as dt
2
2
from collections .abc import Iterator
3
3
from dataclasses import dataclass , field
4
4
from pathlib import Path
@@ -36,11 +36,15 @@ class RefreshDirTracker:
36
36
def files_count (self ) -> int :
37
37
return len (self .files_not_in_library )
38
38
39
+ < << << << HEAD :src / tagstudio / core / utils / refresh_dir .py
39
40
# moving get_file_times to library to avoid circular import
41
+ == == == =
42
+ >> >> >> > 8 f17c362203a368c5860599b75c2e89e6c8c1fc5 :tagstudio / src / core / utils / refresh_dir .py
40
43
def get_file_times (self , file_path : Path ):
41
44
"""Get the creation and modification times of a file."""
42
45
stat = file_path .stat ()
43
46
system = platform .system ()
47
+ < << << << HEAD :src / tagstudio / core / utils / refresh_dir .py
44
48
45
49
# st_birthtime on Windows and Mac, st_ctime on Linux.
46
50
if system in ['Windows' , 'Darwin' ]: # Windows & macOS
@@ -49,11 +53,25 @@ def get_file_times(self, file_path: Path):
49
53
date_created = dt .datetime .fromtimestamp (stat .st_ctime ) # Linux lacks st_birthtime
50
54
51
55
date_modified = dt .datetime .fromtimestamp (stat .st_mtime )
56
+ == == == =
57
+ if system == 'Windows' : # Windows
58
+ date_created = dt .fromtimestamp (stat .st_ctime , dt .timezone .utc )
59
+ elif system == 'Darwin' : # macOS
60
+ date_created = dt .fromtimestamp (stat .st_birthtime , dt .timezone .utc )
61
+ else : # Linux and other systems
62
+ try :
63
+ date_created = dt .fromtimestamp (stat .st_birthtime , dt .timezone .utc )
64
+ except AttributeError :
65
+ # st_birthtime is not available on some Linux filesystems
66
+ date_created = dt .fromtimestamp (stat .st_ctime , dt .timezone .utc )
67
+ date_modified = dt .fromtimestamp (stat .st_mtime , dt .timezone .utc )
68
+ >> >> >> > 8 f17c362203a368c5860599b75c2e89e6c8c1fc5 :tagstudio / src / core / utils / refresh_dir .py
52
69
return date_created , date_modified
53
70
54
71
def save_new_files (self ):
55
72
"""Save the list of files that are not in the library."""
56
73
if self .files_not_in_library :
74
+ < << << << HEAD :src / tagstudio / core / utils / refresh_dir .py
57
75
entries = [
58
76
Entry (
59
77
path = entry_path ,
@@ -67,6 +85,23 @@ def save_new_files(self):
67
85
if (date_created := self .get_file_times (entry_path )[0 ]) is not None
68
86
and (date_modified := self .get_file_times (entry_path )[1 ]) is not None
69
87
]
88
+ == == == =
89
+ entries = []
90
+ for entry_path in self .files_not_in_library :
91
+ date_created , date_modified = self .get_file_times (entry_path )
92
+ if date_created is None or date_modified is None :
93
+ continue # Skip files that could not be processed
94
+ entries .append (
95
+ Entry (
96
+ path = entry_path ,
97
+ folder = self .library .folder ,
98
+ fields = [],
99
+ date_added = dt .now (),
100
+ date_created = dt .now (),
101
+ date_modified = dt .now (),
102
+ )
103
+ )
104
+ > >> >> >> 8 f17c362203a368c5860599b75c2e89e6c8c1fc5 :tagstudio / src / core / utils / refresh_dir .py
70
105
self .library .add_entries (entries )
71
106
72
107
self .files_not_in_library = []
@@ -117,7 +152,19 @@ def refresh_dir(self, lib_path: Path) -> Iterator[int]:
117
152
relative_path = f .relative_to (lib_path )
118
153
# TODO - load these in batch somehow
119
154
if not self .library .has_path_entry (relative_path ):
155
+ < << << << HEAD :src / tagstudio / core / utils / refresh_dir .py
120
156
self .files_not_in_library .append (f )
157
+ == == == =
158
+ self .files_not_in_library .append (relative_path )
159
+ else :
160
+ # Update date_modified for existing entries if it has changed
161
+ entry = self .library .get_entry_by_path (relative_path )
162
+ if entry :
163
+ date_modified = dt .fromtimestamp (f .stat ().st_mtime , dt .timezone .utc )
164
+ if entry .date_modified != date_modified :
165
+ entry .date_modified = date_modified
166
+ self .library .update_entry (entry )
167
+ >> >> >> > 8 f17c362203a368c5860599b75c2e89e6c8c1fc5 :tagstudio / src / core / utils / refresh_dir .py
121
168
122
169
end_time_total = time ()
123
170
yield dir_file_count
0 commit comments