[packages/mixxx] - updated to 2.4.1; added patch for microsoft-gsl headers in subdir and conditional patch to allow t

qboosh qboosh at pld-linux.org
Wed Sep 25 19:47:36 CEST 2024


commit 19e9101b07b57b2b19be0151a2a5c394fbf34acc
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Wed Sep 25 19:49:45 2024 +0200

    - updated to 2.4.1; added patch for microsoft-gsl headers in subdir and conditional patch to allow taglib 2.0.x

 mixxx-msgsl.patch   |  20 ++++++
 mixxx-taglib2.patch | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 mixxx.spec          |  92 ++++++++++++++------------
 3 files changed, 253 insertions(+), 43 deletions(-)
---
diff --git a/mixxx.spec b/mixxx.spec
index 8e952a9..81285ee 100644
--- a/mixxx.spec
+++ b/mixxx.spec
@@ -1,3 +1,4 @@
+# TODO: system djinterop >= 0.20.2, shoutidjc >= 2.4.6?
 #
 # Conditional build:
 %bcond_without	faad		# FAAD AAC audio decoder
@@ -5,22 +6,25 @@
 %bcond_without	hidapi		# HID controller support
 %bcond_without	lv2		# LV2 support
 %bcond_without	qtkeychain	# secure credentials storage for Live Broadcasting profiles (qt5 only, see below)
+%bcond_with	taglib2		# allow Taglib 2 (not fully supported)
 %bcond_without	upower		# UPower battery state support
 %bcond_without	wavpack		# WavPack audio decoder
 
-%define		qt5_ver		5.0
+%define		qt5_ver		5.12
 
 Summary:	Mixxx - DJ tool
 Summary(hu.UTF-8):	Mixxx - DJ program
 Summary(pl.UTF-8):	Mixxx - narzędzie dla DJ-ów
 Name:		mixxx
-Version:	2.3.3
-Release:	4
+Version:	2.4.1
+Release:	1
 License:	GPL v2+ (code), Apache v2.0 (OpenSans font), Ubuntu Font License v1.0 (Ubuntu fonts)
 Group:		X11/Applications/Multimedia
 Source0:	https://github.com/mixxxdj/mixxx/archive/%{version}/%{name}-%{version}.tar.gz
-# Source0-md5:	486d370480980fa59613dd992bab312c
+# Source0-md5:	95d2cc0cb35b88164615a75d9466bc0f
 Patch0:		%{name}-build-type.patch
+Patch1:		%{name}-taglib2.patch
+Patch2:		%{name}-msgsl.patch
 URL:		https://mixxx.org/
 BuildRequires:	OpenGL-devel
 BuildRequires:	Qt5Concurrent-devel >= %{qt5_ver}
@@ -30,6 +34,8 @@ BuildRequires:	Qt5Gui-devel >= %{qt5_ver}
 %{?with_qtkeychain:BuildRequires:	Qt5Keychain-devel}
 BuildRequires:	Qt5Network-devel >= %{qt5_ver}
 BuildRequires:	Qt5OpenGL-devel >= %{qt5_ver}
+BuildRequires:	Qt5PrintSupport-devel >= %{qt5_ver}
+BuildRequires:	Qt5Qml-devel >= %{qt5_ver}
 BuildRequires:	Qt5Script-devel >= %{qt5_ver}
 BuildRequires:	Qt5ScriptTools-devel >= %{qt5_ver}
 BuildRequires:	Qt5Sql-devel >= %{qt5_ver}
@@ -39,11 +45,12 @@ BuildRequires:	Qt5Widgets-devel >= %{qt5_ver}
 BuildRequires:	Qt5X11Extras-devel >= %{qt5_ver}
 BuildRequires:	Qt5Xml-devel >= %{qt5_ver}
 BuildRequires:	cmake >= 3.16
-# libavcodec >= 58 libavformat >= 58 libavutil >= 56 libswresample >= 3.1
-%{?with_ffmpeg:BuildRequires:	ffmpeg-devel >= 4.0}
+# libavcodec >= 58.35.100 libavformat >= 58.20.100 libavutil >= 56.22.100 libswresample >= 3.3.100
+%{?with_ffmpeg:BuildRequires:	ffmpeg-devel >= 4.1.9}
 BuildRequires:	flac-devel
 %{?with_upower:BuildRequires:	glib2-devel >= 2.0}
-%{?with_hidapi:BuildRequires:	hidapi-devel >= 0.10.1}
+BuildRequires:	gtest-devel
+%{?with_hidapi:BuildRequires:	hidapi-devel >= 0.11.2}
 BuildRequires:	lame-libs-devel
 BuildRequires:	libchromaprint-devel
 BuildRequires:	libebur128-devel
@@ -51,14 +58,16 @@ BuildRequires:	libid3tag-devel
 BuildRequires:	libmad-devel
 BuildRequires:	libmodplug-devel
 BuildRequires:	libogg-devel
-BuildRequires:	libkeyfinder-devel >= 2.2.6
+BuildRequires:	libkeyfinder-devel >= 2.2.8
 # TODO: use system package when appropriate version gets released
 #BuildRequires:	libshout-idjc-devel >= 2.4.6
 BuildRequires:	libsndfile-devel
-BuildRequires:	libstdc++-devel >= 6:4.7
+# -std=c++20
+BuildRequires:	libstdc++-devel >= 6:8
 BuildRequires:	libusb-devel >= 1.0
 BuildRequires:	libvorbis-devel
 %{?with_lv2:BuildRequires:	lilv-devel >= 0.5}
+BuildRequires:	microsoft-gsl-devel
 # or mpeg4ip (libmp4), but mp4v2 is preferred
 %{?with_faad:BuildRequires:	mp4v2-devel}
 BuildRequires:	openssl-devel
@@ -76,13 +85,21 @@ BuildRequires:	rpmbuild(macros) >= 1.605
 BuildRequires:	sed >= 4.0
 BuildRequires:	soundtouch-devel >= 2.1.2
 BuildRequires:	sqlite3-devel >= 3
-BuildRequires:	taglib-devel
+BuildRequires:	taglib-devel >= 1.11
+%{!?with_taglib2:BuildRequires:	taglib-devel < 2}
 BuildRequires:	udev-devel
 %{?with_upower:BuildRequires:	upower-devel}
 %{?with_wavpack:BuildRequires:	wavpack-devel}
 BuildRequires:	xorg-lib-libX11-devel
+# for local djinterop
+BuildRequires:	zlib-devel >= 1.2.8
 Requires:	Qt5Sql-sqldriver-sqlite3 >= %{qt5_ver}
-%{?with_hidapi:Requires:	hidapi >= 0.10.1}
+%{?with_ffmpeg:Requires:	ffmpeg-libs >= 4.1.9}
+%{?with_hidapi:Requires:	hidapi >= 0.11.2}
+Requires:	libkeyfinder >= 2.2.8
+Requires:	soundtouch >= 2.1.2
+Requires:	taglib >= 1.11
+Requires:	zlib >= 1.2.8
 Obsoletes:	mixxx-translations < 1.11.0-5
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
@@ -115,13 +132,12 @@ Podstawowe skórki dla programu Mixxx.
 %prep
 %setup -q
 %patch0 -p1
-
-%{__sed} -i -e '1s,/usr/bin/env node,%{_bindir}/node,' \
-      res/controllers/novation-launchpad/scripts/*.js
+%{?with_taglib2:%patch1 -p1}
+%patch2 -p1
 
 %build
-#export QMAKE_CXX="%{__cxx}"
 %cmake -B build \
+	-DCMAKE_DISABLE_PRECOMPILE_HEADERS=ON \
 	%{!?with_upower:-DBATTERY=OFF} \
 	%{!?with_faad:-DFAAD=OFF} \
 	%{!?with_ffmpeg:-DFFMPEG=OFF} \
@@ -141,33 +157,20 @@ rm -rf $RPM_BUILD_ROOT
 
 # packaged as %doc
 %{__rm} $RPM_BUILD_ROOT%{_docdir}/{COPYING,LICENSE,Mixxx-Keyboard-Shortcuts.pdf,README.md}
+# not used on Linux
+%{__rm} $RPM_BUILD_ROOT%{_iconsdir}/hicolor/scalable/apps/mixxx_macos.svg
 
-# what a mess...
-# both ca and ca-ES exist, both up to date, with few differences... keep ca
-%{__rm} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_ca_ES.qm
-# both el and el_GR exist, the first is more complete
-%{__rm} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_el_GR.qm
-# both es and es_ES exist, the first is outdated
+# both es and es_ES exist, the first is more outdated
 %{__mv} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_{es_ES,es}.qm
-# both fr and fr_FR exist, the latter is outdated
-%{__rm} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_fr_FR.qm
-# both he and he_IL exist, both look complete, the latter is more fresh(?)
-%{__mv} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_{he_IL,he}.qm
-# both it and it_IT exist, the first is unfinished
-%{__mv} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_{it_IT,it}.qm
-# both mi and mi_NZ exist, both are unfinished, the latter has outdated line pointers
-%{__rm} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_mi_NZ.qm
-# both nl and nl_NL exist, the latter seems little better ("Quick Links" untrnaslated in the first)
-%{__mv} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_{nl_NL,nl}.qm
-# both pt and pt_PT exist, the first is outdated
+# both pt and pt_PT exist, the first is more outdated
 %{__mv} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_{pt_PT,pt}.qm
-# both ru and ru_RU exist, the first seem more complete ("M3U Playlist...")
-%{__rm} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_ru_RU.qm
-# both zh_TW and zh_TW.Big5 exist, thr latter is outdated
-%{__rm} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_zh_TW.Big5.qm
 # unify using short code
 %{__mv} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_{hi_IN,hi}.qm
 %{__mv} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_{sq_AL,sq}.qm
+# stick to per-country files
+%{__rm} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_es_419.qm
+# which variant? zh_CN,zh_HK,zh_TW are also present
+%{__rm} $RPM_BUILD_ROOT%{_datadir}/mixxx/translations/mixxx_zh.qm
 
 %clean
 rm -rf $RPM_BUILD_ROOT
@@ -180,9 +183,8 @@ rm -rf $RPM_BUILD_ROOT
 %{_datadir}/metainfo/org.mixxx.Mixxx.metainfo.xml
 %dir %{_datadir}/mixxx
 %{_datadir}/mixxx/controllers
-#%{_datadir}/mixxx/fonts
+%{_datadir}/mixxx/effects
 %{_datadir}/mixxx/keyboard
-%{_datadir}/mixxx/script
 %dir %{_datadir}/mixxx/skins
 %{_datadir}/mixxx/skins/*.qss
 # This is the default skin
@@ -198,10 +200,17 @@ rm -rf $RPM_BUILD_ROOT
 %lang(da) %{_datadir}/mixxx/translations/mixxx_da.qm
 %lang(de) %{_datadir}/mixxx/translations/mixxx_de.qm
 %lang(el) %{_datadir}/mixxx/translations/mixxx_el.qm
-%lang(en) %{_datadir}/mixxx/translations/mixxx_en_GB.qm
+%lang(en_CA) %{_datadir}/mixxx/translations/mixxx_en_CA.qm
+%lang(en_GB) %{_datadir}/mixxx/translations/mixxx_en_GB.qm
 %lang(eo) %{_datadir}/mixxx/translations/mixxx_eo.qm
 %lang(es) %{_datadir}/mixxx/translations/mixxx_es.qm
+%lang(es_AR) %{_datadir}/mixxx/translations/mixxx_es_AR.qm
+%lang(es_CO) %{_datadir}/mixxx/translations/mixxx_es_CO.qm
+%lang(es_CR) %{_datadir}/mixxx/translations/mixxx_es_CR.qm
+%lang(es_EC) %{_datadir}/mixxx/translations/mixxx_es_EC.qm
 %lang(es_MX) %{_datadir}/mixxx/translations/mixxx_es_MX.qm
+%lang(es_PA) %{_datadir}/mixxx/translations/mixxx_es_PA.qm
+%lang(es_UY) %{_datadir}/mixxx/translations/mixxx_es_UY.qm
 %lang(et) %{_datadir}/mixxx/translations/mixxx_et.qm
 %lang(eu) %{_datadir}/mixxx/translations/mixxx_eu.qm
 %lang(fa) %{_datadir}/mixxx/translations/mixxx_fa.qm
@@ -214,13 +223,11 @@ rm -rf $RPM_BUILD_ROOT
 %lang(hr) %{_datadir}/mixxx/translations/mixxx_hr.qm
 %lang(hu) %{_datadir}/mixxx/translations/mixxx_hu.qm
 %lang(hy) %{_datadir}/mixxx/translations/mixxx_hy.qm
-%lang(ia) %{_datadir}/mixxx/translations/mixxx_ia.qm
 %lang(id) %{_datadir}/mixxx/translations/mixxx_id.qm
 %lang(is) %{_datadir}/mixxx/translations/mixxx_is.qm
 %lang(it) %{_datadir}/mixxx/translations/mixxx_it.qm
 %lang(ja) %{_datadir}/mixxx/translations/mixxx_ja.qm
 %lang(ko) %{_datadir}/mixxx/translations/mixxx_ko.qm
-%lang(ky) %{_datadir}/mixxx/translations/mixxx_ky.qm
 %lang(lb) %{_datadir}/mixxx/translations/mixxx_lb.qm
 %lang(lt) %{_datadir}/mixxx/translations/mixxx_lt.qm
 %lang(lv) %{_datadir}/mixxx/translations/mixxx_lv.qm
@@ -233,7 +240,6 @@ rm -rf $RPM_BUILD_ROOT
 %lang(my) %{_datadir}/mixxx/translations/mixxx_my.qm
 %lang(nb) %{_datadir}/mixxx/translations/mixxx_nb.qm
 %lang(nl) %{_datadir}/mixxx/translations/mixxx_nl.qm
-%lang(nl_BE) %{_datadir}/mixxx/translations/mixxx_nl_BE.qm
 %lang(nn) %{_datadir}/mixxx/translations/mixxx_nn.qm
 %lang(oc) %{_datadir}/mixxx/translations/mixxx_oc.qm
 %lang(pl) %{_datadir}/mixxx/translations/mixxx_pl.qm
@@ -248,7 +254,6 @@ rm -rf $RPM_BUILD_ROOT
 %lang(sq) %{_datadir}/mixxx/translations/mixxx_sq.qm
 %lang(sr) %{_datadir}/mixxx/translations/mixxx_sr.qm
 %lang(sv) %{_datadir}/mixxx/translations/mixxx_sv.qm
-%lang(ta) %{_datadir}/mixxx/translations/mixxx_ta.qm
 %lang(te) %{_datadir}/mixxx/translations/mixxx_te.qm
 %lang(tr) %{_datadir}/mixxx/translations/mixxx_tr.qm
 %lang(uk) %{_datadir}/mixxx/translations/mixxx_uk.qm
@@ -266,6 +271,7 @@ rm -rf $RPM_BUILD_ROOT
 # note: "?" is used to catch spaces (I can't see any way to match space explicitly in rpm)
 %{_datadir}/mixxx/skins/Deere?(64?Samplers)
 %{_datadir}/mixxx/skins/LateNight
+%{_datadir}/mixxx/skins/LateNight?(64?Samplers)
 %{_datadir}/mixxx/skins/Shade
 %{_datadir}/mixxx/skins/Tango
 %{_datadir}/mixxx/skins/Tango?(64?Samplers)
diff --git a/mixxx-msgsl.patch b/mixxx-msgsl.patch
new file mode 100644
index 0000000..9c0108d
--- /dev/null
+++ b/mixxx-msgsl.patch
@@ -0,0 +1,20 @@
+--- mixxx-2.4.1/CMakeLists.txt.orig	2024-05-08 23:05:56.000000000 +0200
++++ mixxx-2.4.1/CMakeLists.txt	2024-09-25 18:27:13.893167991 +0200
+@@ -1754,7 +1754,7 @@ endif()
+ # src/qmldlgpreferencesproxy.h, which is #included from src/qmlapplication.h.
+ target_include_directories(mixxx PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/mixxx-lib_autogen/include")
+ set_target_properties(mixxx-lib PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY}")
+-target_link_libraries(mixxx PRIVATE mixxx-lib mixxx-gitinfostore)
++target_link_libraries(mixxx PRIVATE mixxx-lib mixxx-gitinfostore Microsoft.GSL::GSL)
+ 
+ #
+ # Installation and Packaging
+@@ -2106,7 +2106,7 @@ add_executable(mixxx-test
+ target_precompile_headers(mixxx-test REUSE_FROM mixxx-lib)
+ find_package(GTest CONFIG REQUIRED)
+ set_target_properties(mixxx-test PROPERTIES AUTOMOC ON)
+-target_link_libraries(mixxx-test PRIVATE mixxx-lib mixxx-gitinfostore GTest::gtest GTest::gmock)
++target_link_libraries(mixxx-test PRIVATE mixxx-lib mixxx-gitinfostore GTest::gtest GTest::gmock Microsoft.GSL::GSL)
+ 
+ find_package(benchmark)
+ target_link_libraries(mixxx-test PRIVATE benchmark::benchmark)
diff --git a/mixxx-taglib2.patch b/mixxx-taglib2.patch
new file mode 100644
index 0000000..4f976b6
--- /dev/null
+++ b/mixxx-taglib2.patch
@@ -0,0 +1,184 @@
+From dffb164606ee15b320d8f457e96683aa497682ab Mon Sep 17 00:00:00 2001
+From: Jan Holthuis <jholthuis at mixxx.org>
+Date: Sun, 11 Feb 2024 21:43:28 +0100
+Subject: [PATCH] build: Print a warning instead of aborting build if TagLib
+ 2.0 is used
+
+---
+ CMakeLists.txt | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index ba6fd58918c..276dcc1f751 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -2951,11 +2951,7 @@ target_link_libraries(mixxx-lib PRIVATE
+ find_package(TagLib 1.11 REQUIRED)
+ target_link_libraries(mixxx-lib PUBLIC TagLib::TagLib)
+ if (NOT TagLib_VERSION VERSION_LESS 2.0.0)
+-    message(FATAL_ERROR "Installed Taglib ${TagLib_VERSION} is not supported. Use Version >= 1.11 and < 2.0 and its development headers.")
+-    # Dear package maintainer: Do not patch away this fatal error
+-    # using taglib 2.0.0 will put user data at risk!!
+-    # Mixxx is a complex application that needs to be adapted and tested thoroughly
+-    # https://github.com/mixxxdj/mixxx/issues/12708
++  message(WARNING "Installed Taglib ${TagLib_VERSION} is not supported and might lead to data loss (https://github.com/mixxxdj/mixxx/issues/12708). Use version >= 1.11 and < 2.0 instead.")
+ endif()
+ 
+ # Threads
+From ed547fd2b0f9dee98740fcf32c1307a092470322 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer at mixxx.org>
+Date: Tue, 20 Feb 2024 22:59:18 +0100
+Subject: [PATCH 1/3] Add multi value protection for all muti-value tags: (Add
+ title album and comment as well)
+
+---
+ src/track/taglib/trackmetadata_common.cpp | 24 +++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+diff --git a/src/track/taglib/trackmetadata_common.cpp b/src/track/taglib/trackmetadata_common.cpp
+index 77c84f41bbd..e4609bc0558 100644
+--- a/src/track/taglib/trackmetadata_common.cpp
++++ b/src/track/taglib/trackmetadata_common.cpp
+@@ -274,20 +274,25 @@ void exportTrackMetadataIntoTag(
+         WriteTagMask writeMask) {
+     DEBUG_ASSERT(pTag); // already validated before
+ 
+-    pTag->setTitle(toTString(trackMetadata.getTrackInfo().getTitle()));
+-    pTag->setAlbum(toTString(trackMetadata.getAlbumInfo().getTitle()));
+-
+     // The mapping of multi-valued fields in TagLib is not bijective.
+     // We don't want to overwrite existing values if the corresponding
+-    // field has not been modified in Mixxx. This workaround only covers
+-    // the most common multi-valued fields.
++    // field has not been modified in Mixxx.
+     //
+     // See also: <https://github.com/mixxxdj/mixxx/issues/12587>
+-    const auto artist = toTString(trackMetadata.getTrackInfo().getArtist());
++
++    const TagLib::String title = toTString(trackMetadata.getTrackInfo().getTitle());
++    if (title != pTag->title()) {
++        pTag->setTitle(title);
++    }
++    const TagLib::String album = toTString(trackMetadata.getAlbumInfo().getTitle());
++    if (album != pTag->album()) {
++        pTag->setAlbum(album);
++    }
++    const TagLib::String artist = toTString(trackMetadata.getTrackInfo().getArtist());
+     if (artist != pTag->artist()) {
+         pTag->setArtist(artist);
+     }
+-    const auto genre = toTString(trackMetadata.getTrackInfo().getGenre());
++    const TagLib::String genre = toTString(trackMetadata.getTrackInfo().getGenre());
+     if (genre != pTag->genre()) {
+         pTag->setGenre(genre);
+     }
+@@ -297,7 +302,10 @@ void exportTrackMetadataIntoTag(
+     // different purposes, e.g. ID3v2. In this case setting the
+     // comment here should be omitted.
+     if (0 == (writeMask & WriteTagFlag::OmitComment)) {
+-        pTag->setComment(toTString(trackMetadata.getTrackInfo().getComment()));
++        const TagLib::String comment = toTString(trackMetadata.getTrackInfo().getComment());
++        if (comment != pTag->comment()) {
++            pTag->setComment(comment);
++        }
+     }
+ 
+     // Specialized write functions for tags derived from Taglib::Tag might
+
+From c052808ca4b27050e99ce9fab9f0b53e90377eed Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer at mixxx.org>
+Date: Tue, 20 Feb 2024 23:01:18 +0100
+Subject: [PATCH 2/3] Introduce isMultiValueTagEqual() that compares in the
+ QString domain to sort out encoding issues.
+
+---
+ src/track/taglib/trackmetadata_common.cpp | 30 +++++++++++------------
+ 1 file changed, 14 insertions(+), 16 deletions(-)
+
+diff --git a/src/track/taglib/trackmetadata_common.cpp b/src/track/taglib/trackmetadata_common.cpp
+index e4609bc0558..fffa9f8170a 100644
+--- a/src/track/taglib/trackmetadata_common.cpp
++++ b/src/track/taglib/trackmetadata_common.cpp
+@@ -268,6 +268,10 @@ void importTrackMetadataFromTag(
+     }
+ }
+ 
++bool isMultiValueTagEqual(const TagLib::String& taglibVal, const QString& mixxxVal) {
++    return toQString(taglibVal) == mixxxVal;
++}
++
+ void exportTrackMetadataIntoTag(
+         TagLib::Tag* pTag,
+         const TrackMetadata& trackMetadata,
+@@ -279,22 +283,17 @@ void exportTrackMetadataIntoTag(
+     // field has not been modified in Mixxx.
+     //
+     // See also: <https://github.com/mixxxdj/mixxx/issues/12587>
+-
+-    const TagLib::String title = toTString(trackMetadata.getTrackInfo().getTitle());
+-    if (title != pTag->title()) {
+-        pTag->setTitle(title);
++    if (!isMultiValueTagEqual(pTag->title(), trackMetadata.getTrackInfo().getTitle())) {
++        pTag->setTitle(toTString(trackMetadata.getTrackInfo().getTitle()));
+     }
+-    const TagLib::String album = toTString(trackMetadata.getAlbumInfo().getTitle());
+-    if (album != pTag->album()) {
+-        pTag->setAlbum(album);
++    if (!isMultiValueTagEqual(pTag->album(), trackMetadata.getAlbumInfo().getTitle())) {
++        pTag->setAlbum(toTString(trackMetadata.getAlbumInfo().getTitle()));
+     }
+-    const TagLib::String artist = toTString(trackMetadata.getTrackInfo().getArtist());
+-    if (artist != pTag->artist()) {
+-        pTag->setArtist(artist);
++    if (!isMultiValueTagEqual(pTag->artist(), trackMetadata.getTrackInfo().getArtist())) {
++        pTag->setArtist(toTString(trackMetadata.getTrackInfo().getArtist()));
+     }
+-    const TagLib::String genre = toTString(trackMetadata.getTrackInfo().getGenre());
+-    if (genre != pTag->genre()) {
+-        pTag->setGenre(genre);
++    if (!isMultiValueTagEqual(pTag->genre(), trackMetadata.getTrackInfo().getGenre())) {
++        pTag->setGenre(toTString(trackMetadata.getTrackInfo().getGenre()));
+     }
+ 
+     // Using setComment() from TagLib::Tag might have undesirable
+@@ -302,9 +301,8 @@ void exportTrackMetadataIntoTag(
+     // different purposes, e.g. ID3v2. In this case setting the
+     // comment here should be omitted.
+     if (0 == (writeMask & WriteTagFlag::OmitComment)) {
+-        const TagLib::String comment = toTString(trackMetadata.getTrackInfo().getComment());
+-        if (comment != pTag->comment()) {
+-            pTag->setComment(comment);
++        if (!isMultiValueTagEqual(pTag->comment(), trackMetadata.getTrackInfo().getComment())) {
++            pTag->setComment(toTString(trackMetadata.getTrackInfo().getComment()));
+         }
+     }
+ 
+
+From c4b3a7e91c56cea7f9bd1c18c1fe01d9da705144 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer at mixxx.org>
+Date: Wed, 21 Feb 2024 00:00:06 +0100
+Subject: [PATCH 3/3] Ignore separator " / " when comparing multi value tags
+
+---
+ src/track/taglib/trackmetadata_common.cpp | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/track/taglib/trackmetadata_common.cpp b/src/track/taglib/trackmetadata_common.cpp
+index fffa9f8170a..62bb583f5a2 100644
+--- a/src/track/taglib/trackmetadata_common.cpp
++++ b/src/track/taglib/trackmetadata_common.cpp
+@@ -268,8 +268,12 @@ void importTrackMetadataFromTag(
+     }
+ }
+ 
+-bool isMultiValueTagEqual(const TagLib::String& taglibVal, const QString& mixxxVal) {
+-    return toQString(taglibVal) == mixxxVal;
++bool isMultiValueTagEqual(const TagLib::String& taglibVal, QString mixxxVal) {
++    // Taglib 2 uses " / " instead of " " as a multi value separator.
++    // We may have read or write with either TagLib 1 or 2.
++    QString taglibValStripped = toQString(taglibVal).remove(" /");
++    QString mixxxValStripped = mixxxVal.remove(" /");
++    return taglibValStripped == mixxxValStripped;
+ }
+ 
+ void exportTrackMetadataIntoTag(
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/mixxx.git/commitdiff/19e9101b07b57b2b19be0151a2a5c394fbf34acc



More information about the pld-cvs-commit mailing list