removed unwanted bar now with waveforms, major updates
This commit is contained in:
@@ -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))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user