Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package kf6-baloo for openSUSE:Factory 
checked in at 2026-04-11 22:23:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kf6-baloo (Old)
 and      /work/SRC/openSUSE:Factory/.kf6-baloo.new.21863 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kf6-baloo"

Sat Apr 11 22:23:24 2026 rev:26 rq:1345860 version:6.25.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/kf6-baloo/kf6-baloo.changes      2026-03-16 
14:15:16.580150448 +0100
+++ /work/SRC/openSUSE:Factory/.kf6-baloo.new.21863/kf6-baloo.changes   
2026-04-11 22:24:06.010794661 +0200
@@ -1,0 +2,25 @@
+Tue Apr  7 19:18:43 UTC 2026 - Christophe Marin <[email protected]>
+
+- Update to 6.25.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.25.0
+- Changes since 6.24.0:
+  * Update dependency version to 6.25.0
+  * Fix remaining QFile::open nodiscard warnings
+  * [FileIndexerConfigUtils] Fix a nodiscard warning in fixture setup
+  * [FileIndexerConfigUtils] Remove unneeded QTextStream
+  * [FileIndexerConfigTest] Get rid of an almost duplicate helper function
+  * [FileIndexerConfigTest] Reduce repetitions/manual expansion
+  * [FileIndexerConfigTest] Reduce string puzzles to improve readability
+  * [FileIndexerConfigTest] Move single-use strings out of header file
+  * [DocumentUrlDBTest] Remove unused helper function
+  * [ExtractorProcess] Verify transaction was sucessfully created
+  * Tell the compiler QFile::open(fd, ...) can not fail for STDIN
+  * [Query] Use explicit percent-encoding for title and json data
+  * [QuerySerializationTest] Extend test coverage for disallowed characters
+  * [QuerySerializationTest] Cover fromSearchUrl/toSearchUrl methods
+  * [QuerySerializationTest] Make JSON roundtrip test data driven
+  * Update version to 6.25.0
+
+-------------------------------------------------------------------

Old:
----
  baloo-6.24.0.tar.xz
  baloo-6.24.0.tar.xz.sig

New:
----
  baloo-6.25.0.tar.xz
  baloo-6.25.0.tar.xz.sig

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

Other differences:
------------------
++++++ kf6-baloo.spec ++++++
--- /var/tmp/diff_new_pack.Xkm9ku/_old  2026-04-11 22:24:06.594818567 +0200
+++ /var/tmp/diff_new_pack.Xkm9ku/_new  2026-04-11 22:24:06.594818567 +0200
@@ -19,11 +19,11 @@
 %define qt6_version 6.8.0
 
 %define rname baloo
-# Full KF6 version (e.g. 6.24.0)
+# Full KF6 version (e.g. 6.25.0)
 %{!?_kf6_version: %global _kf6_version %{version}}
 %bcond_without released
 Name:           kf6-baloo
-Version:        6.24.0
+Version:        6.25.0
 Release:        0
 Summary:        Framework for searching and managing metadata
 License:        GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-3.0-only

++++++ baloo-6.24.0.tar.xz -> baloo-6.25.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/CMakeLists.txt 
new/baloo-6.25.0/CMakeLists.txt
--- old/baloo-6.24.0/CMakeLists.txt     2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/CMakeLists.txt     2026-04-03 19:06:54.000000000 +0200
@@ -1,8 +1,8 @@
 # set minimum version requirements
-cmake_minimum_required(VERSION 3.27)
-set(REQUIRED_QT_VERSION 6.8.0)
-set(KF_VERSION "6.24.0") # handled by release scripts
-set(KF_DEP_VERSION "6.24.0") # handled by release scripts
+cmake_minimum_required(VERSION 3.29)
+set(REQUIRED_QT_VERSION 6.9.0)
+set(KF_VERSION "6.25.0") # handled by release scripts
+set(KF_DEP_VERSION "6.25.0") # handled by release scripts
 
 # set up project
 project(Baloo VERSION ${KF_VERSION})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/baloo-6.24.0/autotests/unit/engine/documenturldbtest.cpp 
new/baloo-6.25.0/autotests/unit/engine/documenturldbtest.cpp
--- old/baloo-6.24.0/autotests/unit/engine/documenturldbtest.cpp        
2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/autotests/unit/engine/documenturldbtest.cpp        
2026-04-03 19:06:54.000000000 +0200
@@ -17,12 +17,6 @@
 {
     Q_OBJECT
 
-    void touchFile(const QByteArray& path) {
-        QFile file(QString::fromUtf8(path));
-        file.open(QIODevice::WriteOnly);
-        file.write("data");
-    }
-
 private Q_SLOTS:
     void testNonExistingPath() {
         /*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/baloo-6.24.0/autotests/unit/file/basicindexingjobtest.cpp 
new/baloo-6.25.0/autotests/unit/file/basicindexingjobtest.cpp
--- old/baloo-6.24.0/autotests/unit/file/basicindexingjobtest.cpp       
2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/autotests/unit/file/basicindexingjobtest.cpp       
2026-04-03 19:06:54.000000000 +0200
@@ -62,12 +62,12 @@
     };
 
     for (const auto& entry : m_testFiles) {
-       QFile file(m_workDir.filePath(entry.filename));
-       file.open(QIODevice::WriteOnly);
-       if (entry.filename.startsWith(QStringLiteral("test"))) {
-           file.write("\0", 1);
-       }
-       file.close();
+        QFile file(m_workDir.filePath(entry.filename));
+        QVERIFY(file.open(QIODevice::WriteOnly));
+        if (entry.filename.startsWith(QStringLiteral("test"))) {
+            file.write("\0", 1);
+        }
+        file.close();
     }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/baloo-6.24.0/autotests/unit/file/extractorcommandpipe_worker.cpp 
new/baloo-6.25.0/autotests/unit/file/extractorcommandpipe_worker.cpp
--- old/baloo-6.24.0/autotests/unit/file/extractorcommandpipe_worker.cpp        
2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/autotests/unit/file/extractorcommandpipe_worker.cpp        
2026-04-03 19:06:54.000000000 +0200
@@ -22,11 +22,11 @@
     QCoreApplication app(argc, argv);
 
     QFile input;
-    input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered);
+    std::ignore = input.open(STDIN_FILENO, QIODevice::ReadOnly | 
QIODevice::Unbuffered);
     QSocketNotifier inputNotifier(STDIN_FILENO, QSocketNotifier::Read);
 
     QFile output;
-    output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered);
+    std::ignore = output.open(STDOUT_FILENO, QIODevice::WriteOnly | 
QIODevice::Unbuffered);
 
     WorkerPipe worker(&input, &output);
     QObject::connect(&inputNotifier, &QSocketNotifier::activated,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/baloo-6.24.0/autotests/unit/file/extractorprocess_fake.cpp 
new/baloo-6.25.0/autotests/unit/file/extractorprocess_fake.cpp
--- old/baloo-6.24.0/autotests/unit/file/extractorprocess_fake.cpp      
2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/autotests/unit/file/extractorprocess_fake.cpp      
2026-04-03 19:06:54.000000000 +0200
@@ -35,8 +35,8 @@
     : notifier(STDIN_FILENO, QSocketNotifier::Read)
     , worker(&input, &output)
 {
-    input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered);
-    output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered);
+    std::ignore = input.open(STDIN_FILENO, QIODevice::ReadOnly | 
QIODevice::Unbuffered);
+    std::ignore = output.open(STDOUT_FILENO, QIODevice::WriteOnly | 
QIODevice::Unbuffered);
 
     QObject::connect(&notifier, //
                      &QSocketNotifier::activated,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/baloo-6.24.0/autotests/unit/file/fileindexerconfigtest.cpp 
new/baloo-6.25.0/autotests/unit/file/fileindexerconfigtest.cpp
--- old/baloo-6.24.0/autotests/unit/file/fileindexerconfigtest.cpp      
2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/autotests/unit/file/fileindexerconfigtest.cpp      
2026-04-03 19:06:54.000000000 +0200
@@ -18,6 +18,8 @@
 namespace Baloo {
 namespace Test {
 
+using namespace Qt::Literals::StringLiterals;
+
 class FileIndexerConfigTest : public QObject
 {
     Q_OBJECT
@@ -48,22 +50,53 @@
 
 namespace
 {
-const QString excludeFilter1 = QStringLiteral("build");
-const QString excludeFilter2 = QStringLiteral("foo?ar");
+// Trying to put all cases into one folder tree:
+// |- indexedRootDir
+//   |- indexedSubDir
+//     |- indexedSubSubDir
+//     |- excludedSubSubDir
+//     |- .hiddenSubSubDir
+//       |- ignoredSubFolderToIndexedHidden
+//       |- indexedSubFolderToIndexedHidden
+//   |- excludedSubDir
+//     |- indexedSubDirToExcluded
+//     |- .indexedHiddenSubDirToExcluded
+//   |- .hiddenSubDir
+//   |- .indexedHiddenSubDir
+// |- ignoredRootDir
+// |- excludedRootDir
+//
+const QString indexedRootDir = u"d1/"_s;
+const QString indexedSubDir = u"d1/sd1/"_s;
+const QString indexedSubSubDir = u"d1/sd1/ssd1/"_s;
+const QString excludedSubSubDir = u"d1/sd1/ssd2/"_s;
+const QString hiddenSubSubDir = u"d1/sd1/.ssd3/"_s;
+const QString ignoredSubFolderToIndexedHidden = u"d1/sd1/.ssd3/isfh1/"_s;
+const QString indexedSubFolderToIndexedHidden = u"d1/sd1/.ssd3/isfh2/"_s;
+const QString excludedSubDir = u"d1/sd2/"_s;
+const QString indexedSubDirToExcluded = u"d1/sd2/isde1/"_s;
+const QString indexedHiddenSubDirToExcluded = u"d1/sd2/.isde2/"_s;
+const QString hiddenSubDir = u"d1/.sd3/"_s;
+const QString indexedHiddenSubDir = u"d1/.sd4/"_s;
+const QString ignoredRootDir = u"d2/"_s;
+const QString excludedRootDir = u"d3/"_s;
+
+const QString excludeFilter1 = u"build"_s;
+const QString excludeFilter2 = u"foo?ar"_s;
 
-const QString excludedFilterSubDir1 = indexedRootDir + QLatin1String("/") + 
excludeFilter1;
-const QString excludedFilterSubSubDir1 = excludedFilterSubDir1 + 
QLatin1String("/sub1");
+const QString excludedFilterSubDir1 = indexedRootDir + u"build/"_s;
+const QString excludedFilterSubSubDir1 = indexedRootDir + u"build/sub1/"_s;
 
-const QString excludedFilterSubDir2 = indexedRootDir + 
QLatin1String("/foobar");
-const QString excludedFilterSubSubDir2 = excludedFilterSubDir2 + 
QLatin1String("/sub2");
+const QString excludedFilterSubDir2 = indexedRootDir + u"foobar/"_s;
+const QString excludedFilterSubSubDir2 = indexedRootDir + u"foobar/sub2/"_s;
 
-const QString includedFilterSubDir = excludedFilterSubDir1 + 
QLatin1String("/sub3");
-const QString includedFilterSubSubDir = includedFilterSubDir + 
QLatin1String("/sub");
+const QString includedFilterSubDir = indexedRootDir + u"build/sub3/"_s;
+const QString includedFilterSubSubDir = indexedRootDir + u"build/sub3/sub/";
 }
 
 void FileIndexerConfigTest::initTestCase()
 {
-     m_mainDir = createTmpFolders(QStringList{
+    m_mainDir = createTmpFilesAndFolders(QStringList{
         indexedRootDir,
         indexedSubDir,
         indexedSubSubDir,
@@ -84,9 +117,9 @@
         excludedFilterSubDir2,
         excludedFilterSubSubDir2,
         includedFilterSubDir,
-        includedFilterSubSubDir
-     });
-     m_dirPrefix = m_mainDir->path() + QLatin1Char('/');
+        includedFilterSubSubDir,
+    });
+    m_dirPrefix = m_mainDir->path() + QLatin1Char('/');
 }
 
 void FileIndexerConfigTest::cleanupTestCase()
@@ -119,13 +152,15 @@
     QTest::addColumn<bool>("shouldBeIndexed");
 
     for (const auto& key : indexed) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: 
%1"_s.arg(dirName)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << true;
     }
 
     for (const auto& key : excluded) {
-       QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: 
%1"_s.arg(dirName)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << false;
     }
 }
 
@@ -177,13 +212,15 @@
     QTest::addColumn<bool>("shouldBeIndexed");
 
     for (const auto& key : indexed) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: 
%1"_s.arg(dirName)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << true;
     }
 
     for (const auto& key : excluded) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: 
%1"_s.arg(dirName)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << false;
     }
 }
 
@@ -215,7 +252,7 @@
 
 void FileIndexerConfigTest::testShouldBeIndexed_data()
 {
-    const QString fileName = QStringLiteral("/somefile.txt");
+    const QString fileName = u"somefile.txt"_s;
     const auto indexed = QStringList{
         indexedRootDir,
         indexedSubDir,
@@ -224,14 +261,6 @@
         indexedSubDirToExcluded,
         indexedHiddenSubDir,
     };
-    const auto indexedFilenames = QStringList{
-        indexedRootDir + fileName,
-        indexedSubDir + fileName,
-        indexedSubSubDir + fileName,
-        indexedSubFolderToIndexedHidden + fileName,
-        indexedSubDirToExcluded + fileName,
-        indexedHiddenSubDir + fileName
-    };
     const auto excluded = QStringList{
         excludedSubSubDir,
         hiddenSubSubDir,
@@ -241,35 +270,22 @@
         ignoredRootDir,
         excludedRootDir,
     };
-    const auto excludedFilenames = QStringList{
-        excludedSubSubDir + fileName,
-        hiddenSubSubDir + fileName,
-        ignoredSubFolderToIndexedHidden + fileName,
-        excludedSubDir + fileName,
-        hiddenSubDir + fileName,
-        ignoredRootDir + fileName,
-        excludedRootDir + fileName,
-    };
 
     QTest::addColumn<QString>("path");
     QTest::addColumn<bool>("shouldBeIndexed");
 
     for (const auto& key : indexed) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
-    }
-
-    for (const auto& key : indexedFilenames) {
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: 
%1"_s.arg(dirName)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << true;
+        QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << 
true;
     }
 
     for (const auto& key : excluded) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
-    }
-
-    for (const auto& key : excludedFilenames) {
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: 
%1"_s.arg(dirName)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << false;
+        QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << 
false;
     }
 }
 
@@ -301,7 +317,8 @@
 
 void FileIndexerConfigTest::testShouldBeIndexedHidden_data()
 {
-    const QString fileName = QStringLiteral("/somefile.txt");
+    const QString fileName = u"somefile.txt"_s;
+
     const auto indexed = QStringList{
         indexedRootDir,
         indexedSubDir,
@@ -313,49 +330,29 @@
         hiddenSubDir,
         indexedHiddenSubDir
     };
-    const auto indexedFilenames = QStringList{
-        indexedRootDir + fileName,
-        indexedSubDir + fileName,
-        indexedSubSubDir + fileName,
-        hiddenSubSubDir + fileName,
-        ignoredSubFolderToIndexedHidden + fileName,
-        indexedSubFolderToIndexedHidden + fileName,
-        indexedSubDirToExcluded + fileName,
-        hiddenSubDir + fileName,
-        indexedHiddenSubDir + fileName
-    };
+
     const auto excluded = QStringList{
         excludedSubSubDir,
         excludedSubDir,
         ignoredRootDir,
-        excludedRootDir
-    };
-    const auto excludedFilenames = QStringList{
-        excludedSubSubDir + fileName,
-        excludedSubDir + fileName,
-        ignoredRootDir + fileName,
-        excludedRootDir + fileName
+        excludedRootDir,
     };
 
     QTest::addColumn<QString>("path");
     QTest::addColumn<bool>("shouldBeIndexed");
 
     for (const auto& key : indexed) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
-    }
-
-    for (const auto& key : indexedFilenames) {
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(u"Not a 
folder: %1"_s.arg(m_dirPrefix + key)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << true;
+        QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << 
true;
     }
 
     for (const auto& key : excluded) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
-    }
-
-    for (const auto& key : excludedFilenames) {
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), qPrintable(u"Not a 
folder: %1"_s.arg(m_dirPrefix + key)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << false;
+        QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << 
false;
     }
 }
 
@@ -387,49 +384,34 @@
 
 void FileIndexerConfigTest::testShouldExcludeFilterOnFolders_data()
 {
-    const QString fileName = QStringLiteral("/somefile.txt");
+    const QString fileName = u"somefile.txt"_s;
     const auto indexed = QStringList{
         indexedRootDir,
         includedFilterSubDir,
         includedFilterSubSubDir,
     };
-    const auto indexedFilenames = QStringList{
-        indexedRootDir + fileName,
-        includedFilterSubDir + fileName,
-        includedFilterSubSubDir + fileName
-    };
     const auto excluded = QStringList{
         excludedFilterSubDir1,
         excludedFilterSubSubDir1,
         excludedFilterSubDir2,
         excludedFilterSubSubDir2,
     };
-    const auto excludedFilenames = QStringList{
-        excludedFilterSubDir1 + fileName,
-        excludedFilterSubSubDir1 + fileName,
-        excludedFilterSubDir2 + fileName,
-        excludedFilterSubSubDir2 + fileName
-    };
 
     QTest::addColumn<QString>("path");
     QTest::addColumn<bool>("shouldBeIndexed");
 
     for (const auto& key : indexed) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
-    }
-
-    for (const auto& key : indexedFilenames) {
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << true;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: 
%1"_s.arg(dirName)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << true;
+        QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << 
true;
     }
 
     for (const auto& key : excluded) {
-        QVERIFY2(QFileInfo(m_dirPrefix + key).isDir(), 
qPrintable(QStringLiteral("Not a folder: %1").arg(m_dirPrefix + key)));
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
-    }
-
-    for (const auto& key : excludedFilenames) {
-        QTest::addRow("%s", qPrintable(key)) << m_dirPrefix + key << false;
+        const auto dirName = m_dirPrefix + key;
+        QVERIFY2(QFileInfo(dirName).isDir(), qPrintable(u"Not a folder: 
%1"_s.arg(dirName)));
+        QTest::addRow("%s", qPrintable(key)) << dirName << false;
+        QTest::addRow("%s - file", qPrintable(key)) << dirName + fileName << 
false;
     }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/baloo-6.24.0/autotests/unit/file/fileindexerconfigutils.h 
new/baloo-6.25.0/autotests/unit/file/fileindexerconfigutils.h
--- old/baloo-6.24.0/autotests/unit/file/fileindexerconfigutils.h       
2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/autotests/unit/file/fileindexerconfigutils.h       
2026-04-03 19:06:54.000000000 +0200
@@ -12,10 +12,10 @@
 #include <KConfigGroup>
 
 #include <memory>
+
 #include <QDir>
-#include <QTextStream>
-#include <QTemporaryDir>
 #include <QStandardPaths>
+#include <QTemporaryDir>
 
 #ifdef Q_OS_WIN
 #include <windows.h>
@@ -39,35 +39,6 @@
     fileIndexerConfig.sync();
 }
 
-std::unique_ptr<QTemporaryDir> createTmpFolders(const QStringList& folders)
-{
-    auto tmpDir = std::make_unique<QTemporaryDir>();
-    // If the temporary directory is in a hidden folder, then the tests will 
fail,
-    // so we use /tmp/ instead.
-    // TODO: Find a better solution
-    if (QFileInfo(tmpDir->path()).isHidden()) {
-        tmpDir = std::make_unique<QTemporaryDir>(QStringLiteral("/tmp/"));
-    }
-    for (const QString & f : folders) {
-        QDir dir(tmpDir->path());
-        const auto lst = f.split(QLatin1Char('/'), Qt::SkipEmptyParts);
-        for (const QString & sf : lst) {
-            if (!dir.exists(sf)) {
-                dir.mkdir(sf);
-            }
-#ifdef Q_OS_WIN
-            if(sf.startsWith(QLatin1Char('.'))) {
-                if(!SetFileAttributesW(reinterpret_cast<const 
WCHAR*>((dir.path() + "/" + sf).utf16()), FILE_ATTRIBUTE_HIDDEN)) {
-                    qWarning("failed to set 'hidden' attribute!");
-                }
-            }
-#endif
-            dir.cd(sf);
-        }
-    }
-    return tmpDir;
-}
-
 std::unique_ptr<QTemporaryDir> createTmpFilesAndFolders(const QStringList& 
list)
 {
     auto tmpDir = std::make_unique<QTemporaryDir>();
@@ -97,46 +68,16 @@
         }
         else {
             QFile file(tmpDir->path() + QLatin1Char('/') + f);
-            file.open(QIODevice::WriteOnly);
+            if (!file.open(QIODevice::WriteOnly)) {
+                return nullptr;
+            }
 
-            QTextStream stream(&file);
-            stream << "test";
+            file.write("test");
         }
     }
     return tmpDir;
 }
-//
-// Trying to put all cases into one folder tree:
-// |- indexedRootDir
-//   |- indexedSubDir
-//     |- indexedSubSubDir
-//     |- excludedSubSubDir
-//     |- .hiddenSubSubDir
-//       |- ignoredSubFolderToIndexedHidden
-//       |- indexedSubFolderToIndexedHidden
-//   |- excludedSubDir
-//     |- indexedSubDirToExcluded
-//     |- .indexedHiddenSubDirToExcluded
-//   |- .hiddenSubDir
-//   |- .indexedHiddenSubDir
-// |- ignoredRootDir
-// |- excludedRootDir
-//
-const QString indexedRootDir = QStringLiteral("d1");
-const QString indexedSubDir = QStringLiteral("d1/sd1");
-const QString indexedSubSubDir = QStringLiteral("d1/sd1/ssd1");
-const QString excludedSubSubDir = QStringLiteral("d1/sd1/ssd2");
-const QString hiddenSubSubDir = QStringLiteral("d1/sd1/.ssd3");
-const QString ignoredSubFolderToIndexedHidden = 
QStringLiteral("d1/sd1/.ssd3/isfh1");
-const QString indexedSubFolderToIndexedHidden = 
QStringLiteral("d1/sd1/.ssd3/isfh2");
-const QString excludedSubDir = QStringLiteral("d1/sd2");
-const QString indexedSubDirToExcluded = QStringLiteral("d1/sd2/isde1");
-const QString indexedHiddenSubDirToExcluded = QStringLiteral("d1/sd2/.isde2");
-const QString hiddenSubDir = QStringLiteral("d1/.sd3");
-const QString indexedHiddenSubDir = QStringLiteral("d1/.sd4");
-const QString ignoredRootDir = QStringLiteral("d2");
-const QString excludedRootDir = QStringLiteral("d3");
-}
-}
+} // namespace Test
+} // namespace Baloo
 
 #endif // FILEINDEXERCONFIGUTILS_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/autotests/unit/lib/filefetchjobtest.cpp 
new/baloo-6.25.0/autotests/unit/lib/filefetchjobtest.cpp
--- old/baloo-6.24.0/autotests/unit/lib/filefetchjobtest.cpp    2026-03-07 
21:28:47.000000000 +0100
+++ new/baloo-6.25.0/autotests/unit/lib/filefetchjobtest.cpp    2026-04-03 
19:06:54.000000000 +0200
@@ -47,7 +47,7 @@
     QVERIFY(!json.isEmpty());
 
     QTemporaryFile tempFile;
-    tempFile.open();
+    QVERIFY(tempFile.open());
 
     Document doc;
     doc.setData(json);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/baloo-6.24.0/autotests/unit/lib/queryserializationtest.cpp 
new/baloo-6.25.0/autotests/unit/lib/queryserializationtest.cpp
--- old/baloo-6.24.0/autotests/unit/lib/queryserializationtest.cpp      
2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/autotests/unit/lib/queryserializationtest.cpp      
2026-04-03 19:06:54.000000000 +0200
@@ -18,10 +18,10 @@
 
 private Q_SLOTS:
     void testBasic();
-    void testTerm();
-    void testAndTerm();
-    void testDateTerm();
-    void testDateTimeTerm();
+    void testJSON();
+    void testJSON_data();
+    void testURL();
+    void testURL_data();
 
     void testCustomOptions();
 };
@@ -48,10 +48,12 @@
     QCOMPARE(q, query);
 }
 
-void QuerySerializationTest::testTerm()
+void QuerySerializationTest::testJSON()
 {
+    QFETCH(QString, searchString);
+
     Query query;
-    query.setSearchString(QStringLiteral("prop:value"));
+    query.setSearchString(searchString);
 
     QByteArray json = query.toJSON();
     Query q = Query::fromJSON(json);
@@ -59,37 +61,44 @@
     QCOMPARE(q, query);
 }
 
-void QuerySerializationTest::testAndTerm()
+void QuerySerializationTest::testJSON_data()
 {
-    Query query;
-    query.setSearchString(QStringLiteral("prop1:1 AND prop2:2"));
-
-    QByteArray json = query.toJSON();
-    Query q = Query::fromJSON(json);
+    QTest::addColumn<QString>("searchString");
 
-    QCOMPARE(q, query);
+    QTest::addRow("term") << QStringLiteral("prop:value");
+    QTest::addRow("andTerm") << QStringLiteral("prop1:1 AND prop2:2");
+    QTest::addRow("dateTerm") << QStringLiteral("prop:2015-05-01");
+    QTest::addRow("dateTimeTerm") << 
QStringLiteral("prop:2015-05-01T23:44:11");
 }
 
-void QuerySerializationTest::testDateTerm()
+void QuerySerializationTest::testURL()
 {
+    QFETCH(QString, searchString);
+    const auto title{searchString};
+
     Query query;
-    query.setSearchString(QStringLiteral("prop:2015-05-01"));
+    query.setSearchString(searchString);
 
-    QByteArray json = query.toJSON();
-    Query q = Query::fromJSON(json);
+    const auto url = query.toSearchUrl(title);
+    QCOMPARE(Query::titleFromQueryUrl(url), title);
+
+    Query q = Query::fromSearchUrl(url);
 
+    QCOMPARE(q.searchString(), query.searchString());
     QCOMPARE(q, query);
 }
 
-void QuerySerializationTest::testDateTimeTerm()
+void QuerySerializationTest::testURL_data()
 {
-    Query query;
-    query.setSearchString(QStringLiteral("prop:2015-05-01T23:44:11"));
+    QTest::addColumn<QString>("searchString");
 
-    QByteArray json = query.toJSON();
-    Query q = Query::fromJSON(json);
-
-    QCOMPARE(q, query);
+    QTest::addRow("term") << QStringLiteral("prop:value");
+    QTest::addRow("andTerm") << QStringLiteral("prop1:1 AND prop2:2");
+    QTest::addRow("dateTerm") << QStringLiteral("prop:2015-05-01");
+    QTest::addRow("dateTimeTerm") << 
QStringLiteral("prop:2015-05-01T23:44:11");
+    QTest::addRow("reservedChars") << QStringLiteral("()&+:,;[]!");
+    QTest::addRow("disallowedChars") << QStringLiteral("{\"äöü\"}");
+    QTest::addRow("looksLikePercentEncoded") << QStringLiteral("%22 abc %22");
 }
 
 void QuerySerializationTest::testCustomOptions()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/po/de/balooctl6.po 
new/baloo-6.25.0/po/de/balooctl6.po
--- old/baloo-6.24.0/po/de/balooctl6.po 2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/po/de/balooctl6.po 2026-04-03 19:06:54.000000000 +0200
@@ -1,20 +1,21 @@
 # SPDX-FileCopyrightText: 2024 Johannes Obermayr <[email protected]>
 # SPDX-FileCopyrightText: 2014, 2015, 2018, 2020 Frederik Schwarzer 
<[email protected]>
 # SPDX-FileCopyrightText: 2015, 2017, 2018, 2019, 2020 Burkhard Lück 
<[email protected]>
+# SPDX-FileCopyrightText: 2026 Frank Steinmetzger <[email protected]>
 msgid ""
 msgstr ""
 "Project-Id-Version: balooctl6\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2026-01-10 00:39+0000\n"
-"PO-Revision-Date: 2024-12-23 19:10+0100\n"
-"Last-Translator: Johannes Obermayr <[email protected]>\n"
+"PO-Revision-Date: 2026-02-22 11:43+0100\n"
+"Last-Translator: Frank Steinmetzger <[email protected]>\n"
 "Language-Team: German <[email protected]>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 25.03.70\n"
+"X-Generator: Lokalize 25.12.2\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -196,10 +197,9 @@
 msgstr "%1 ist bereits in der Liste der ausgeschlossenen Ordner"
 
 #: configcommand.cpp:313
-#, fuzzy, kde-format
-#| msgid "%1 is not in the list of include folders"
+#, kde-format
 msgid "%1 is in the list of include folders"
-msgstr "%1 ist nicht in der Liste der einbezogenen Ordner"
+msgstr "%1 ist in der Liste der einbezogenen Ordner"
 
 #: configcommand.cpp:331
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/po/fi/balooctl6.po 
new/baloo-6.25.0/po/fi/balooctl6.po
--- old/baloo-6.24.0/po/fi/balooctl6.po 2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/po/fi/balooctl6.po 2026-04-03 19:06:54.000000000 +0200
@@ -1,7 +1,7 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
 # Lasse Liehu <[email protected]>, 2014, 2015, 2017.
-# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2023, 2024 Tommi Nieminen 
<[email protected]>
+# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2023, 2024, 2026 Tommi 
Nieminen <[email protected]>
 #
 #
 #
@@ -10,7 +10,7 @@
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2026-01-10 00:39+0000\n"
-"PO-Revision-Date: 2024-12-01 14:25+0200\n"
+"PO-Revision-Date: 2026-03-13 13:37+0200\n"
 "Last-Translator: Tommi Nieminen <[email protected]>\n"
 "Language-Team: Finnish <[email protected]>\n"
 "Language: fi\n"
@@ -18,7 +18,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 23.08.5\n"
+"X-Generator: Lokalize 25.04.0\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -200,10 +200,9 @@
 msgstr "%1 kuuluu jo sivuutettaviin kansioihin"
 
 #: configcommand.cpp:313
-#, fuzzy, kde-format
-#| msgid "%1 is not in the list of include folders"
+#, kde-format
 msgid "%1 is in the list of include folders"
-msgstr "%1 ei kuulu mukana oleviin kansioihin"
+msgstr "%1 kuuluu mukana oleviin kansioihin"
 
 #: configcommand.cpp:331
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/po/he/balooshow6.po 
new/baloo-6.25.0/po/he/balooshow6.po
--- old/baloo-6.24.0/po/he/balooshow6.po        2026-03-07 21:28:47.000000000 
+0100
+++ new/baloo-6.25.0/po/he/balooshow6.po        2026-04-03 19:06:54.000000000 
+0200
@@ -1,13 +1,13 @@
 # Copyright (C) 2024 This file is copyright:
 # This file is distributed under the same license as the baloo package.
 #
-# SPDX-FileCopyrightText: 2024 Yaron Shahrabani <[email protected]>
+# SPDX-FileCopyrightText: 2024, 2026 Yaron Shahrabani <[email protected]>
 msgid ""
 msgstr ""
 "Project-Id-Version: baloo\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2025-11-17 11:49+0000\n"
-"PO-Revision-Date: 2024-02-24 18:10+0200\n"
+"PO-Revision-Date: 2026-03-20 08:13+0200\n"
 "Last-Translator: Yaron Shahrabani <[email protected]>\n"
 "Language-Team: צוות התרגום של KDE ישראל\n"
 "Language: he\n"
@@ -16,7 +16,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
 "n % 10 == 0) ? 2 : 3));\n"
-"X-Generator: Lokalize 23.08.4\n"
+"X-Generator: Lokalize 25.12.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -90,7 +90,7 @@
 #: main.cpp:153
 #, kde-format
 msgid "%1: Failed to parse inode number"
-msgstr "%1: פענוח מספר ה־inode נכשל"
+msgstr "%1: פיענוח מספר ה־inode נכשל"
 
 #: main.cpp:177
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/src/engine/transaction.cpp 
new/baloo-6.25.0/src/engine/transaction.cpp
--- old/baloo-6.24.0/src/engine/transaction.cpp 2026-03-07 21:28:47.000000000 
+0100
+++ new/baloo-6.25.0/src/engine/transaction.cpp 2026-04-03 19:06:54.000000000 
+0200
@@ -53,7 +53,8 @@
     uint flags = type == ReadOnly ? MDB_RDONLY : 0;
     int rc = mdb_txn_begin(m_env, nullptr, flags, &m_txn);
     if (rc) {
-        qCDebug(ENGINE) << "Transaction init() error:" << rc << 
mdb_strerror(rc);
+        m_lastError = rc;
+        qCWarning(ENGINE) << "Transaction init() error:" << rc << 
mdb_strerror(rc);
         return;
     }
 
@@ -78,6 +79,11 @@
     }
 }
 
+const char *Transaction::lastError() const
+{
+    return mdb_strerror(m_lastError);
+}
+
 bool Transaction::hasDocument(quint64 id) const
 {
     Q_ASSERT(id > 0);
@@ -299,6 +305,7 @@
     m_txn = nullptr;
 
     if (rc) {
+        m_lastError = rc;
         qCWarning(ENGINE) << "Transaction::commit" << mdb_strerror(rc);
         return false;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/src/engine/transaction.h 
new/baloo-6.25.0/src/engine/transaction.h
--- old/baloo-6.24.0/src/engine/transaction.h   2026-03-07 21:28:47.000000000 
+0100
+++ new/baloo-6.25.0/src/engine/transaction.h   2026-04-03 19:06:54.000000000 
+0200
@@ -38,6 +38,12 @@
     Transaction(Database* db, TransactionType type);
     ~Transaction();
 
+    constexpr bool isValid() const
+    {
+        return m_txn != nullptr;
+    }
+    const char *lastError() const;
+
     //
     // Getters
     //
@@ -119,6 +125,7 @@
     MDB_txn *m_txn = nullptr;
     MDB_env *m_env = nullptr;
     std::unique_ptr<WriteTransaction> m_writeTrans;
+    int m_lastError = 0;
 
     friend class DatabaseSanitizerImpl;
     friend class DBState; // for testing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/src/file/extractor/app.cpp 
new/baloo-6.25.0/src/file/extractor/app.cpp
--- old/baloo-6.24.0/src/file/extractor/app.cpp 2026-03-07 21:28:47.000000000 
+0100
+++ new/baloo-6.25.0/src/file/extractor/app.cpp 2026-04-03 19:06:54.000000000 
+0200
@@ -34,8 +34,8 @@
     , m_output()
     , m_workerPipe(&m_input, &m_output)
 {
-    m_input.open(STDIN_FILENO, QIODevice::ReadOnly | QIODevice::Unbuffered );
-    m_output.open(STDOUT_FILENO, QIODevice::WriteOnly | QIODevice::Unbuffered 
);
+    std::ignore = m_input.open(STDIN_FILENO, QIODevice::ReadOnly | 
QIODevice::Unbuffered);
+    std::ignore = m_output.open(STDOUT_FILENO, QIODevice::WriteOnly | 
QIODevice::Unbuffered);
 
     static int s_idleTimeout = 1000 * 60 * 1; // 1 min
     m_idleTime = KIdleTime::instance();
@@ -72,6 +72,17 @@
 
     {
         Transaction tr(db, Transaction::ReadOnly);
+        if (tr.isValid()) {
+            m_consecutiveErrors = 0;
+        } else if (m_consecutiveErrors++ > 10) {
+            qCCritical(BALOO) << "Failed to create ReadOnly transaction" << 
tr.lastError();
+            exit(3);
+        } else {
+            QTimer::singleShot(500, [this, ids]() {
+                slotNewBatch(ids);
+            });
+        }
+
         for (const auto id : ids) {
             auto url = tr.documentUrl(id);
             m_batch.push_back({id, url, IndexState::Pending, {}});
@@ -107,6 +118,16 @@
     {
         Database *db = globalDatabaseInstance();
         Transaction tr(db, Transaction::ReadWrite);
+        if (tr.isValid()) {
+            m_consecutiveErrors = 0;
+        } else if (m_consecutiveErrors++ > 10) {
+            qCCritical(BALOO) << "Failed to create ReadWrite transaction";
+            exit(3);
+        } else {
+            QTimer::singleShot(500, [this]() {
+                processNextFile();
+            });
+        }
 
         size_t pendingCount = 0;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/src/file/extractor/app.h 
new/baloo-6.25.0/src/file/extractor/app.h
--- old/baloo-6.24.0/src/file/extractor/app.h   2026-03-07 21:28:47.000000000 
+0100
+++ new/baloo-6.25.0/src/file/extractor/app.h   2026-04-03 19:06:54.000000000 
+0200
@@ -75,6 +75,7 @@
     };
     std::vector<BatchInfo> m_batch;
     QElapsedTimer m_batchTime;
+    unsigned int m_consecutiveErrors = 0;
 };
 
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/src/file/extractorprocess.cpp 
new/baloo-6.25.0/src/file/extractorprocess.cpp
--- old/baloo-6.24.0/src/file/extractorprocess.cpp      2026-03-07 
21:28:47.000000000 +0100
+++ new/baloo-6.25.0/src/file/extractorprocess.cpp      2026-04-03 
19:06:54.000000000 +0200
@@ -41,6 +41,9 @@
         } else if (exitCode == 2) {
             // DB transaction commit error
             Q_EMIT failed();
+        } else if (exitCode == 3) {
+            // DB transaction create error
+            Q_EMIT failed();
         } else if (exitCode == 253) {
             // DrKonqi mangles signals depending on the core_pattern
             // and does a regular exit with status 253 instead
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/baloo-6.24.0/src/lib/query.cpp 
new/baloo-6.25.0/src/lib/query.cpp
--- old/baloo-6.24.0/src/lib/query.cpp  2026-03-07 21:28:47.000000000 +0100
+++ new/baloo-6.25.0/src/lib/query.cpp  2026-04-03 19:06:54.000000000 +0200
@@ -19,6 +19,7 @@
 #include <QJsonObject>
 
 using namespace Baloo;
+using namespace Qt::StringLiterals;
 
 const int defaultLimit = -1;
 
@@ -290,11 +291,13 @@
     QUrl url;
     url.setScheme(QStringLiteral("baloosearch"));
 
+    const auto percentEncodedJSON = 
QString::fromUtf8(QUrl::toPercentEncoding(QString::fromUtf8(toJSON()), ":"_ba));
     QUrlQuery urlQuery;
-    urlQuery.addQueryItem(QStringLiteral("json"), QString::fromUtf8(toJSON()));
+    urlQuery.addQueryItem(QStringLiteral("json"), percentEncodedJSON);
 
     if (!title.isEmpty()) {
-        urlQuery.addQueryItem(QStringLiteral("title"), title);
+        const auto percentEncodedTitle = 
QString::fromUtf8(QUrl::toPercentEncoding(title, ":"_ba));
+        urlQuery.addQueryItem(QStringLiteral("title"), percentEncodedTitle);
     }
 
     url.setQuery(urlQuery);

Reply via email to