[vlc-commits] [Git][videolan/vlc][master] 5 commits: macosx: Add property to define if a library segment requires the media library

Steve Lhomme (@robUx4) gitlab at videolan.org
Fri Apr 10 14:51:49 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
6d3cf7ca by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Add property to define if a library segment requires the media library

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

- - - - -
10fba686 by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Disable library segments that have a hard dependency on the media library

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

- - - - -
b19257e6 by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Prevent selection of disabled segment on startup

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

- - - - -
180ba1af by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Initialise the status notifier view as hidden

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

- - - - -
f0b23ca5 by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Display warning if the media library module was not loaded

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

- - - - -


5 changed files:

- modules/gui/macosx/library/VLCLibraryController.m
- modules/gui/macosx/library/VLCLibrarySegment.h
- modules/gui/macosx/library/VLCLibrarySegment.m
- modules/gui/macosx/library/VLCLibraryWindowNavigationSidebarViewController.m
- modules/gui/macosx/views/VLCStatusNotifierView.m


Changes:

=====================================
modules/gui/macosx/library/VLCLibraryController.m
=====================================
@@ -56,8 +56,32 @@ typedef int (*folder_action_f)(vlc_medialibrary_t*, const char*);
         _p_libraryInstance = vlc_ml_instance_get(getIntf());
         if (!_p_libraryInstance) {
             msg_Info(getIntf(), "VLC runs without media library support");
+
+            NSUserDefaults * const defaults = NSUserDefaults.standardUserDefaults;
+            NSString * const suppressKey = @"VLCSuppressMediaLibraryFailedAlert";
+            if (![defaults boolForKey:suppressKey]) {
+                dispatch_async(dispatch_get_main_queue(), ^{
+                    NSAlert * const alert = [[NSAlert alloc] init];
+                    alert.messageText = _NS("Media Library Unavailable");
+                    alert.informativeText = _NS("The media library module could not be loaded. "
+                                                "Library features such as browsing your media "
+                                                "collection will not be available.");
+                    alert.alertStyle = NSAlertStyleWarning;
+                    [alert addButtonWithTitle:_NS("OK")];
+                    alert.showsSuppressionButton = YES;
+                    alert.suppressionButton.title = _NS("Do not show this message again");
+                    [alert runModal];
+                    if (alert.suppressionButton.state == NSControlStateValueOn) {
+                        [defaults setBool:YES forKey:suppressKey];
+                    }
+                });
+            }
+
             return self;
         }
+
+        // Reset suppression so the alert reappears if a future load fails.
+        [NSUserDefaults.standardUserDefaults removeObjectForKey:@"VLCSuppressMediaLibraryFailedAlert"];
         _libraryModel = [[VLCLibraryModel alloc] initWithLibrary:_p_libraryInstance];
         _unsorted = YES;
 


=====================================
modules/gui/macosx/library/VLCLibrarySegment.h
=====================================
@@ -64,6 +64,7 @@ typedef NS_ENUM(NSInteger, VLCLibrarySegmentType) {
 @property (readonly, nullable) Class libraryViewControllerClass;
 @property (readwrite) NSInteger viewMode;
 @property (readonly) NSUInteger toolbarDisplayFlags;
+ at property (readonly) BOOL mediaLibraryRequired;
 
 + (instancetype)segmentWithSegmentType:(VLCLibrarySegmentType)segmentType;
 + (instancetype)segmentForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem;


=====================================
modules/gui/macosx/library/VLCLibrarySegment.m
=====================================
@@ -100,6 +100,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
 @property (nullable) void (^internalSaveViewModePreference)(NSInteger);
 @property (nullable) NSInteger (^internalGetViewModePreference)(void);
 @property VLCLibraryWindowToolbarDisplayFlags internalToolbarDisplayFlags;
+ at property BOOL internalMediaLibraryRequired;
 
 - (instancetype)initWithSegmentType:(VLCLibrarySegmentType)segmentType;
 
@@ -146,6 +147,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"bw-home"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryHomeViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryHomeViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -184,6 +186,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"bw-home"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryFavoritesViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryFavoritesViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -226,6 +229,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-movie"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryVideoViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryVideoViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -260,6 +264,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-movie"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryVideoViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryVideoViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -298,6 +303,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-movie"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryVideoViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryVideoViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -342,6 +348,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -380,6 +387,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -418,6 +426,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -456,6 +465,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -494,6 +504,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -534,6 +545,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryPlaylistViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryPlaylistViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -572,6 +584,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"sidebar-movie"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryPlaylistViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryPlaylistViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -610,6 +623,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"NSListViewTemplate"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryPlaylistViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryPlaylistViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -657,6 +671,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"NSTouchBarTagIcon"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryGroupsViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryGroupsViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -695,6 +710,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
             self.internalDisplayImage = [NSImage imageNamed:@"NSTouchBarTagIcon"];
             self.internalDisplayImage.template = YES;
         }
+        self.internalMediaLibraryRequired = YES;
         self.internalLibraryViewControllerClass = VLCLibraryGroupsViewController.class;
         self.internalLibraryViewControllerCreator = ^{
             return [[VLCLibraryGroupsViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -1056,4 +1072,9 @@ NSArray<NSString *> *defaultBookmarkedLocations()
     return self.internalToolbarDisplayFlags;
 }
 
+- (BOOL)mediaLibraryRequired
+{
+    return self.internalMediaLibraryRequired;
+}
+
 @end


=====================================
modules/gui/macosx/library/VLCLibraryWindowNavigationSidebarViewController.m
=====================================
@@ -29,6 +29,10 @@
 #import "library/VLCLibraryWindow.h"
 #import "library/VLCLibraryWindowNavigationSidebarOutlineView.h"
 
+#import "library/VLCLibraryController.h"
+
+#import "main/VLCMain.h"
+
 #import "extensions/NSColor+VLCAdditions.h"
 #import "extensions/NSWindow+VLCAdditions.h"
 
@@ -311,6 +315,12 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
         return;
     }
 
+    VLCLibrarySegment * const segment = [VLCLibrarySegment segmentWithSegmentType:segmentType];
+    if (segment.mediaLibraryRequired &&
+        VLCMain.sharedInstance.libraryController.libraryModel == nil) {
+        segmentType = VLCLibraryBrowseSegmentType;
+    }
+
     self.libraryWindow.librarySegmentType = segmentType;
 
     if (segmentType == VLCLibraryMusicSegmentType) {
@@ -344,6 +354,18 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
         cellView.imageView.contentTintColor = NSColor.VLCAccentColor;
     }
 
+    NSTreeNode * const treeNode = (NSTreeNode *)item;
+    VLCLibrarySegment * const segment = (VLCLibrarySegment *)treeNode.representedObject;
+    const BOOL mediaLibraryUnavailable =
+        segment.mediaLibraryRequired &&
+        VLCMain.sharedInstance.libraryController.libraryModel == nil;
+    if (mediaLibraryUnavailable) {
+        cellView.textField.textColor = NSColor.tertiaryLabelColor;
+        if (@available(macOS 10.14, *)) {
+            cellView.imageView.contentTintColor = NSColor.tertiaryLabelColor;
+        }
+    }
+
     return cellView;
 }
 
@@ -358,6 +380,13 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
         if (segment.segmentType == VLCLibraryHeaderSegmentType) {
             return NSIndexSet.indexSet;
         }
+
+        const BOOL mediaLibraryUnavailable =
+            segment.mediaLibraryRequired &&
+            VLCMain.sharedInstance.libraryController.libraryModel == nil;
+        if (mediaLibraryUnavailable) {
+            return [outlineView selectedRowIndexes];
+        }
     }
 
     return proposedSelectionIndexes;


=====================================
modules/gui/macosx/views/VLCStatusNotifierView.m
=====================================
@@ -65,6 +65,8 @@ NSString * const VLCMessageTimeoutTimerUserInfoMessageKey = @"VLCMessageTimeoutT
     self.label.stringValue = _NS("Idle");
     self.progressIndicator.hidden = YES;
     self.infoImageView.hidden = NO;
+    self.hidden = YES;
+    self.alphaValue = 0;
 
     NSNotificationCenter * const defaultCenter = NSNotificationCenter.defaultCenter;
     [defaultCenter addObserver:self selector:@selector(updateStatus:) name:nil object:nil];



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/a02b93fd0bb43d7d42c5a9e9486f3486781ae976...f0b23ca5e3a4d7b86cba39bb4710a623aa3d70aa

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




More information about the vlc-commits mailing list