Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libmpdclient for openSUSE:Factory 
checked in at 2026-06-22 17:33:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libmpdclient (Old)
 and      /work/SRC/openSUSE:Factory/.libmpdclient.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libmpdclient"

Mon Jun 22 17:33:17 2026 rev:12 rq:1360825 version:2.25

Changes:
--------
--- /work/SRC/openSUSE:Factory/libmpdclient/libmpdclient.changes        
2025-07-07 14:44:22.126937972 +0200
+++ /work/SRC/openSUSE:Factory/.libmpdclient.new.1956/libmpdclient.changes      
2026-06-22 17:33:43.182743758 +0200
@@ -1,0 +2,11 @@
+Sun Jun 21 10:24:06 UTC 2026 - Илья Индиго <[email protected]>
+
+- Updated to 2.25
+  * https://raw.githubusercontent.com/MusicPlayerDaemon/libmpdclient/v2.22/NEWS
+  * Supported MPD protocol 0.25.0
+    * stringnormalization
+    * song properties "RealUri", "start_ms", "end_ms"
+    * tag "DiscSubtitle"
+  * Switched to C11.
+
+-------------------------------------------------------------------

Old:
----
  libmpdclient-2.23.tar.xz
  libmpdclient-2.23.tar.xz.sig

New:
----
  libmpdclient-2.25.tar.xz
  libmpdclient-2.25.tar.xz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libmpdclient.spec ++++++
--- /var/tmp/diff_new_pack.SKXQTJ/_old  2026-06-22 17:33:44.058774467 +0200
+++ /var/tmp/diff_new_pack.SKXQTJ/_new  2026-06-22 17:33:44.062774607 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package libmpdclient
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %define sover 2
 Name:           libmpdclient
-Version:        2.23
+Version:        2.25
 Release:        0
 Summary:        Library for interfacing the Music Player Daemon
 License:        BSD-2-Clause AND BSD-3-Clause

++++++ libmpdclient-2.23.tar.xz -> libmpdclient-2.25.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/.github/workflows/build.yml 
new/libmpdclient-2.25/.github/workflows/build.yml
--- old/libmpdclient-2.23/.github/workflows/build.yml   2025-06-24 
11:54:55.000000000 +0200
+++ new/libmpdclient-2.25/.github/workflows/build.yml   2026-06-17 
11:58:42.000000000 +0200
@@ -19,7 +19,7 @@
     runs-on: ubuntu-latest
     steps:
       - id: checkout
-        uses: actions/checkout@v2
+        uses: actions/checkout@v5
 
       - id: cache-ccache
         uses: hendrikmuhs/ccache-action@v1
@@ -52,14 +52,14 @@
     runs-on: macos-latest
     steps:
       - id: checkout
-        uses: actions/checkout@v2
+        uses: actions/checkout@v5
 
       - id: cache-ccache
         uses: hendrikmuhs/ccache-action@v1
         with:
           key: macos
 
-      - uses: actions/setup-python@v1
+      - uses: actions/setup-python@v5
 
       - name: Install dependencies
         run: |
@@ -79,7 +79,7 @@
     runs-on: windows-latest
     steps:
       - id: checkout
-        uses: actions/checkout@v2
+        uses: actions/checkout@v5
 
       - name: Meson Build
         uses: BSFishy/[email protected]
@@ -94,7 +94,7 @@
     runs-on: windows-latest
     steps:
       - id: checkout
-        uses: actions/checkout@v2
+        uses: actions/checkout@v5
 
       - name: Add VisualStudio command line tools into path
         uses: ilammy/msvc-dev-cmd@v1
@@ -104,6 +104,6 @@
         with:
           action: build
           directory: output
-          setup-options: -Ddocumentation=false
+          setup-options: -Ddefault_library=static -Ddocumentation=false
           options: --verbose
           meson-version: 1.3.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/NEWS new/libmpdclient-2.25/NEWS
--- old/libmpdclient-2.23/NEWS  2025-06-24 11:54:55.000000000 +0200
+++ new/libmpdclient-2.25/NEWS  2026-06-17 11:58:42.000000000 +0200
@@ -1,3 +1,15 @@
+libmpdclient 2.25 (2026/06/17)
+* fix typos in MPD_STICKER_SORT_UNKOWN and MPD_STICKER_SORT_UNKOWN
+* support MPD protocol 0.25
+  - song properties "RealUri", "start_ms", "end_ms"
+  - tag "DiscSubtitle"
+* switch to C11
+
+libmpdclient 2.24 (2025/08/23)
+* fix missing "mpd_send_list_tag_types_available" in libmpdclient.ld
+* support MPD protocol 0.25
+  - stringnormalization
+
 libmpdclient 2.23 (2025/06/24)
 * support MPD protocol 0.24.0
   - allow window for listplaylist and listplaylistinfo
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/include/mpd/client.h 
new/libmpdclient-2.25/include/mpd/client.h
--- old/libmpdclient-2.23/include/mpd/client.h  2025-06-24 11:54:55.000000000 
+0200
+++ new/libmpdclient-2.25/include/mpd/client.h  2026-06-17 11:58:42.000000000 
+0200
@@ -57,6 +57,7 @@
 #include "stats.h"
 #include "status.h"
 #include "sticker.h"
+#include "stringnormalization.h"
 
 /* this is a generated header and may be installed in a different
    filesystem tree, therefore we can't use just "version.h" */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/include/mpd/feature.h 
new/libmpdclient-2.25/include/mpd/feature.h
--- old/libmpdclient-2.23/include/mpd/feature.h 2025-06-24 11:54:55.000000000 
+0200
+++ new/libmpdclient-2.25/include/mpd/feature.h 2026-06-17 11:58:42.000000000 
+0200
@@ -5,7 +5,7 @@
 #define LIBMPDCLIENT_FEATURE_H
 
 /**
- * @since libmpdclient 2.23 added support for #MPD_TAG_SHOWMOVEMENT.
+ * @since libmpdclient 2.23
  */
 enum mpd_protocol_feature
 {
@@ -17,7 +17,7 @@
 
        MPD_FEATURE_HIDE_PLAYLISTS_IN_ROOT,
 
-       /* IMPORTANT: the ordering of tag types above must be
+       /* IMPORTANT: the ordering above must be
           retained, or else the libmpdclient ABI breaks */
 
        MPD_FEATURE_COUNT
@@ -30,6 +30,8 @@
 /**
  * Looks up the name of the specified protocol feature.
  *
+ * @since libmpdclient 2.23
+ *
  * @return the name, or NULL if the tag type is not valid
  */
 const char *
@@ -38,6 +40,8 @@
 /**
  * Parses a protocol feature name, and returns its #mpd_protocol_feature value.
  *
+ * @since libmpdclient 2.23
+ *
  * @return a #mpd_protocol_feature value, or MPD_FEATURE_UNKNOWN if the name 
was
  * not recognized
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/include/mpd/meson.build 
new/libmpdclient-2.25/include/mpd/meson.build
--- old/libmpdclient-2.23/include/mpd/meson.build       2025-06-24 
11:54:55.000000000 +0200
+++ new/libmpdclient-2.25/include/mpd/meson.build       2026-06-17 
11:58:42.000000000 +0200
@@ -52,6 +52,7 @@
   'binary.h',
   'albumart.h',
   'readpicture.h',
+  'stringnormalization.h',
   version_h,
   subdir: 'mpd',
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/include/mpd/song.h 
new/libmpdclient-2.25/include/mpd/song.h
--- old/libmpdclient-2.23/include/mpd/song.h    2025-06-24 11:54:55.000000000 
+0200
+++ new/libmpdclient-2.25/include/mpd/song.h    2026-06-17 11:58:42.000000000 
+0200
@@ -72,6 +72,17 @@
                 enum mpd_tag_type type, unsigned idx);
 
 /**
+ * Returns the "real" URI of the song, the one to be used for opening
+ * the resource. If this attribute is nullptr, then #mpd_song_get_uri
+ * shall be used.
+ *
+ * @since libmpdclient 2.25
+ */
+mpd_pure
+const char *
+mpd_song_get_real_uri(const struct mpd_song *song);
+
+/**
  * Returns the duration of this song in seconds.  0 means the duration
  * is unknown.
  */
@@ -100,6 +111,16 @@
 mpd_song_get_start(const struct mpd_song *song);
 
 /**
+ * Returns the start of the virtual song within the physical file in
+ * milliseconds.
+ *
+ * @since libmpdclient 2.25
+ */
+mpd_pure
+unsigned
+mpd_song_get_start_ms(const struct mpd_song *song);
+
+/**
  * Returns the end of the virtual song within the physical file in
  * seconds. 0 means that the physical song file is played to the end.
  *
@@ -110,6 +131,16 @@
 mpd_song_get_end(const struct mpd_song *song);
 
 /**
+ * Returns the end of the virtual song within the physical file in
+ * milliseconds. 0 means that the physical song file is played to the end.
+ *
+ * @since libmpdclient 2.25
+ */
+mpd_pure
+unsigned
+mpd_song_get_end_ms(const struct mpd_song *song);
+
+/**
  * @return the POSIX UTC time stamp of the last modification, or 0 if
  * that is unknown
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/include/mpd/sticker.h 
new/libmpdclient-2.25/include/mpd/sticker.h
--- old/libmpdclient-2.23/include/mpd/sticker.h 2025-06-24 11:54:55.000000000 
+0200
+++ new/libmpdclient-2.25/include/mpd/sticker.h 2026-06-17 11:58:42.000000000 
+0200
@@ -23,7 +23,8 @@
  * Comparison operators for sticker search api
  */
 enum mpd_sticker_operator {
-       MPD_STICKER_OP_UNKOWN = -1,
+       MPD_STICKER_OP_UNKOWN = -1,   // Keep typo, else we break the abi
+       MPD_STICKER_OP_UNKNOWN = -1,
        MPD_STICKER_OP_EQ,
        MPD_STICKER_OP_GT,
        MPD_STICKER_OP_LT,
@@ -38,7 +39,8 @@
  * Sort by settings for sticker search api
  */
 enum mpd_sticker_sort {
-       MPD_STICKER_SORT_UNKOWN = -1,
+       MPD_STICKER_SORT_UNKOWN = -1,   // Keep typo, else we break the abi
+       MPD_STICKER_SORT_UNKNOWN = -1,
        MPD_STICKER_SORT_URI,
        MPD_STICKER_SORT_VALUE,
        MPD_STICKER_SORT_VALUE_INT,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/include/mpd/stringnormalization.h 
new/libmpdclient-2.25/include/mpd/stringnormalization.h
--- old/libmpdclient-2.23/include/mpd/stringnormalization.h     1970-01-01 
01:00:00.000000000 +0100
+++ new/libmpdclient-2.25/include/mpd/stringnormalization.h     2026-06-17 
11:58:42.000000000 +0200
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: BSD-3-Clause
+// Copyright The Music Player Daemon Project
+
+#ifndef LIBMPDCLIENT_STRINGNORMALIZATION_H
+#define LIBMPDCLIENT_STRINGNORMALIZATION_H
+
+#include "recv.h"
+#include "compiler.h"
+
+#include <stdbool.h>
+
+/**
+ * @since libmpdclient 2.24
+ */
+enum mpd_stringnormalization_option
+{
+       /**
+        * Special value returned by mpd_stringnormalization_parse() when an
+        * unknown name was passed.
+        */
+       MPD_STRINGNORMALIZATION_UNKNOWN = -1,
+
+       MPD_STRINGNORMALIZATION_STRIP_DIACRITICS,
+
+       /* IMPORTANT: the ordering above must be
+          retained, or else the libmpdclient ABI breaks */
+
+       MPD_STRINGNORMALIZATION_COUNT
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Looks up the name of the specified stringnormalization option.
+ *
+ * @return the name, or NULL if the tag type is not valid
+ */
+const char *
+mpd_stringnormalization_name(enum mpd_stringnormalization_option option);
+
+/**
+ * Parses a stringnormalization option name, and returns its 
#mpd_protocol_feature value.
+ *
+ * @return a #mpd_protocol_feature value, or MPD_FEATURE_UNKNOWN if the name 
was
+ * not recognized
+ */
+enum mpd_stringnormalization_option
+mpd_stringnormalization_name_parse(const char *name);
+
+/**
+ * Requests a list of enabled stringnormalization options.
+ * Use mpd_recv_stringnormalization_pair() to obtain the list of
+ * "option" pairs.
+ *
+ * @param connection the connection to MPD
+ * @return true on success, false on error
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_send_list_stringnormalization(struct mpd_connection *connection);
+
+/**
+ * Requests a list of available protocol features.
+ * Use mpd_recv_stringnormalization_pair() to obtain the list of
+ * "stringnormalization option" pairs.
+ *
+ * @param connection the connection to MPD
+ * @return true on success, false on error
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_send_list_stringnormalization_available(struct mpd_connection *connection);
+
+/**
+ * Receives the next stringnormalization option.  Call this in a loop after
+ * mpd_send_list_stringnormalization().
+ *
+ * Free the return value with mpd_return_pair().
+ *
+ * @param connection a #mpd_connection
+ * @returns a "stringnormalization option" pair, or NULL on error or if the 
end of the
+ * response is reached
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+mpd_malloc
+static inline struct mpd_pair *
+mpd_recv_stringnormalization_pair(struct mpd_connection *connection)
+{
+       return mpd_recv_pair_named(connection, "stringnormalization");
+}
+
+/**
+ * Disables one or more stringnormalization option from the list of 
stringnormalization options.
+ *
+ * @param connection the connection to MPD
+ * @param options an array of stringnormalization options to disable
+ * @param n the number of protocol features in the array
+ * @return true on success, false on error
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_send_disable_stringnormalization(struct mpd_connection *connection,
+                                    const enum mpd_stringnormalization_option 
*options, unsigned n);
+
+/**
+ * Shortcut for mpd_send_disable_stringnormalization() and 
mpd_response_finish().
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_run_disable_stringnormalization(struct mpd_connection *connection,
+                                   const enum mpd_stringnormalization_option 
*options, unsigned n);
+
+/**
+ * Re-enable one or more stringnormalization options from the list of 
stringnormalization options
+ * for this client.
+ *
+ * @param connection the connection to MPD
+ * @param options an array of stringnormalization options to enable
+ * @param n the number of protocol features in the array
+ * @return true on success, false on error
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_send_enable_stringnormalization(struct mpd_connection *connection,
+                                   const enum mpd_stringnormalization_option 
*options, unsigned n);
+
+/**
+ * Shortcut for mpd_send_enable_stringnormalization() and 
mpd_response_finish().
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_run_enable_stringnormalization(struct mpd_connection *connection,
+                                  const enum mpd_stringnormalization_option 
*options, unsigned n);
+
+/**
+ * Clear the list of enabled stringnormalization options for this client.
+ *
+ * @param connection the connection to MPD
+ * @return true on success, false on error
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_send_clear_stringnormalization(struct mpd_connection *connection);
+
+/**
+ * Shortcut for mpd_send_clear_stringnormalization() and mpd_response_finish().
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_run_clear_stringnormalization(struct mpd_connection *connection);
+
+/**
+ * Enable all available stringnormalization options for this client.
+ *
+ * @param connection the connection to MPD
+ * @return true on success, false on error
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_send_all_stringnormalization(struct mpd_connection *connection);
+
+/**
+ * Shortcut for mpd_send_all_stringnormalization() and mpd_response_finish().
+ *
+ * @since libmpdclient 2.24, MPD 0.25
+ */
+bool
+mpd_run_all_stringnormalization(struct mpd_connection *connection);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/include/mpd/tag.h 
new/libmpdclient-2.25/include/mpd/tag.h
--- old/libmpdclient-2.23/include/mpd/tag.h     2025-06-24 11:54:55.000000000 
+0200
+++ new/libmpdclient-2.25/include/mpd/tag.h     2026-06-17 11:58:42.000000000 
+0200
@@ -21,6 +21,7 @@
  * @since libmpdclient 2.21 added support for #MPD_TAG_MOOD,
  *                                            #MPD_TAG_TITLE_SORT.
  * @since libmpdclient 2.23 added support for #MPD_TAG_SHOWMOVEMENT.
+ * @since libmpdclient 2.25 added support for #MPD_TAG_DISCSUBTITLE.
  */
 enum mpd_tag_type
 {
@@ -71,6 +72,7 @@
        MPD_TAG_TITLE_SORT,
        MPD_TAG_MUSICBRAINZ_RELEASEGROUPID,
        MPD_TAG_SHOWMOVEMENT,
+       MPD_TAG_DISCSUBTITLE,
 
        /* IMPORTANT: the ordering of tag types above must be
           retained, or else the libmpdclient ABI breaks */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/libmpdclient.ld 
new/libmpdclient-2.25/libmpdclient.ld
--- old/libmpdclient-2.23/libmpdclient.ld       2025-06-24 11:54:55.000000000 
+0200
+++ new/libmpdclient-2.25/libmpdclient.ld       2026-06-17 11:58:42.000000000 
+0200
@@ -20,6 +20,7 @@
        mpd_send_disallowed_commands;
        mpd_send_list_url_schemes;
        mpd_send_list_tag_types;
+       mpd_send_list_tag_types_available;
        mpd_send_disable_tag_types;
        mpd_run_disable_tag_types;
        mpd_send_enable_tag_types;
@@ -401,10 +402,13 @@
        mpd_song_dup;
        mpd_song_get_uri;
        mpd_song_get_tag;
+       mpd_song_get_real_uri;
        mpd_song_get_duration;
        mpd_song_get_duration_ms;
        mpd_song_get_start;
+       mpd_song_get_start_ms;
        mpd_song_get_end;
+       mpd_song_get_end_ms;
        mpd_song_get_last_modified;
        mpd_song_get_added;
        mpd_song_set_pos;
@@ -468,6 +472,20 @@
        mpd_lookup_consume_state;
        mpd_parse_consume_state;
 
+       /* mpd/stringnormalization.h */
+       mpd_stringnormalization_name;
+       mpd_stringnormalization_name_parse;
+       mpd_send_list_stringnormalization;
+       mpd_send_list_stringnormalization_available;
+       mpd_send_disable_stringnormalization;
+       mpd_run_disable_stringnormalization;
+       mpd_send_enable_stringnormalization;
+       mpd_run_enable_stringnormalization;
+       mpd_send_clear_stringnormalization;
+       mpd_run_clear_stringnormalization;
+       mpd_send_all_stringnormalization;
+       mpd_run_all_stringnormalization;
+
        /* mpd/tag.h */
        mpd_tag_name;
        mpd_tag_name_parse;
@@ -539,15 +557,15 @@
        mpd_send_binarylimit;
        mpd_run_binarylimit;
 
-    /* mpd/albumart.h */
-    mpd_send_albumart;
-    mpd_recv_albumart;
-    mpd_run_albumart;
-
-    /* mpd/readpicture.h */
-    mpd_send_readpicture;
-    mpd_recv_readpicture;
-    mpd_run_readpicture;
+       /* mpd/albumart.h */
+       mpd_send_albumart;
+       mpd_recv_albumart;
+       mpd_run_albumart;
+
+       /* mpd/readpicture.h */
+       mpd_send_readpicture;
+       mpd_recv_readpicture;
+       mpd_run_readpicture;
 
        /* mpd/position.h */
        mpd_position_whence_char;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/meson.build 
new/libmpdclient-2.25/meson.build
--- old/libmpdclient-2.23/meson.build   2025-06-24 11:54:55.000000000 +0200
+++ new/libmpdclient-2.25/meson.build   2026-06-17 11:58:42.000000000 +0200
@@ -1,7 +1,7 @@
-project('libmpdclient', 'c', version: '2.23',
+project('libmpdclient', 'c', version: '2.25',
   meson_version: '>= 0.56.0',
   default_options: [
-    'c_std=c99',
+    'c_std=c11',
     'warning_level=3',
   ],
   license: 'BSD',
@@ -155,6 +155,7 @@
   'src/albumart.c',
   'src/readpicture.c',
   'src/position.c',
+  'src/stringnormalization.c',
   link_depends: [
     'libmpdclient.ld'
   ],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/src/song.c 
new/libmpdclient-2.25/src/song.c
--- old/libmpdclient-2.23/src/song.c    2025-06-24 11:54:55.000000000 +0200
+++ new/libmpdclient-2.25/src/song.c    2026-06-17 11:58:42.000000000 +0200
@@ -27,6 +27,13 @@
        struct mpd_tag_value tags[MPD_TAG_COUNT];
 
        /**
+        * The "real" URI, the one to be used for opening the
+        * resource.  If this attribute is nullptr, then #uri
+        * shall be used.
+        */
+       char *real_uri;
+
+       /**
         * Duration of the song in seconds, or 0 for unknown.
         */
        unsigned duration;
@@ -43,6 +50,12 @@
        unsigned start;
 
        /**
+        * Start of the virtual song within the physical file in
+        * milliseconds.
+        */
+       unsigned start_ms;
+
+       /**
         * End of the virtual song within the physical file in
         * seconds.  Zero means that the physical song file is
         * played to the end.
@@ -50,6 +63,13 @@
        unsigned end;
 
        /**
+        * End of the virtual song within the physical file in
+        * milliseconds.  Zero means that the physical song
+        * file is played to the end.
+        */
+       unsigned end_ms;
+
+       /**
         * The POSIX UTC time stamp of the last modification, or 0 if
         * that is unknown.
         */
@@ -113,10 +133,13 @@
        for (unsigned i = 0; i < MPD_TAG_COUNT; ++i)
                song->tags[i].value = NULL;
 
+       song->real_uri = NULL;
        song->duration = 0;
        song->duration_ms = 0;
        song->start = 0;
+       song->start_ms = 0;
        song->end = 0;
+       song->end_ms = 0;
        song->last_modified = 0;
        song->added = 0;
        song->pos = 0;
@@ -157,6 +180,8 @@
                }
        }
 
+       free(song->real_uri);
+
        free(song);
 }
 
@@ -194,10 +219,13 @@
                } while (src_tag != NULL);
        }
 
+       ret->real_uri = strdup(song->real_uri);
        ret->duration = song->duration;
        ret->duration_ms = song->duration_ms;
        ret->start = song->start;
+       ret->start_ms = song->start_ms;
        ret->end = song->end;
+       ret->end_ms = song->end_ms;
        ret->last_modified = song->last_modified;
        ret->added = song->added;
        ret->pos = song->pos;
@@ -311,6 +339,20 @@
 }
 
 static void
+mpd_song_set_real_uri(struct mpd_song *song, char *real_uri)
+{
+       song->real_uri = real_uri;
+}
+
+const char *
+mpd_song_get_real_uri(const struct mpd_song *song)
+{
+       assert(song != NULL);
+
+       return song->real_uri;
+}
+
+static void
 mpd_song_set_duration(struct mpd_song *song, unsigned duration)
 {
        song->duration = duration;
@@ -351,6 +393,14 @@
 }
 
 unsigned
+mpd_song_get_start_ms(const struct mpd_song *song)
+{
+       assert(song != NULL);
+
+       return song->start_ms;
+}
+
+unsigned
 mpd_song_get_end(const struct mpd_song *song)
 {
        assert(song != NULL);
@@ -358,6 +408,14 @@
        return song->end;
 }
 
+unsigned
+mpd_song_get_end_ms(const struct mpd_song *song)
+{
+       assert(song != NULL);
+
+       return song->end_ms;
+}
+
 static void
 mpd_song_set_last_modified(struct mpd_song *song, time_t mtime)
 {
@@ -476,15 +534,19 @@
        }
 
        song->start = start > 0.0 ? (unsigned)start : 0;
+       song->start_ms = start > 0.0 ? (unsigned)(start * 1000) : 0;
 
        if (end > 0.0) {
                song->end = (unsigned)end;
+               song->end_ms = (unsigned)(end * 1000);
                if (song->end == 0)
                        /* round up, because the caller must sees that
                           there's an upper limit */
                        song->end = 1;
-       } else
+       } else {
                song->end = 0;
+               song->end_ms = 0;
+       }
 }
 
 static void
@@ -541,6 +603,8 @@
                mpd_song_set_prio(song, strtoul(pair->value, NULL, 10));
        else if (strcmp(pair->name, "Format") == 0)
                mpd_song_parse_audio_format(song, pair->value);
+       else if (strcmp(pair->name, "RealUri") == 0)
+               mpd_song_set_real_uri(song, strdup(pair->value));
 
        return true;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/src/sticker.c 
new/libmpdclient-2.25/src/sticker.c
--- old/libmpdclient-2.23/src/sticker.c 2025-06-24 11:54:55.000000000 +0200
+++ new/libmpdclient-2.25/src/sticker.c 2026-06-17 11:58:42.000000000 +0200
@@ -142,11 +142,18 @@
        return eq + 1;
 }
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+/* to allow casting the "const" away (see code comment inside
+   mpd_recv_sticker()) */
+#pragma GCC diagnostic ignored "-Wcast-qual"
+#endif
+
 struct mpd_pair *
 mpd_recv_sticker(struct mpd_connection *connection)
 {
        struct mpd_pair *pair;
-       char *eq;
+       const char *eq;
 
        pair = mpd_recv_pair_named(connection, "sticker");
        if (pair == NULL)
@@ -159,7 +166,7 @@
                /* we shouldn't modify a const string, but in this
                   case, we know that this points to the writable
                   input buffer */
-               *eq = 0;
+               *(char *)eq = 0;
                pair->value = eq + 1;
        } else
                /* malformed response?  what to do now?  pretend
@@ -169,6 +176,10 @@
        return pair;
 }
 
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+
 void
 mpd_return_sticker(struct mpd_connection *connection, struct mpd_pair *pair)
 {
@@ -251,7 +262,7 @@
        case MPD_STICKER_OP_LT_INT:      return "lt";
        case MPD_STICKER_OP_CONTAINS:    return "contains";
        case MPD_STICKER_OP_STARTS_WITH: return "starts_with";
-       case MPD_STICKER_OP_UNKOWN:      return NULL;
+       case MPD_STICKER_OP_UNKNOWN:     return NULL;
        }
        return NULL;
 }
@@ -293,7 +304,7 @@
        case MPD_STICKER_SORT_URI:       return "uri";
        case MPD_STICKER_SORT_VALUE:     return "value";
        case MPD_STICKER_SORT_VALUE_INT: return "value_int";
-       case MPD_STICKER_SORT_UNKOWN:    return NULL;
+       case MPD_STICKER_SORT_UNKNOWN:   return NULL;
        }
        return NULL;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/src/stringnormalization.c 
new/libmpdclient-2.25/src/stringnormalization.c
--- old/libmpdclient-2.23/src/stringnormalization.c     1970-01-01 
01:00:00.000000000 +0100
+++ new/libmpdclient-2.25/src/stringnormalization.c     2026-06-17 
11:58:42.000000000 +0200
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: BSD-3-Clause
+// Copyright The Music Player Daemon Project
+
+#include <mpd/stringnormalization.h>
+#include <mpd/send.h>
+#include <mpd/recv.h>
+#include <mpd/response.h>
+#include "internal.h"
+
+#include <assert.h>
+#include <stddef.h>
+#include <string.h>
+
+static const char *const 
mpd_stringnormalization_options[MPD_STRINGNORMALIZATION_COUNT] =
+{
+       [MPD_STRINGNORMALIZATION_STRIP_DIACRITICS] = "strip_diacritics",
+};
+
+const char *
+mpd_stringnormalization_name(enum mpd_stringnormalization_option option)
+{
+       if ((unsigned)option >= MPD_STRINGNORMALIZATION_COUNT)
+               return NULL;
+
+       return mpd_stringnormalization_options[option];
+}
+
+enum mpd_stringnormalization_option
+mpd_stringnormalization_name_parse(const char *name)
+{
+       assert(name != NULL);
+
+       for (unsigned i = 0; i < MPD_STRINGNORMALIZATION_COUNT; ++i)
+               if (strcmp(name, mpd_stringnormalization_options[i]) == 0)
+                       return (enum mpd_stringnormalization_option)i;
+
+       return MPD_STRINGNORMALIZATION_UNKNOWN;
+}
+
+bool
+mpd_send_list_stringnormalization(struct mpd_connection *connection)
+{
+       return mpd_send_command(connection, "stringnormalization", NULL);
+}
+
+bool
+mpd_send_list_stringnormalization_available(struct mpd_connection *connection)
+{
+       return mpd_send_command(connection, "stringnormalization", "available", 
NULL);
+}
+
+static bool
+mpd_send_stringnormalization_v(struct mpd_connection *connection,
+                            const char *sub_command,
+                            const enum mpd_stringnormalization_option 
*options, unsigned n)
+{
+       assert(connection != NULL);
+       assert(options != NULL);
+       assert(n > 0);
+
+       if (mpd_error_is_defined(&connection->error))
+               return false;
+
+       char buffer[1024] = "stringnormalization ";
+       strcat(buffer, sub_command);
+       size_t length = strlen(buffer);
+
+       for (unsigned i = 0; i < n; ++i) {
+               const char *t = mpd_stringnormalization_name(options[i]);
+               assert(t != NULL);
+               size_t t_length = strlen(t);
+
+               if (length + 1 + t_length + 1 > sizeof(buffer)) {
+                       mpd_error_code(&connection->error, MPD_ERROR_ARGUMENT);
+                       mpd_error_message(&connection->error,
+                                         "Stringnormalization list is too 
long");
+                       return false;
+               }
+
+               buffer[length++] = ' ';
+               memcpy(buffer + length, t, t_length);
+               length += t_length;
+       }
+
+       buffer[length] = 0;
+
+       return mpd_send_command(connection, buffer, NULL);
+}
+
+bool
+mpd_send_disable_stringnormalization(struct mpd_connection *connection,
+                                    const enum mpd_stringnormalization_option 
*options, unsigned n)
+{
+       return mpd_send_stringnormalization_v(connection, "disable", options, 
n);
+}
+
+bool
+mpd_run_disable_stringnormalization(struct mpd_connection *connection,
+                                   const enum mpd_stringnormalization_option 
*options, unsigned n)
+{
+       return mpd_send_disable_stringnormalization(connection, options, n) &&
+               mpd_response_finish(connection);
+}
+
+bool
+mpd_send_enable_stringnormalization(struct mpd_connection *connection,
+                                   const enum mpd_stringnormalization_option 
*options, unsigned n)
+{
+       return mpd_send_stringnormalization_v(connection, "enable", options, n);
+}
+
+bool
+mpd_run_enable_stringnormalization(struct mpd_connection *connection,
+                                  const enum mpd_stringnormalization_option 
*options, unsigned n)
+{
+       return mpd_send_enable_stringnormalization(connection, options, n) &&
+               mpd_response_finish(connection);
+}
+
+bool
+mpd_send_clear_stringnormalization(struct mpd_connection *connection)
+{
+       return mpd_send_command(connection, "stringnormalization", "clear", 
NULL);
+}
+
+bool
+mpd_run_clear_stringnormalization(struct mpd_connection *connection)
+{
+       return mpd_send_clear_stringnormalization(connection) &&
+               mpd_response_finish(connection);
+}
+
+bool
+mpd_send_all_stringnormalization(struct mpd_connection *connection)
+{
+       return mpd_send_command(connection, "stringnormalization", "all", NULL);
+}
+
+bool
+mpd_run_all_stringnormalization(struct mpd_connection *connection)
+{
+       return mpd_send_all_stringnormalization(connection) &&
+               mpd_response_finish(connection);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libmpdclient-2.23/src/tag.c 
new/libmpdclient-2.25/src/tag.c
--- old/libmpdclient-2.23/src/tag.c     2025-06-24 11:54:55.000000000 +0200
+++ new/libmpdclient-2.25/src/tag.c     2026-06-17 11:58:42.000000000 +0200
@@ -48,6 +48,7 @@
        [MPD_TAG_TITLE_SORT] = "TitleSort",
        [MPD_TAG_MUSICBRAINZ_RELEASEGROUPID] = "MUSICBRAINZ_RELEASEGROUPID",
        [MPD_TAG_SHOWMOVEMENT] = "ShowMovement",
+       [MPD_TAG_DISCSUBTITLE] = "DiscSubtitle",
 };
 
 const char *

Reply via email to