MixBoardApp.swift 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import SwiftData
  2. import SwiftUI
  3. /// MixBoard iOS — A mobile music player and mix preparation tool.
  4. /// Listen to your own MP3/FLAC files, build playlists, and sync them to the Mac app for DAW export.
  5. @main
  6. struct MixBoardApp: App {
  7. @State private var playerVM = PlayerViewModel()
  8. @State private var playlistVM = PlaylistViewModel()
  9. @StateObject private var libraryManager = LibraryManager()
  10. @StateObject private var theme = AppTheme()
  11. @StateObject private var syncManager = SyncManager()
  12. let modelContainer: ModelContainer
  13. init() {
  14. // One-time database reset to clear corrupted Track/p2 data + add cloud fields
  15. let needsReset = !UserDefaults.standard.bool(forKey: "dbResetV7")
  16. if needsReset {
  17. // Nuclear option: find and delete ALL .store and .sqlite files in the app container
  18. let fm = FileManager.default
  19. let home = fm.urls(for: .libraryDirectory, in: .userDomainMask).first!
  20. .deletingLastPathComponent() // gets the app container root
  21. if let enumerator = fm.enumerator(at: home, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles]) {
  22. for case let fileURL as URL in enumerator {
  23. let name = fileURL.lastPathComponent
  24. if name == "default.store" || name == "default.store-shm" || name == "default.store-wal"
  25. || name.hasSuffix(".sqlite") || name.hasSuffix(".sqlite-shm") || name.hasSuffix(".sqlite-wal") {
  26. try? fm.removeItem(at: fileURL)
  27. }
  28. }
  29. }
  30. UserDefaults.standard.set(true, forKey: "dbResetV7")
  31. }
  32. do {
  33. modelContainer = try ModelContainer(for: Track.self, CuePoint.self, Playlist.self, PlaylistEntry.self, PlaylistFolder.self)
  34. } catch {
  35. fatalError("Failed to create ModelContainer: \(error)")
  36. }
  37. }
  38. var body: some Scene {
  39. WindowGroup {
  40. ContentView()
  41. .environment(playerVM)
  42. .environment(playlistVM)
  43. .environmentObject(libraryManager)
  44. .environmentObject(theme)
  45. .environmentObject(syncManager)
  46. .preferredColorScheme(theme.preferredColorScheme)
  47. .onAppear {
  48. MediaKeyHandler.shared.register(playerVM: playerVM)
  49. }
  50. }
  51. .modelContainer(modelContainer)
  52. }
  53. }