removed unwanted bar now with waveforms, major updates

This commit is contained in:
Mark Gregory
2026-11-06 13:39:57 +00:00
parent e67acb8210
commit 2dc3c96ef3
6 changed files with 307 additions and 27 deletions
+65
View File
@@ -1822,6 +1822,7 @@ extension KJamsCloneTests {
let karaoke = try XCTUnwrap(model.library),dj = try XCTUnwrap(model.dj.library)
_ = try karaoke.add(title:"Karaoke only",audio:fixtures.appendingPathComponent("TestTrack.wav").path,cdg:nil)
try model.refresh();XCTAssertTrue(model.dj.songs.isEmpty)
model.dj.copyImportedMedia = true // Explicit managed-copy option; references are now the default.
model.dj.importFiles([root.appendingPathComponent("Input")])
for _ in 0..<200 { if !model.dj.importing { break };try await Task.sleep(nanoseconds:25_000_000) }
XCTAssertFalse(model.dj.importing);XCTAssertNil(model.dj.error)
@@ -2954,4 +2955,68 @@ extension KJamsCloneTests {
model.dj.storageProgress = nil
}
@MainActor func testDJReferenceImportsAvoidMediaCopiesAndRememberMode() async throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
defer { try? FileManager.default.removeItem(at:root) }
let fixture = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures/Demo.mp3"))
let system = DJSystem(storageURL:root)
XCTAssertFalse(system.copyImportedMedia)
system.importFiles([fixture])
for _ in 0..<300 where system.importing { try await Task.sleep(nanoseconds:20_000_000) }
XCTAssertNil(system.lastImportReport?.failure)
XCTAssertEqual(system.songs.first?.audio,fixture.standardizedFileURL.path)
XCTAssertTrue((try? FileManager.default.contentsOfDirectory(atPath:system.mediaDirectory.path))?.isEmpty ?? true)
XCTAssertEqual(try system.library?.mediaLocations().count,1)
system.copyImportedMedia = true
XCTAssertTrue(DJSystem(storageURL:root).copyImportedMedia)
}
func testDJCleanupNeverRemovesReferencedOriginalsAndRechecksItsPreview() throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
defer { try? FileManager.default.removeItem(at:root) }
let local = root.appendingPathComponent("DJ"),media = local.appendingPathComponent("Media"),waves = local.appendingPathComponent("Waveforms")
try FileManager.default.createDirectory(at:media,withIntermediateDirectories:true);try FileManager.default.createDirectory(at:waves,withIntermediateDirectories:true)
let database = local.appendingPathComponent("Library.sqlite"),db = try Library(url:database)
let fixture = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures/Demo.mp3"))
try Importer(media:media,waveformCache:waves).run([fixture],library:db,copyMedia:false)
let orphan = media.appendingPathComponent(String(repeating:"a",count:64)+".mp3")
let stale = waves.appendingPathComponent(String(repeating:"b",count:64)+".waveform")
let personal = media.appendingPathComponent("My Music.mp3")
try FileManager.default.copyItem(at:fixture,to:orphan);try FileManager.default.copyItem(at:fixture,to:personal)
try Data("stale cache".utf8).write(to:stale)
let plan = try DJLibraryMaintenance.cleanupPlan(database:database,root:local)
XCTAssertEqual(Set(plan.files.map{$0.url.lastPathComponent}),[orphan.lastPathComponent,stale.lastPathComponent])
_ = try db.add(title:"Now referenced",audio:orphan.path,cdg:nil)
var removed = [String]()
let result = try DJLibraryMaintenance.clean(plan,database:database,root:local,trash:{removed.append($0.lastPathComponent);try FileManager.default.removeItem(at:$0)})
XCTAssertEqual(removed,[stale.lastPathComponent]);XCTAssertEqual(result.skipped,1)
XCTAssertTrue(FileManager.default.fileExists(atPath:fixture.path));XCTAssertTrue(FileManager.default.fileExists(atPath:orphan.path));XCTAssertTrue(FileManager.default.fileExists(atPath:personal.path))
}
@MainActor func testDJClearLibraryKeepsSourceAndManagedFilesAndClearsQueue() async throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
defer { try? FileManager.default.removeItem(at:root) }
let system = DJSystem(storageURL:root)
let fixture = try XCTUnwrap(Bundle(for:Self.self).resourceURL?.appendingPathComponent("Fixtures/Demo.mp3"))
try Importer(media:system.mediaDirectory).run([fixture],library:try XCTUnwrap(system.library))
try system.refresh();let song = try XCTUnwrap(system.songs.first)
system.automix.enqueue([song]);system.toggleFavourite(song.id)
system.removeLibraryTracks([song.id])
for _ in 0..<300 where system.movingStorage { try await Task.sleep(nanoseconds:20_000_000) }
XCTAssertTrue(system.songs.isEmpty);XCTAssertTrue(system.automix.entries.isEmpty);XCTAssertTrue(system.favourites.isEmpty)
XCTAssertTrue(FileManager.default.fileExists(atPath:song.audio));XCTAssertTrue(FileManager.default.fileExists(atPath:fixture.path))
XCTAssertNil(system.storageProgress?.failure)
}
func testDJCleanupPreservesWaveformsWhileSourceDriveIsUnavailable() throws {
let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
defer { try? FileManager.default.removeItem(at:root) }
let waves = root.appendingPathComponent("Waveforms")
try FileManager.default.createDirectory(at:waves,withIntermediateDirectories:true)
let database = root.appendingPathComponent("Library.sqlite"),db = try Library(url:database)
_ = try db.add(title:"Offline",audio:root.appendingPathComponent("Offline/source.mp3").path,cdg:nil)
let cache = waves.appendingPathComponent(String(repeating:"c",count:64)+".waveform")
try Data("cached waveform".utf8).write(to:cache)
XCTAssertTrue(try DJLibraryMaintenance.cleanupPlan(database:database,root:root).files.isEmpty)
XCTAssertTrue(FileManager.default.fileExists(atPath:cache.path))
}
}