public void StartRebuild() { IsRebuilding = true; State = MediaDBState.Loading; Console.WriteLine($"[MediaDB] Starting media database rebuild!"); ScannerTokenSource?.Cancel(); ScannerTask?.Wait(); CloseDatabase(); DeleteDatabaseFile(); CreateDatabaseFile(); OpenDatabase(); IsRebuilding = false; StartMediaScan(); }
//entry point for media scan private void MediaScan(CancellationToken token) { State = MediaDBState.Scanning; int scanRetryCount = 0; //run media scan while (State != MediaDBState.Ready && scanRetryCount < UserConfig.Instance.MediaScannerRetryCount) { try { MediaScanner.Scan(DBContext, token); State = MediaDBState.Ready; } catch (Exception ex) { if (ex is TaskCanceledException || ex is OperationCanceledException) { Console.WriteLine("[MediaDB] Media scanner aborted!"); State = MediaDBState.Loading; break; } else { Console.Error.WriteLine("[MediaDB] Media scanner failed!"); Console.Error.WriteLine(ex); State = MediaDBState.Error; scanRetryCount++; } } } //load playlists try { LoadPlaylists(token); } catch (Exception ex) { if (ex is TaskCanceledException || ex is OperationCanceledException) { Console.WriteLine("[MediaDB] Playlist loading aborted!"); State = MediaDBState.Loading; } else { Console.Error.WriteLine("[MediaDB] Playlist loading failed!"); Console.Error.WriteLine(ex); State = MediaDBState.Error; } } //trim cache try { MediaTranscoder.TrimCache(); } catch (Exception ex) { Console.Error.WriteLine("[MediaDB] Media cache trim failed!"); } //needed? safe? IsRebuilding = false; ScannerTask = null; ScannerTokenSource = null; }