@@ -39,6 +39,7 @@ public MainViewModel()
3939 RefreshCacheCommand = new AsyncRelayCommand ( RefreshCacheAsync ) ;
4040
4141 LoadDirectories ( ) ;
42+ SetupWatchers ( ) ;
4243 if ( File . Exists ( "player.txt" ) ) customPlayerPath = File . ReadAllText ( "player.txt" ) ;
4344 _ = InitializeDataAsync ( ) ;
4445 }
@@ -202,6 +203,51 @@ private async void LoadMetadata(string path)
202203 public IAsyncRelayCommand RefreshCacheCommand { get ; }
203204
204205 private List < VideoItem > _allDatabaseItems = new List < VideoItem > ( ) ;
206+ private List < FileSystemWatcher > _watchers = new List < FileSystemWatcher > ( ) ;
207+ private System . Windows . Threading . DispatcherTimer _debounceTimer ;
208+
209+ private void SetupWatchers ( )
210+ {
211+ foreach ( var w in _watchers )
212+ {
213+ w . EnableRaisingEvents = false ;
214+ w . Dispose ( ) ;
215+ }
216+ _watchers . Clear ( ) ;
217+
218+ foreach ( var dir in Directories )
219+ {
220+ if ( Directory . Exists ( dir ) )
221+ {
222+ var watcher = new FileSystemWatcher ( dir ) ;
223+ watcher . IncludeSubdirectories = false ;
224+ watcher . Created += Watcher_Changed ;
225+ watcher . Deleted += Watcher_Changed ;
226+ watcher . Renamed += Watcher_Changed ;
227+ watcher . EnableRaisingEvents = true ;
228+ _watchers . Add ( watcher ) ;
229+ }
230+ }
231+ }
232+
233+ private void Watcher_Changed ( object sender , FileSystemEventArgs e )
234+ {
235+ Application . Current . Dispatcher . Invoke ( ( ) =>
236+ {
237+ if ( _debounceTimer == null )
238+ {
239+ _debounceTimer = new System . Windows . Threading . DispatcherTimer ( ) ;
240+ _debounceTimer . Interval = TimeSpan . FromSeconds ( 1 ) ;
241+ _debounceTimer . Tick += async ( s , args ) =>
242+ {
243+ _debounceTimer . Stop ( ) ;
244+ await RefreshFromDiskAsync ( ) ;
245+ } ;
246+ }
247+ _debounceTimer . Stop ( ) ;
248+ _debounceTimer . Start ( ) ;
249+ } ) ;
250+ }
205251 private int searchHistoryIndex = - 1 ;
206252
207253 private void LoadDirectories ( )
@@ -224,6 +270,7 @@ private async Task AddDirectory(string path)
224270 {
225271 Directories . Add ( path ) ;
226272 SaveDirectories ( ) ;
273+ SetupWatchers ( ) ;
227274 await RefreshFromDiskAsync ( ) ;
228275 }
229276 }
@@ -235,6 +282,7 @@ private async Task DeleteSelectedDirectory()
235282 _dbManager . RemoveDirectoryItems ( SelectedDirectory ) ;
236283 Directories . Remove ( SelectedDirectory ) ;
237284 SaveDirectories ( ) ;
285+ SetupWatchers ( ) ;
238286 await LoadFromDatabaseAsync ( ) ;
239287 }
240288 }
@@ -276,13 +324,18 @@ private async Task RefreshFromDiskAsync()
276324 {
277325 IsLoading = true ;
278326 var currentFilesList = new List < VideoItem > ( ) ;
327+ var scannedRoots = new HashSet < string > ( StringComparer . OrdinalIgnoreCase ) ;
279328
280329 await Task . Run ( ( ) =>
281330 {
282331 foreach ( var dir in Directories )
283332 {
284333 if ( Directory . Exists ( dir ) )
285334 {
335+ string safeDir = dir ;
336+ if ( ! safeDir . EndsWith ( "\\ " ) ) safeDir += "\\ " ;
337+ scannedRoots . Add ( safeDir ) ;
338+
286339 var di = new DirectoryInfo ( dir ) ;
287340 try {
288341 foreach ( var fi in di . EnumerateFiles ( "*.*" ) )
@@ -297,7 +350,7 @@ await Task.Run(() =>
297350 } catch { }
298351 }
299352 }
300- _dbManager . InsertOrUpdateItems ( currentFilesList ) ;
353+ _dbManager . SyncDiskItems ( currentFilesList , scannedRoots ) ;
301354 } ) ;
302355
303356 await LoadFromDatabaseAsync ( ) ;
0 commit comments