[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