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 *
