Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Playlist/PlaylistController.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ static inline BOOL IsRepeatOneSet(void) {

// Private Methods
- (void)commitPersistentStore;
- (void)commitPersistentStoreAsync;
- (void)updateTotalTime;
- (void)updatePlaylistIndexes;
- (IBAction)stopAfterCurrent:(id _Nullable)sender;
Expand Down
72 changes: 62 additions & 10 deletions Playlist/PlaylistController.m
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,16 @@ - (void)commitPersistentStore {
}];
}

- (void)commitPersistentStoreAsync {
[self.persistentContainer.viewContext performBlock:^{
NSError *error = nil;
[self.persistentContainer.viewContext save:&error];
if(error) {
ALog(@"Error committing playlist storage: %@", [error localizedDescription]);
}
}];
}

- (void)updatePlayCountForTrack:(PlaylistEntry *)pe {
if(!pe || pe.deLeted || pe.countAdded) return;
pe.countAdded = YES;
Expand Down Expand Up @@ -1113,20 +1123,62 @@ - (void)trashObjectsAtArrangedObjectIndexes:(NSIndexSet *)indexes {

[super removeObjectsAtArrangedObjectIndexes:indexes];

[self commitPersistentStore];

if([self shuffle] != ShuffleOff) [self resetShuffleList];

[playbackController playlistDidChange:self];

// Collect file URLs before dispatching to background, since PlaylistEntry
// is a CoreData managed object and must not be accessed off its context queue.
NSMutableArray<NSDictionary *> *trashWork = [NSMutableArray array];
for(PlaylistEntry *pe in objects) {
if([pe.url isFileURL]) {
NSURL *removed = nil;
NSError *error = nil;
[[NSFileManager defaultManager] trashItemAtURL:pe.url resultingItemURL:&removed error:&error];
pe.trashUrl = removed;
[trashWork addObject:@{
@"url": pe.url,
@"objectID": pe.objectID
}];
}
}

if([trashWork count] > 0) {
NSPersistentContainer *container = self.persistentContainer;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSMutableDictionary<NSManagedObjectID *, NSURL *> *trashedURLs = [NSMutableDictionary dictionary];

for(NSDictionary *item in trashWork) {
NSURL *fileURL = item[@"url"];
NSManagedObjectID *objectID = item[@"objectID"];
NSURL *removed = nil;
NSError *error = nil;
[[NSFileManager defaultManager] trashItemAtURL:fileURL resultingItemURL:&removed error:&error];
if(removed) {
trashedURLs[objectID] = removed;
}
if(error) {
ALog(@"Error trashing file %@: %@", fileURL, [error localizedDescription]);
}
}

// Update CoreData on its context queue and persist everything
[container.viewContext performBlock:^{
for(NSManagedObjectID *objectID in trashedURLs) {
NSError *error = nil;
PlaylistEntry *pe = (PlaylistEntry *)[container.viewContext existingObjectWithID:objectID error:&error];
if(pe && !error) {
pe.trashUrl = trashedURLs[objectID];
}
}

NSError *saveError = nil;
[container.viewContext save:&saveError];
if(saveError) {
ALog(@"Error saving trash URLs: %@", [saveError localizedDescription]);
}
}];
});
} else {
// No files to trash, but still need to persist the playlist changes
[self commitPersistentStore];
}
}

- (void)setSortDescriptors:(NSArray *)sortDescriptors {
Expand Down Expand Up @@ -1558,7 +1610,7 @@ - (void)addShuffledListToFront {
for(i = 0; i < [shuffleList count]; i++) {
[shuffleList[i] setShuffleIndex:i];
}
[self commitPersistentStore];
[self commitPersistentStoreAsync];
}

- (void)addShuffledListToBack {
Expand All @@ -1580,7 +1632,7 @@ - (void)addShuffledListToBack {
for(i = ([shuffleList count] - [newList count]); i < [shuffleList count]; i++) {
[shuffleList[i] setShuffleIndex:(int)i];
}
[self commitPersistentStore];
[self commitPersistentStoreAsync];
}

- (void)resetShuffleList {
Expand Down Expand Up @@ -1615,7 +1667,7 @@ - (void)resetShuffleList {
for(i = 0, j = [shuffleList count]; i < j; ++i) {
[shuffleList[i] setShuffleIndex:(int)i];
}
[self commitPersistentStore];
[self commitPersistentStoreAsync];
} else {
[shuffleList insertObject:currentEntry atIndex:0];
[currentEntry setShuffleIndex:0];
Expand All @@ -1631,7 +1683,7 @@ - (void)resetShuffleList {
[shuffleList[i] setShuffleIndex:(int)i];
}
}
[self commitPersistentStore];
[self commitPersistentStoreAsync];
}
}
}
Expand Down