[vlc-commits] [Git][videolan/vlc][master] 2 commits: macosx: Add method to get media library item from current player item

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Thu Jul 3 05:00:57 UTC 2025



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


Commits:
531bec49 by Claudio Cambra at 2025-07-02T13:54:55+00:00
macosx: Add method to get media library item from current player item

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

- - - - -
0659b095 by Claudio Cambra at 2025-07-02T13:54:55+00:00
macosx: Add favorite toggle button to main library window controls bar

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

- - - - -


8 changed files:

- modules/gui/macosx/UI/VLCLibraryWindow.xib
- modules/gui/macosx/library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m
- modules/gui/macosx/library/VLCLibraryDataTypes.h
- modules/gui/macosx/library/VLCLibraryDataTypes.m
- modules/gui/macosx/playqueue/VLCPlayerController.h
- modules/gui/macosx/playqueue/VLCPlayerController.m
- modules/gui/macosx/windows/controlsbar/VLCMainWindowControlsBar.h
- modules/gui/macosx/windows/controlsbar/VLCMainWindowControlsBar.m


Changes:

=====================================
modules/gui/macosx/UI/VLCLibraryWindow.xib
=====================================
@@ -258,16 +258,29 @@
                                             <constraint firstItem="zOB-QJ-TUy" firstAttribute="leading" secondItem="SM6-nx-NKD" secondAttribute="trailing" constant="4" id="wML-fX-wuF"/>
                                         </constraints>
                                     </customView>
-                                    <stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="S1K-Lp-DVO">
+                                    <stackView distribution="fillEqually" orientation="horizontal" alignment="centerY" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="S1K-Lp-DVO">
                                         <rect key="frame" x="692" y="4" width="188" height="40"/>
                                         <subviews>
+                                            <button horizontalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="Bt8-jQ-hUr">
+                                                <rect key="frame" x="0.0" y="13.5" width="16" height="14"/>
+                                                <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="heart" catalog="system" imagePosition="only" alignment="center" alternateImage="heart.fill" imageScaling="proportionallyUpOrDown" inset="2" id="Y7l-9o-1h7">
+                                                    <behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
+                                                    <font key="font" metaFont="system"/>
+                                                </buttonCell>
+                                                <constraints>
+                                                    <constraint firstAttribute="width" constant="16" id="cLo-3L-cvG"/>
+                                                </constraints>
+                                                <connections>
+                                                    <action selector="toggleFavorite:" target="Uzf-Tf-H8x" id="5n0-gl-qS6"/>
+                                                </connections>
+                                            </button>
                                             <customView translatesAutoresizingMaskIntoConstraints="NO" id="i42-vp-ih7">
-                                                <rect key="frame" x="0.0" y="0.0" width="164" height="40"/>
+                                                <rect key="frame" x="21" y="0.0" width="146" height="40"/>
                                                 <subviews>
                                                     <slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="noz-yJ-oH4" customClass="VLCVolumeSlider">
-                                                        <rect key="frame" x="56" y="12" width="52" height="17"/>
+                                                        <rect key="frame" x="6" y="12" width="126" height="17"/>
                                                         <constraints>
-                                                            <constraint firstAttribute="width" constant="48" id="EM2-Hh-lqK"/>
+                                                            <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="48" id="EM2-Hh-lqK"/>
                                                         </constraints>
                                                         <sliderCell key="cell" controlSize="mini" continuous="YES" alignment="left" maxValue="512" doubleValue="251.95348837209303" tickMarkPosition="above" sliderType="linear" id="IIu-VN-bEm" customClass="VLCVolumeSliderCell"/>
                                                         <connections>
@@ -306,10 +319,11 @@
                                                 <constraints>
                                                     <constraint firstItem="75c-FF-mgb" firstAttribute="leading" secondItem="noz-yJ-oH4" secondAttribute="trailing" constant="4" id="2Ot-bs-v7Q"/>
                                                     <constraint firstItem="75c-FF-mgb" firstAttribute="centerY" secondItem="noz-yJ-oH4" secondAttribute="centerY" id="9Oz-v1-KwH"/>
-                                                    <constraint firstItem="noz-yJ-oH4" firstAttribute="centerX" secondItem="i42-vp-ih7" secondAttribute="centerX" id="KPm-J8-zuC"/>
                                                     <constraint firstItem="IAy-58-UPp" firstAttribute="centerY" secondItem="noz-yJ-oH4" secondAttribute="centerY" id="PGM-ud-0Wk"/>
+                                                    <constraint firstAttribute="trailing" secondItem="75c-FF-mgb" secondAttribute="trailing" id="TKa-Ng-Pti"/>
+                                                    <constraint firstItem="IAy-58-UPp" firstAttribute="leading" secondItem="i42-vp-ih7" secondAttribute="leading" id="g8p-sN-yd5"/>
                                                     <constraint firstItem="noz-yJ-oH4" firstAttribute="centerY" secondItem="i42-vp-ih7" secondAttribute="centerY" id="jfV-of-CoU"/>
-                                                    <constraint firstItem="IAy-58-UPp" firstAttribute="trailing" secondItem="noz-yJ-oH4" secondAttribute="leading" constant="-4" id="nMU-2d-pO9"/>
+                                                    <constraint firstItem="IAy-58-UPp" firstAttribute="trailing" secondItem="noz-yJ-oH4" secondAttribute="leading" constant="4" id="nMU-2d-pO9"/>
                                                 </constraints>
                                             </customView>
                                             <button translatesAutoresizingMaskIntoConstraints="NO" id="dwM-Uz-pAw" userLabel="Full Screen Button">
@@ -330,10 +344,12 @@
                                         <visibilityPriorities>
                                             <integer value="1000"/>
                                             <integer value="1000"/>
+                                            <integer value="1000"/>
                                         </visibilityPriorities>
                                         <customSpacing>
                                             <real value="3.4028234663852886e+38"/>
                                             <real value="3.4028234663852886e+38"/>
+                                            <real value="3.4028234663852886e+38"/>
                                         </customSpacing>
                                     </stackView>
                                 </subviews>
@@ -593,6 +609,7 @@
                 <outlet property="backwardButton" destination="jGc-Xw-GYI" id="0AG-44-SN3"/>
                 <outlet property="bottomBarView" destination="vUy-jt-gjY" id="WqX-SW-mpv"/>
                 <outlet property="dropView" destination="MQH-bI-Zdh" id="Wz9-NB-wtE"/>
+                <outlet property="favoriteButton" destination="Bt8-jQ-hUr" id="Ouv-od-xpR"/>
                 <outlet property="forwardButton" destination="dPD-MZ-5oT" id="btH-v5-s7F"/>
                 <outlet property="fullscreenButton" destination="dwM-Uz-pAw" id="gXA-WS-Gig"/>
                 <outlet property="jumpBackwardButton" destination="72A-6S-lpR" id="YRk-DB-K28"/>
@@ -1670,6 +1687,8 @@
         <image name="arrow.up.arrow.down" catalog="system" width="18" height="15"/>
         <image name="fullscreen-one-button" width="29" height="23"/>
         <image name="fullscreen-one-button-pressed" width="29" height="23"/>
+        <image name="heart" catalog="system" width="16" height="14"/>
+        <image name="heart.fill" catalog="system" width="16" height="14"/>
         <image name="libraryPlay" width="64" height="64"/>
         <image name="list.triangle" catalog="system" width="16" height="12"/>
         <image name="sidebar.left" catalog="system" width="18" height="14"/>


=====================================
modules/gui/macosx/library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m
=====================================
@@ -233,20 +233,12 @@ NSCollectionViewSupplementaryElementKind const VLCLibraryCollectionViewMediaItem
 - (IBAction)favoriteAction:(id)sender
 {
     VLCMediaLibraryMediaItem * const mediaItem = self.representedItem.item;
-    const int64_t mediaItemId = mediaItem.libraryID;
-    const bool b_favorite = mediaItem.favorited;
-    vlc_medialibrary_t * const p_ml = vlc_ml_instance_get(getIntf());
-    const int result = vlc_ml_media_set_favorite(p_ml, mediaItemId, !b_favorite);
-
-    if (result == VLC_SUCCESS) {
+    if ([mediaItem toggleFavorite] == VLC_SUCCESS) {
         VLCMediaLibraryMediaItem * const updatedItem =
-            [VLCMediaLibraryMediaItem mediaItemForLibraryID:mediaItemId];
+            [VLCMediaLibraryMediaItem mediaItemForLibraryID:mediaItem.libraryID];
         self.representedItem =
             [[VLCLibraryRepresentedItem alloc] initWithItem:updatedItem
                                                  parentType:self.representedItem.parentType];
-
-    } else {
-        NSLog(@"Unable to set favorite status of media item: %lli", mediaItemId);
     }
 }
 


=====================================
modules/gui/macosx/library/VLCLibraryDataTypes.h
=====================================
@@ -335,6 +335,8 @@ typedef NS_ENUM(NSUInteger, VLCMediaLibraryParentGroupType) {
 @property (readonly) int trackNumber;
 @property (readonly) int discNumber;
 
+- (int)toggleFavorite;
+
 @end
 
 @interface VLCMediaLibraryEntryPoint : NSObject


=====================================
modules/gui/macosx/library/VLCLibraryDataTypes.m
=====================================
@@ -1576,6 +1576,19 @@ static NSString *genreArrayDisplayString(NSArray<VLCMediaLibraryGenre *> * const
     return self.internalLabels;
 }
 
+- (int)toggleFavorite
+{
+    const int64_t mediaItemId = self.libraryID;
+    const bool b_favorite = self.favorited;
+    vlc_medialibrary_t * const p_ml = vlc_ml_instance_get(getIntf());
+    const int result = vlc_ml_media_set_favorite(p_ml, mediaItemId, !b_favorite);
+    if (result == VLC_SUCCESS)
+        _favorited = !_favorited;
+    else
+        NSLog(@"Unable to set favorite status of media item: %lli", mediaItemId);
+    return result;
+}
+
 @end
 
 @implementation VLCMediaLibraryShow


=====================================
modules/gui/macosx/playqueue/VLCPlayerController.h
=====================================
@@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN
 @class VLCPlayerTitle;
 @class VLCProgramMetaData;
 @class VLCInputItem;
+ at class VLCMediaLibraryMediaItem;
 
 extern NSString *VLCPlayerElementaryStreamID;
 extern NSString *VLCTick;
@@ -318,6 +319,12 @@ extern const CGFloat VLCVolumeDefault;
  */
 @property (readonly, nullable) VLCInputItem *currentMedia;
 
+/**
+ * get the relevant media library item for the current media item
+ * @return the current media library media, NULL if no current input item OR is not an ML item
+ */
+ at property (readonly, nullable) VLCMediaLibraryMediaItem *currentMediaLibraryItem;
+
 /**
  * returns the duration of the current media in vlc ticks
  */


=====================================
modules/gui/macosx/playqueue/VLCPlayerController.m
=====================================
@@ -753,6 +753,12 @@ static int BossCallback(vlc_object_t *p_this,
     return _currentMedia;
 }
 
+- (nullable VLCMediaLibraryMediaItem *)currentMediaLibraryItem
+{
+    NSURL * const url = [NSURL URLWithString:self.currentMedia.MRL];
+    return [VLCMediaLibraryMediaItem mediaItemForURL:url];
+}
+
 - (int)interpolateTime:(vlc_tick_t)system_now
 {
     vlc_tick_t new_time;


=====================================
modules/gui/macosx/windows/controlsbar/VLCMainWindowControlsBar.h
=====================================
@@ -37,16 +37,16 @@
 @interface VLCMainWindowControlsBar : VLCControlsBarCommon
 
 @property (readwrite, strong) IBOutlet NSButton *stopButton;
-
 @property (readwrite, strong) IBOutlet NSButton *prevButton;
 @property (readwrite, strong) IBOutlet NSButton *nextButton;
-
 @property (readwrite, strong) IBOutlet NSButton *volumeUpButton;
+ at property (readwrite, strong) IBOutlet NSButton *favoriteButton;
 
 @property (readwrite, strong) IBOutlet VLCTrackingView *thumbnailTrackingView;
 @property (readwrite, strong) IBOutlet NSView *openMainVideoViewButtonOverlay;
 
 - (IBAction)stop:(id)sender;
+- (IBAction)toggleFavorite:(id)sender;
 
 @end
 


=====================================
modules/gui/macosx/windows/controlsbar/VLCMainWindowControlsBar.m
=====================================
@@ -201,6 +201,18 @@
     self.prevButton.enabled = b_seekable || _playQueueController.hasPreviousPlayQueueItem;
     self.nextButton.enabled = b_seekable || _playQueueController.hasNextPlayQueueItem;
     [self updateCurrentItemDisplayControls:notification];
+
+    VLCMediaLibraryMediaItem * const currentMlItem = _playerController.currentMediaLibraryItem;
+    self.favoriteButton.hidden = currentMlItem == nil;
+    self.favoriteButton.state = currentMlItem.favorited ? NSControlStateValueOn : NSControlStateValueOff;
+}
+
+- (void)toggleFavorite:(id)sender
+{
+    const NSControlStateValue buttonStartState = self.favoriteButton.state;
+    VLCMediaLibraryMediaItem * const mediaItem = [_playerController currentMediaLibraryItem];
+    if (mediaItem == nil || [mediaItem toggleFavorite] != VLC_SUCCESS)
+        self.favoriteButton.state = buttonStartState;
 }
 
 @end



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/acb1d6ed9fcff651cdcba62252a1248dc78c096e...0659b09534ccc81525aaac20445e3ec2e68a6154

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/acb1d6ed9fcff651cdcba62252a1248dc78c096e...0659b09534ccc81525aaac20445e3ec2e68a6154
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