[vlc-commits] [Git][videolan/vlc][master] 2 commits: macosx: Add ability for library controller to create playlists from media library item array

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Sat Aug 30 13:24:02 UTC 2025



Felix Paul Kühne pushed to branch master at VideoLAN / VLC


Commits:
a5426c76 by Claudio Cambra at 2025-08-30T13:11:13+00:00
macosx: Add ability for library controller to create playlists from media library item array

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
5906e4be by Claudio Cambra at 2025-08-30T13:11:13+00:00
macosx: Add menu item to create playlist from selection in library menu

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -


3 changed files:

- modules/gui/macosx/library/VLCLibraryController.h
- modules/gui/macosx/library/VLCLibraryController.m
- modules/gui/macosx/library/VLCLibraryMenuController.m


Changes:

=====================================
modules/gui/macosx/library/VLCLibraryController.h
=====================================
@@ -51,6 +51,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (void)showCreatePlaylistDialogForPlayQueue;
 - (void)showCreatePlaylistDialogForPlayQueueItems:(NSArray<VLCPlayQueueItem *> *)items;
+- (void)showCreatePlaylistDialogForMediaItems:(NSArray<VLCMediaLibraryMediaItem *> *)mediaItems;
 
 /**
  * Sort the entire library representation based on:


=====================================
modules/gui/macosx/library/VLCLibraryController.m
=====================================
@@ -299,6 +299,73 @@ typedef int (*folder_action_f)(vlc_medialibrary_t*, const char*);
     return YES;
 }
 
+- (BOOL)createPlaylistWithName:(NSString *)playlistName fromMediaItems:(NSArray<VLCMediaLibraryMediaItem *> *)mediaItems
+{
+    if (!_p_libraryInstance || !playlistName || playlistName.length == 0) {
+        return NO;
+    }
+    
+    vlc_ml_playlist_t * const playlist = vlc_ml_playlist_create(_p_libraryInstance, playlistName.UTF8String);
+    if (!playlist) {
+        msg_Err(getIntf(), "Failed to create playlist with name: %s", playlistName.UTF8String);
+        return NO;
+    }
+    
+    const int64_t playlistId = playlist->i_id;
+    vlc_ml_playlist_release(playlist);
+    
+    for (VLCMediaLibraryMediaItem * const mediaItem in mediaItems) {
+        const int64_t mediaId = mediaItem.libraryID;
+        const int result = vlc_ml_playlist_append(_p_libraryInstance, playlistId, &mediaId, 1);
+        if (result != VLC_SUCCESS) {
+            msg_Warn(getIntf(), "Failed to add media library item %lld to playlist", mediaItem.libraryID);
+        }
+    }
+    
+    return YES;
+}
+
+- (void)showCreatePlaylistDialogForMediaItems:(NSArray<VLCMediaLibraryMediaItem *> *)mediaItems
+{
+    if (!mediaItems || mediaItems.count == 0) {
+        return;
+    }
+    
+    NSAlert * const alert = [[NSAlert alloc] init];
+    alert.messageText = _NS("Create New Playlist");
+    alert.informativeText = _NS("Enter a name for the new playlist:");
+    [alert addButtonWithTitle:_NS("Create")];
+    [alert addButtonWithTitle:_NS("Cancel")];
+    
+    NSTextField * const input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 300, 24)];
+    input.placeholderString = _NS("Playlist Name");
+    alert.accessoryView = input;
+    
+    alert.window.initialFirstResponder = input;
+    
+    const NSModalResponse response = [alert runModal];
+    if (response != NSAlertFirstButtonReturn) {
+        return;
+    }
+    
+    NSString * const playlistName = input.stringValue;
+    if (playlistName.length == 0) {
+        return;
+    }
+    
+    const BOOL success = [self createPlaylistWithName:playlistName fromMediaItems:mediaItems];
+    if (success) {
+        return;
+    }
+    
+    NSAlert * const errorAlert = [[NSAlert alloc] init];
+    errorAlert.messageText = _NS("Failed to Create Playlist");
+    errorAlert.informativeText = _NS("The playlist could not be created. Please try again.");
+    errorAlert.alertStyle = NSAlertStyleWarning;
+    [errorAlert addButtonWithTitle:_NS("OK")];
+    [errorAlert runModal];
+}
+
 - (void)sortByCriteria:(enum vlc_ml_sorting_criteria_t)sortCriteria andDescending:(bool)descending
 {
     _unsorted = NO;


=====================================
modules/gui/macosx/library/VLCLibraryMenuController.m
=====================================
@@ -99,10 +99,14 @@
     _favoriteItem = [[NSMenuItem alloc] initWithTitle:_NS("Toggle Favorite") action:@selector(toggleFavorite:) keyEquivalent:@""];
     self.favoriteItem.target = self;
 
+    NSMenuItem *createPlaylistItem = [[NSMenuItem alloc] initWithTitle:_NS("Create Playlist from Selection") action:@selector(createPlaylistFromSelection:) keyEquivalent:@""];
+    createPlaylistItem.target = self;
+
     _libraryMenu = [[NSMenu alloc] initWithTitle:@""];
     [_libraryMenu addMenuItemsFromArray:@[
         playItem,
         appendItem,
+        createPlaylistItem,
         self.favoriteItem,
         bookmarkItem,
         revealItem,
@@ -116,6 +120,7 @@
     _mediaItemRequiringMenuItems = [NSHashTable weakObjectsHashTable];
     [_mediaItemRequiringMenuItems addObject:playItem];
     [_mediaItemRequiringMenuItems addObject:appendItem];
+    [_mediaItemRequiringMenuItems addObject:createPlaylistItem];
     [_mediaItemRequiringMenuItems addObject:self.favoriteItem];
     [_mediaItemRequiringMenuItems addObject:revealItem];
     [_mediaItemRequiringMenuItems addObject:_deleteItem];
@@ -273,6 +278,22 @@
     }
 }
 
+- (void)createPlaylistFromSelection:(id)sender
+{
+    if (self.representedItems == nil || self.representedItems.count == 0) {
+        return;
+    }
+    
+    NSMutableArray<VLCMediaLibraryMediaItem *> * const mediaItems = [NSMutableArray arrayWithCapacity:self.representedItems.count];
+    for (VLCLibraryRepresentedItem * const representedItem in self.representedItems) {
+        [mediaItems addObjectsFromArray:representedItem.item.mediaItems];
+    }
+    
+    if (mediaItems.count > 0) {
+        [VLCMain.sharedInstance.libraryController showCreatePlaylistDialogForMediaItems:mediaItems];
+    }
+}
+
 - (void)addMedia:(id)sender
 {
     NSOpenPanel *openPanel = [NSOpenPanel openPanel];



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/9e2f44e11ac703d73eb0787a396909280f8f21e4...5906e4becb28d5c265896ca3001272ddc20df8fb

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/9e2f44e11ac703d73eb0787a396909280f8f21e4...5906e4becb28d5c265896ca3001272ddc20df8fb
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list