Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package pianobar for openSUSE:Factory checked in at 2025-10-17 17:25:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/pianobar (Old) and /work/SRC/openSUSE:Factory/.pianobar.new.18484 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "pianobar" Fri Oct 17 17:25:58 2025 rev:9 rq:1311823 version:2024.12.21 Changes: -------- --- /work/SRC/openSUSE:Factory/pianobar/pianobar.changes 2024-10-11 17:03:41.202132770 +0200 +++ /work/SRC/openSUSE:Factory/.pianobar.new.18484/pianobar.changes 2025-10-17 17:26:53.756806518 +0200 @@ -1,0 +2,10 @@ +Thu Oct 16 14:30:45 UTC 2025 - Luigi Baldoni <[email protected]> + +- Update to version 2024.12.21 + * Improved network error retrying + * Improved compatibility with newer versions of ffmpeg and + libcurl + * Minor documentation fixes +- Drop b11ba432.patch and 8bf4c1bb.patch (merged upstream) + +------------------------------------------------------------------- Old: ---- 8bf4c1bb.patch b11ba432.patch pianobar-2022.04.01.tar.bz2 New: ---- pianobar-2024.12.21.tar.bz2 ----------(Old B)---------- Old: * Minor documentation fixes - Drop b11ba432.patch and 8bf4c1bb.patch (merged upstream) Old: * Minor documentation fixes - Drop b11ba432.patch and 8bf4c1bb.patch (merged upstream) ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ pianobar.spec ++++++ --- /var/tmp/diff_new_pack.wsFOZ8/_old 2025-10-17 17:26:54.360831960 +0200 +++ /var/tmp/diff_new_pack.wsFOZ8/_new 2025-10-17 17:26:54.360831960 +0200 @@ -1,7 +1,7 @@ # # spec file for package pianobar # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # Copyright (c) 2016 Packman team: http://packman.links2linux.org/ # # All modifications and additions to the file contributed by third parties @@ -18,15 +18,13 @@ Name: pianobar -Version: 2022.04.01 +Version: 2024.12.21 Release: 0 Summary: Pandora Player License: MIT Group: Productivity/Multimedia/Sound/Utilities URL: https://6xq.net/pianobar -Source0: %{url}/pianobar-2022.04.01.tar.bz2 -Patch0: https://github.com/PromyLOPh/pianobar/commit/b11ba432.patch -Patch1: https://github.com/PromyLOPh/pianobar/commit/8bf4c1bb.patch +Source0: %{url}/pianobar-%{version}.tar.bz2 BuildRequires: libgcrypt-devel BuildRequires: pkgconfig BuildRequires: pkgconfig(ao) ++++++ pianobar-2022.04.01.tar.bz2 -> pianobar-2024.12.21.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/.github/workflows/build.yml new/pianobar-2024.12.21/.github/workflows/build.yml --- old/pianobar-2022.04.01/.github/workflows/build.yml 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/.github/workflows/build.yml 2024-12-21 12:41:13.000000000 +0100 @@ -9,7 +9,7 @@ jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/ChangeLog new/pianobar-2024.12.21/ChangeLog --- old/pianobar-2022.04.01/ChangeLog 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/ChangeLog 2024-12-21 12:41:13.000000000 +0100 @@ -1,3 +1,9 @@ +Release 2024.12.21 + +- Improved network error retrying +- Improved compatibility with newer versions of ffmpeg and libcurl +- Minor documentation fixes + Release 2022.04.01 - Not a joke diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/INSTALL new/pianobar-2024.12.21/INSTALL --- old/pianobar-2022.04.01/INSTALL 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/INSTALL 2024-12-21 12:41:13.000000000 +0100 @@ -7,10 +7,10 @@ - gmake - pthreads - libao -- libcurl +- libcurl>=7.32.0 - gcrypt[1] - json-c -- ffmpeg>=3.3 [2] +- ffmpeg>=5.1 [2] - UTF-8 console/locale [1] with blowfish cipher enabled diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/Makefile new/pianobar-2024.12.21/Makefile --- old/pianobar-2022.04.01/Makefile 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/Makefile 2024-12-21 12:41:13.000000000 +0100 @@ -52,8 +52,8 @@ LIBCURL_CFLAGS:=$(shell $(PKG_CONFIG) --cflags libcurl) LIBCURL_LDFLAGS:=$(shell $(PKG_CONFIG) --libs libcurl) -LIBGCRYPT_CFLAGS:= -LIBGCRYPT_LDFLAGS:=-lgcrypt +LIBGCRYPT_CFLAGS:=$(shell $(PKG_CONFIG) --cflags libgcrypt) +LIBGCRYPT_LDFLAGS:=$(shell $(PKG_CONFIG) --libs libgcrypt) LIBJSONC_CFLAGS:=$(shell $(PKG_CONFIG) --cflags json-c 2>/dev/null || $(PKG_CONFIG) --cflags json) LIBJSONC_LDFLAGS:=$(shell $(PKG_CONFIG) --libs json-c 2>/dev/null || $(PKG_CONFIG) --libs json) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/README.rst new/pianobar-2024.12.21/README.rst --- old/pianobar-2022.04.01/README.rst 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/README.rst 2024-12-21 12:41:13.000000000 +0100 @@ -33,10 +33,12 @@ .. _homebrew: http://brew.sh/ .. _native Windows Port: https://github.com/thedmd/pianobar-windows -The current pianobar release is 2020.11.28_ (sha256__, sign__). More recent and +The current pianobar release is 2024.12.21_ (sha256__, sign__). More recent and experimental code is available at GitHub_ and the local gitweb_. Older releases are available here: +- 2022.04.01_ (sha256__, sign__) +- 2020.11.28_ (sha256__, sign__) - 2020.04.05_ (sha256__, sign__) - 2019.02.14_ (sha256__, sign__) - 2019.01.25_ (sha256__, sign__) @@ -66,6 +68,12 @@ - 2010.10.07_ (sha1__) - 2010.08.21_ (sha1__) +.. _2024.12.21: https://6xq.net/pianobar/pianobar-2024.12.21.tar.bz2 +__ https://6xq.net/pianobar/pianobar-2024.12.21.tar.bz2.sha256 +__ https://6xq.net/pianobar/pianobar-2024.12.21.tar.bz2.asc +.. _2022.04.01: https://6xq.net/pianobar/pianobar-2022.04.01.tar.bz2 +__ https://6xq.net/pianobar/pianobar-2022.04.01.tar.bz2.sha256 +__ https://6xq.net/pianobar/pianobar-2022.04.01.tar.bz2.asc .. _2020.11.28: https://6xq.net/pianobar/pianobar-2020.11.28.tar.bz2 __ https://6xq.net/pianobar/pianobar-2020.11.28.tar.bz2.sha256 __ https://6xq.net/pianobar/pianobar-2020.11.28.tar.bz2.asc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/contrib/config-example new/pianobar-2024.12.21/contrib/config-example --- old/pianobar-2022.04.01/contrib/config-example 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/contrib/config-example 2024-12-21 12:41:13.000000000 +0100 @@ -23,7 +23,6 @@ #act_stationaddbygenre = g #act_songinfo = i #act_addshared = j -#act_songmove = m #act_songnext = n #act_songpause = S #act_songpausetoggle = p diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/contrib/pianobar.1 new/pianobar-2024.12.21/contrib/pianobar.1 --- old/pianobar-2022.04.01/contrib/pianobar.1 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/contrib/pianobar.1 2024-12-21 12:41:13.000000000 +0100 @@ -103,10 +103,6 @@ Delete artist/song seeds or feedback. .TP -.B act_songmove = m -Move current song to another station - -.TP .B act_songnext = n Skip current song. @@ -449,13 +445,13 @@ information like error code and description, was well as song information related to the current event, is supplied through stdin. -Currently supported events are: artistbookmark, songban, songbookmark, -songexplain, songfinish, songlove, songmove, songshelf, songstart, +Currently supported events are: artistbookmark, settingschange, settingsget, +songban, songbookmark, songexplain, songfinish, songlove, songshelf, songstart, stationaddgenre, stationaddmusic, stationaddshared, stationcreate, stationdelete, stationdeleteartistseed, stationdeletefeedback, -stationdeletesongseed, stationfetchinfo, stationfetchplaylist, -stationfetchgenre stationquickmixtoggle, stationrename, userlogin, -usergetstations +stationdeletesongseed, stationdeletestationseed, stationfetchgenre, +stationfetchinfo, stationfetchplaylist, stationgetmodes, stationquickmixtoggle, +stationrename, stationsetmode, usergetstations, userlogin An example script can be found in the contrib/ directory of .B pianobar's diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/src/config.h new/pianobar-2024.12.21/src/config.h --- old/pianobar-2022.04.01/src/config.h 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/src/config.h 2024-12-21 12:41:13.000000000 +0100 @@ -3,7 +3,7 @@ /* package name */ #define PACKAGE "pianobar" -#define VERSION "2022.04.01" +#define VERSION "2024.12.21" /* glibc feature test macros, define _before_ including other files */ #define _POSIX_C_SOURCE 200809L diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/src/libpiano/response.c new/pianobar-2024.12.21/src/libpiano/response.c --- old/pianobar-2022.04.01/src/libpiano/response.c 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/src/libpiano/response.c 2024-12-21 12:41:13.000000000 +0100 @@ -206,7 +206,7 @@ break; } - for (int i = 0; i < json_object_array_length (stations); i++) { + for (unsigned int i = 0; i < json_object_array_length (stations); i++) { PianoStation_t *tmpStation; json_object *s = json_object_array_get_idx (stations, i); @@ -229,7 +229,7 @@ if (mix != NULL) { PianoStation_t *curStation = ph->stations; PianoListForeachP (curStation) { - for (int i = 0; i < json_object_array_length (mix); i++) { + for (unsigned int i = 0; i < json_object_array_length (mix); i++) { json_object *id = json_object_array_get_idx (mix, i); if (strcmp (json_object_get_string (id), curStation->id) == 0) { @@ -256,7 +256,7 @@ } assert (items != NULL); - for (int i = 0; i < json_object_array_length (items); i++) { + for (unsigned int i = 0; i < json_object_array_length (items); i++) { json_object *s = json_object_array_get_idx (items, i); PianoSong_t *song; @@ -377,7 +377,7 @@ /* get artists */ json_object *artists; if (json_object_object_get_ex (result, "artists", &artists)) { - for (int i = 0; i < json_object_array_length (artists); i++) { + for (unsigned int i = 0; i < json_object_array_length (artists); i++) { json_object *a = json_object_array_get_idx (artists, i); PianoArtist_t *artist; @@ -396,7 +396,7 @@ /* get songs */ json_object *songs; if (json_object_object_get_ex (result, "songs", &songs)) { - for (int i = 0; i < json_object_array_length (songs); i++) { + for (unsigned int i = 0; i < json_object_array_length (songs); i++) { json_object *s = json_object_array_get_idx (songs, i); PianoSong_t *song; @@ -456,7 +456,7 @@ /* get genre stations */ json_object *categories; if (json_object_object_get_ex (result, "categories", &categories)) { - for (int i = 0; i < json_object_array_length (categories); i++) { + for (unsigned int i = 0; i < json_object_array_length (categories); i++) { json_object *c = json_object_array_get_idx (categories, i); PianoGenreCategory_t *tmpGenreCategory; @@ -471,7 +471,7 @@ /* get genre subnodes */ json_object *stations; if (json_object_object_get_ex (c, "stations", &stations)) { - for (int k = 0; + for (unsigned int k = 0; k < json_object_array_length (stations); k++) { json_object *s = json_object_array_get_idx (stations, k); @@ -520,12 +520,13 @@ assert (reqData != NULL); json_object *explanations; - if (json_object_object_get_ex (result, "explanations", &explanations)) { + if (json_object_object_get_ex (result, "explanations", &explanations) && + json_object_array_length (explanations) > 0) { reqData->retExplain = malloc (strSize * sizeof (*reqData->retExplain)); strncpy (reqData->retExplain, "We're playing this track " "because it features ", strSize); - for (int i = 0; i < json_object_array_length (explanations); i++) { + for (unsigned int i = 0; i < json_object_array_length (explanations); i++) { json_object *e = json_object_array_get_idx (explanations, i); json_object *f; @@ -573,7 +574,7 @@ /* songs */ json_object *songs; if (json_object_object_get_ex (music, "songs", &songs)) { - for (int i = 0; i < json_object_array_length (songs); i++) { + for (unsigned int i = 0; i < json_object_array_length (songs); i++) { json_object *s = json_object_array_get_idx (songs, i); PianoSong_t *seedSong; @@ -594,7 +595,7 @@ /* artists */ json_object *artists; if (json_object_object_get_ex (music, "artists", &artists)) { - for (int i = 0; i < json_object_array_length (artists); i++) { + for (unsigned int i = 0; i < json_object_array_length (artists); i++) { json_object *a = json_object_array_get_idx (artists, i); PianoArtist_t *seedArtist; @@ -622,7 +623,7 @@ continue; } assert (json_object_is_type (val, json_type_array)); - for (int i = 0; i < json_object_array_length (val); i++) { + for (unsigned int i = 0; i < json_object_array_length (val); i++) { json_object *s = json_object_array_get_idx (val, i); PianoSong_t *feedbackSong; @@ -665,7 +666,7 @@ json_object *availableModes; if (json_object_object_get_ex (result, "availableModes", &availableModes)) { - for (int i = 0; i < json_object_array_length (availableModes); i++) { + for (unsigned int i = 0; i < json_object_array_length (availableModes); i++) { json_object *val = json_object_array_get_idx (availableModes, i); assert (json_object_is_type (val, json_type_object)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/src/player.c new/pianobar-2024.12.21/src/player.c --- old/pianobar-2022.04.01/src/player.c 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/src/player.c 2024-12-21 12:41:13.000000000 +0100 @@ -235,7 +235,7 @@ softfail ("avcodec_parameters_to_context"); } - AVCodec * const decoder = avcodec_find_decoder (cp->codec_id); + const AVCodec * const decoder = avcodec_find_decoder (cp->codec_id); if (decoder == NULL) { softfail ("find_decoder"); } @@ -282,11 +282,13 @@ /* abuffer */ AVRational time_base = player->st->time_base; + char channelLayout[128]; + av_channel_layout_describe(&player->cctx->ch_layout, channelLayout, sizeof(channelLayout)); snprintf (strbuf, sizeof (strbuf), - "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=0x%"PRIx64, + "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=%s", time_base.num, time_base.den, cp->sample_rate, av_get_sample_fmt_name (player->cctx->sample_fmt), - cp->channel_layout); + channelLayout); if ((ret = avfilter_graph_create_filter (&player->fabuf, avfilter_get_by_name ("abuffer"), "source", strbuf, NULL, player->fgraph)) < 0) { @@ -340,7 +342,7 @@ memset (&aoFmt, 0, sizeof (aoFmt)); aoFmt.bits = av_get_bytes_per_sample (avformat) * 8; assert (aoFmt.bits > 0); - aoFmt.channels = cp->channels; + aoFmt.channels = cp->ch_layout.nb_channels; aoFmt.rate = getSampleRate (player); aoFmt.byte_format = AO_FMT_NATIVE; @@ -431,8 +433,12 @@ } else if (ret < 0) { /* error, abort */ /* mark the EOF, so that BarAoPlayThread can quit*/ - debugPrint (DEBUG_AUDIO, "av_read_frame failed with code %i, sending " - "NULL frame\n", ret); + char error[AV_ERROR_MAX_STRING_SIZE]; + if (av_strerror(ret, error, sizeof(error)) < 0) { + strncpy (error, "(unknown)", sizeof(error)-1); + } + debugPrint (DEBUG_AUDIO, "av_read_frame failed with code %i (%s), " + "sending NULL frame\n", ret, error); pthread_mutex_lock (&player->aoplayLock); const int rt = av_buffersrc_add_frame (player->fabuf, NULL); assert (rt == 0); @@ -508,7 +514,7 @@ player->fgraph = NULL; } if (player->cctx != NULL) { - avcodec_close (player->cctx); + avcodec_free_context (&player->cctx); player->cctx = NULL; } if (player->fctx != NULL) { @@ -533,7 +539,9 @@ if (openFilter (player) && openDevice (player)) { changeMode (player, PLAYER_PLAYING); BarPlayerSetVolume (player); - retry = play (player) == AVERROR_INVALIDDATA && + const int ret = play (player); + retry = (ret == AVERROR_INVALIDDATA || + ret == -ECONNRESET) && !player->interrupted; } else { /* filter missing or audio device busy */ @@ -583,8 +591,7 @@ } pthread_mutex_unlock (&player->aoplayLock); - const int numChannels = av_get_channel_layout_nb_channels ( - filteredFrame->channel_layout); + const int numChannels = filteredFrame->ch_layout.nb_channels; const int bps = av_get_bytes_per_sample (filteredFrame->format); ao_play (player->aoDev, (char *) filteredFrame->data[0], filteredFrame->nb_samples * numChannels * bps); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/src/ui.c new/pianobar-2024.12.21/src/ui.c --- old/pianobar-2022.04.01/src/ui.c 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/src/ui.c 2024-12-21 12:41:13.000000000 +0100 @@ -161,8 +161,8 @@ /* libcurl progress callback. aborts the current request if user pressed ^C */ -int progressCb (void * const data, double dltotal, double dlnow, - double ultotal, double ulnow) { +int progressCb (void * const data, curl_off_t dltotal, curl_off_t dlnow, + curl_off_t ultotal, curl_off_t ulnow) { const sig_atomic_t lint = *((sig_atomic_t *) data); if (lint) { return 1; @@ -224,8 +224,8 @@ setAndCheck (CURLOPT_POSTFIELDS, req->postData); setAndCheck (CURLOPT_WRITEFUNCTION, httpFetchCb); setAndCheck (CURLOPT_WRITEDATA, &buffer); - setAndCheck (CURLOPT_PROGRESSFUNCTION, progressCb); - setAndCheck (CURLOPT_PROGRESSDATA, &lint); + setAndCheck (CURLOPT_XFERINFOFUNCTION, progressCb); + setAndCheck (CURLOPT_XFERINFODATA, &lint); setAndCheck (CURLOPT_NOPROGRESS, 0); setAndCheck (CURLOPT_POST, 1); setAndCheck (CURLOPT_TIMEOUT, settings->timeout); @@ -844,6 +844,49 @@ return i; } +enum { + NO_DURATION = 0, +}; +#define NO_POSTFIX "" + +/* Print song information to the eventcmd stream + * @param Event command stream. + * @param Song information. + * @param Printed key name postfix, use NO_POSTFIX to print bare keys. + * @param Override song length from song parameter, use NO_DURATION if unavailable. + */ +static void BarUiEventcmdPrintSong (FILE * restrict stream, + const PianoSong_t * const song, const char * const postfix, + const unsigned int songDuration) { + assert (song != NULL); + assert (stream != NULL); + assert (postfix != NULL); + + fprintf (stream, + "artist%s=%s\n" + "title%s=%s\n" + "album%s=%s\n" + "coverArt%s=%s\n" + "rating%s=%i\n" + "detailUrl%s=%s\n" + "songDuration%s=%u\n", + postfix, + song->artist, + postfix, + song->title, + postfix, + song->album, + postfix, + song->coverArt, + postfix, + song->rating, + postfix, + song->detailUrl, + postfix, + songDuration == NO_DURATION ? song->length : songDuration + ); +} + /* Excute external event handler * @param settings containing the cmdline * @param event type @@ -900,36 +943,37 @@ pthread_mutex_unlock (&player->lock); fprintf (pipeWriteFd, - "artist=%s\n" - "title=%s\n" - "album=%s\n" - "coverArt=%s\n" "stationName=%s\n" "songStationName=%s\n" "pRet=%i\n" "pRetStr=%s\n" "wRet=%i\n" "wRetStr=%s\n" - "songDuration=%u\n" - "songPlayed=%u\n" - "rating=%i\n" - "detailUrl=%s\n", - curSong == NULL ? "" : curSong->artist, - curSong == NULL ? "" : curSong->title, - curSong == NULL ? "" : curSong->album, - curSong == NULL ? "" : curSong->coverArt, + "songPlayed=%u\n", curStation == NULL ? "" : curStation->name, songStation == NULL ? "" : songStation->name, pRet, PianoErrorToStr (pRet), wRet, curl_easy_strerror (wRet), - songDuration, - songPlayed, - curSong == NULL ? PIANO_RATE_NONE : curSong->rating, - curSong == NULL ? "" : curSong->detailUrl + songPlayed ); + if (curSong != NULL) { + BarUiEventcmdPrintSong (pipeWriteFd, curSong, NO_POSTFIX, songDuration); + } + + const PianoSong_t *nextSong = PianoListNextP (curSong); + if (nextSong != NULL) { + unsigned int i = 0; + PianoListForeachP (nextSong) { + char postfix[16]; + snprintf (postfix, sizeof(postfix)-1, "Next%i", i); + BarUiEventcmdPrintSong (pipeWriteFd, nextSong, postfix, NO_DURATION); + i++; + } + } + if (stations != NULL) { /* send station list */ PianoStation_t **sortedStations = NULL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pianobar-2022.04.01/src/ui_act.c new/pianobar-2024.12.21/src/ui_act.c --- old/pianobar-2022.04.01/src/ui_act.c 2022-04-01 13:02:42.000000000 +0200 +++ new/pianobar-2024.12.21/src/ui_act.c 2024-12-21 12:41:13.000000000 +0100 @@ -271,8 +271,12 @@ BarUiMsg (&app->settings, MSG_INFO, "Receiving explanation... "); if (BarUiActDefaultPianoCall (PIANO_REQUEST_EXPLAIN, &reqData)) { - BarUiMsg (&app->settings, MSG_INFO, "%s\n", reqData.retExplain); - free (reqData.retExplain); + if (reqData.retExplain == NULL) { + BarUiMsg (&app->settings, MSG_ERR, "No explanation provided.\n"); + } else { + BarUiMsg (&app->settings, MSG_INFO, "%s\n", reqData.retExplain); + free (reqData.retExplain); + } } BarUiActDefaultEventcmd ("songexplain"); }
