Package: release.debian.org Severity: normal X-Debbugs-Cc: kclock@packages.debian.org, Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org> Control: affects -1 + src:kclock User: release.debian.org@packages.debian.org Usertags: unblock Dear Release Team, please unblock package kclock. [ Reason ] It contains the following changes: * New upstream release (25.04.3). - Add X-Plasma-API-Minimum-Version to applet metadata. (kde#505837) - Use KPackageStructure instead of ServiceTypes in metadata.json. (#505837) - Timers: Fix preset creation and usage (25.04). (kde#505636) - Fix alarm form overflowing on larger screens. (kde#505695) * Backport upstream commit: - Correctly honor configured sound theme for default alarm sound. [8c656dc4] The complete debdiff is huge with translation fixes so I’m attaching a simple diff trimmed of these for your convinience : diff -ur --exclude=po --exclude=*.desktop kclock-25.04.[03] [ Tests ] Tested stopwatch, timer, adding clock for another timezone. [ Risks ] Only contains the latest upstream point release for the 25.04 Gear branch. Further fixes can easily be backported or the changes reverted. [ Checklist ] [x] all changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in testing Thanks ! unblock kclock/25.04.3-1
Attachment:
kclock_25.04.0-1.dsc_kclock_25.04.3-1.dsc.debdiff.gz
Description: application/gzip
diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/CMakeLists.txt kclock-25.04.3/CMakeLists.txt --- kclock-25.04.0/CMakeLists.txt 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/CMakeLists.txt 2025-06-30 18:54:48.000000000 +0200 @@ -11,7 +11,7 @@ # KDE Applications version, managed by release script. set(RELEASE_SERVICE_VERSION_MAJOR "25") set(RELEASE_SERVICE_VERSION_MINOR "04") -set(RELEASE_SERVICE_VERSION_MICRO "0") +set(RELEASE_SERVICE_VERSION_MICRO "3") set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}") project(kclock VERSION ${RELEASE_SERVICE_VERSION}) diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/debian/changelog kclock-25.04.3/debian/changelog --- kclock-25.04.0/debian/changelog 2025-04-17 18:59:13.000000000 +0200 +++ kclock-25.04.3/debian/changelog 2025-07-23 18:01:27.000000000 +0200 @@ -1,3 +1,20 @@ +kclock (25.04.3-1) unstable; urgency=medium + + * Team upload. + + [ Aurélien COUDERC ] + * New upstream release (25.04.3). + - Add X-Plasma-API-Minimum-Version to applet metadata. (kde#505837) + - Use KPackageStructure instead of ServiceTypes in metadata.json. + (#505837) + - Timers: Fix preset creation and usage (25.04). (kde#505636) + - Fix alarm form overflowing on larger screens. (kde#505695) + * Backport upstream commit: + - Correctly honor configured sound theme for default alarm sound. + [8c656dc4] + + -- Aurélien COUDERC <coucouf@debian.org> Wed, 23 Jul 2025 18:01:27 +0200 + kclock (25.04.0-1) unstable; urgency=medium * Team upload. Seulement dans kclock-25.04.3/debian: patches diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/org.kde.kclock.appdata.xml kclock-25.04.3/org.kde.kclock.appdata.xml --- kclock-25.04.0/org.kde.kclock.appdata.xml 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/org.kde.kclock.appdata.xml 2025-06-30 18:54:48.000000000 +0200 @@ -77,6 +77,7 @@ <summary xml:lang="lt">Sekti laiką ir nusistatyti žadintuvus</summary> <summary xml:lang="lv">Sekojiet laikam un lieciet modinātājus</summary> <summary xml:lang="nl">Tijd bijhouden en wekkers zetten</summary> + <summary xml:lang="nn">Vis klokka og still inn alarmar</summary> <summary xml:lang="pl">Pilnuj czasu i ustawiaj alarmy</summary> <summary xml:lang="pt-BR">Manter o horário e configurar os alarmes</summary> <summary xml:lang="ru">Просмотр времени и установка напоминаний</summary> @@ -115,6 +116,7 @@ <p xml:lang="lt">Universali laikrodžio programa, skirta kompiuteriams ir mobiliesiems įrenginiams. Laikrodis leidžia nustatyti daug žadintuvų bei laikmačių, be to, jame yra chronometras ir pasaulio laikrodžiai.</p> <p xml:lang="lv">Universāla pulksteņa lietotne datoram un viedierīcēm. Pulkstenis satur hronometru un pasaules pulksteni, kā arī ļauj uzlikt dažādus modinātājus un taimerus.</p> <p xml:lang="nl">Een universele kloktoepassing voor bureaublad en mobiel. Kclock omvat een stopwatch en een wereldklok en biedt u het zetten meerdere wekkers en timers.</p> + <p xml:lang="nn">Eit universelt klokkeprogram for skrivebord og mobil. Inneheld stoppeklokke og verdsklokke, og lèt deg stilla inn fleire alarmar og nedteljarar.</p> <p xml:lang="pl">Wszechstronny zegar na urządzenia przenośne i biurkowe. Zegar zawiera stoper oraz zegar światowy. Umożliwia ustawienie wielu alarmów i minutników.</p> <p xml:lang="pt-BR">Um aplicativo de relógio universal para desktop e celular. O relógio inclui um cronômetro e um relógio mundial, e permite que você defina vários alarmes e timers.</p> <p xml:lang="ru">Универсальные часы для стационарных компьютеров и мобильных устройств. В программе есть секундомер и мировые часы, поддерживается установка напоминаний и таймеров.</p> @@ -457,6 +459,9 @@ <url type="donation">https://www.kde.org/community/donations/?app=kclock&source=appdata</url> <url type="vcs-browser">https://invent.kde.org/utilities/kclock</url> <releases> + <release version="25.04.3" date="2025-07-03"/> + <release version="25.04.2" date="2025-06-05"/> + <release version="25.04.1" date="2025-05-08"/> <release version="25.04.0" date="2025-04-17"/> <release version="24.12.3" date="2025-03-06"/> <release version="24.12.2" date="2025-02-06"/> diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/.pc/applied-patches kclock-25.04.3/.pc/applied-patches --- kclock-25.04.0/.pc/applied-patches 2025-07-27 13:27:32.636652284 +0200 +++ kclock-25.04.3/.pc/applied-patches 2025-07-27 13:27:32.780641035 +0200 @@ -0,0 +1 @@ +upstream_8c656dc4_Honor-configured-sound-theme-for-default-alarm-sound.patch Seulement dans kclock-25.04.3/.pc: upstream_8c656dc4_Honor-configured-sound-theme-for-default-alarm-sound.patch diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclock/qml/alarm/AlarmForm.qml kclock-25.04.3/src/kclock/qml/alarm/AlarmForm.qml --- kclock-25.04.0/src/kclock/qml/alarm/AlarmForm.qml 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/kclock/qml/alarm/AlarmForm.qml 2025-06-30 18:54:48.000000000 +0200 @@ -82,6 +82,7 @@ // repeat day picker DialogComboBox { implicitWidth: root.width + Layout.maximumWidth: 540 Kirigami.FormData.label: i18n("Days to repeat:") text: FormatUtil.getRepeatFormat(root.formDaysOfWeek) @@ -117,6 +118,7 @@ DialogComboBox { id: ringDurationPicker implicitWidth: root.width + Layout.maximumWidth: 540 Kirigami.FormData.label: i18n("Ring Duration:") text: { @@ -160,6 +162,7 @@ DialogComboBox { id: snoozeLengthPicker implicitWidth: root.width + Layout.maximumWidth: 540 Kirigami.FormData.label: i18n("Snooze Length:") title: i18n("Select Snooze Length") @@ -194,6 +197,7 @@ id: audioPathField implicitWidth: root.width width: root.width + Layout.maximumWidth: 540 Kirigami.FormData.label: i18n("Ring Sound:") diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclock/qml/timer/TimerFormDialog.qml kclock-25.04.3/src/kclock/qml/timer/TimerFormDialog.qml --- kclock-25.04.0/src/kclock/qml/timer/TimerFormDialog.qml 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/kclock/qml/timer/TimerFormDialog.qml 2025-06-30 18:54:48.000000000 +0200 @@ -16,10 +16,6 @@ Kirigami.Dialog { id: root - function createTimer(duration, label, commandTimeout) { - TimerModel.addNew(duration, label, commandTimeout); - } - property bool showPresets: false property bool showDelete: false @@ -37,20 +33,6 @@ id: timerForm Layout.fillWidth: true } - Flow { - spacing: Kirigami.Units.smallSpacing - visible: showPresets - Layout.fillWidth: true - - Repeater { - model: TimerPresetModel - - Button { - text: showDelete ? "Delete" : preset.presetName - onClicked: showDelete ? TimerPresetModel.deletePreset(index) : root.createTimer(timerForm.getDuration(), timerForm.name) & close(); - } - } - } } customFooterActions: [ @@ -70,7 +52,7 @@ icon.name: "dialog-ok" text: i18n("Done") onTriggered: { - root.createTimer(timerForm.getDuration(), timerForm.name, timerForm.commandTimeout); + TimerModel.addNew(timerForm.getDuration(), timerForm.name, timerForm.commandTimeout); close(); } } diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclock/qml/timer/TimerForm.qml kclock-25.04.3/src/kclock/qml/timer/TimerForm.qml --- kclock-25.04.0/src/kclock/qml/timer/TimerForm.qml 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/kclock/qml/timer/TimerForm.qml 2025-06-30 18:54:48.000000000 +0200 @@ -19,6 +19,8 @@ property alias name: label.text property alias commandTimeout: commandTimeoutField.text + signal closeFormRequested() + function setDuration(duration) { hours = duration / 60 / 60; minutes = duration % (60 * 60) / 60; @@ -39,7 +41,7 @@ text: i18n("1 m") hours: 0 minutes: 1 - hoursSpinBox: spinBoxHours + hoursSpinBox: spinBoxHours minutesSpinBox: spinBoxMinutes secondsSpinBox: spinBoxSeconds } @@ -47,7 +49,7 @@ text: i18n("5 m") hours: 0 minutes: 5 - hoursSpinBox: spinBoxHours + hoursSpinBox: spinBoxHours minutesSpinBox: spinBoxMinutes secondsSpinBox: spinBoxSeconds } @@ -55,7 +57,7 @@ text: i18n("10 m") hours: 0 minutes: 10 - hoursSpinBox: spinBoxHours + hoursSpinBox: spinBoxHours minutesSpinBox: spinBoxMinutes secondsSpinBox: spinBoxSeconds } @@ -67,7 +69,7 @@ text: i18n("15 m") hours: 0 minutes: 15 - hoursSpinBox: spinBoxHours + hoursSpinBox: spinBoxHours minutesSpinBox: spinBoxMinutes secondsSpinBox: spinBoxSeconds } @@ -75,7 +77,7 @@ text: i18n("30 m") hours: 0 minutes: 30 - hoursSpinBox: spinBoxHours + hoursSpinBox: spinBoxHours minutesSpinBox: spinBoxMinutes secondsSpinBox: spinBoxSeconds } @@ -83,7 +85,7 @@ text: i18n("1 h") hours: 1 minutes: 0 - hoursSpinBox: spinBoxHours + hoursSpinBox: spinBoxHours minutesSpinBox: spinBoxMinutes secondsSpinBox: spinBoxSeconds } @@ -151,7 +153,7 @@ showPresets = true; } } - + Button { id: presetButton text: showPresets ? i18n("Hide Presets") : i18n("Show Presets") @@ -168,7 +170,7 @@ } Flow { spacing: Kirigami.Units.smallSpacing - visible: showPresets && Kirigami.Settings.isMobile && repeater.count > 0 + visible: showPresets && repeater.count > 0 Layout.fillWidth: true Repeater { @@ -177,8 +179,14 @@ Button { text: showDelete ? "Delete" : preset.presetName - onClicked: showDelete ? TimerPresetModel.deletePreset(index) : loader.createTimer(timerForm.getDuration(), timerForm.name, timerForm.commandTimeout) & close(); - + onClicked: { + if (showDelete) { + TimerPresetModel.deletePreset(index); + } else { + TimerModel.addNew(preset.presetDuration, preset.presetName, timerForm.commandTimeout); + root.closeFormRequested(); + } + } } } } diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/alarm.cpp kclock-25.04.3/src/kclockd/alarm.cpp --- kclock-25.04.0/src/kclockd/alarm.cpp 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/kclockd/alarm.cpp 2025-07-27 13:27:32.000000000 +0200 @@ -305,7 +305,8 @@ // play sound (it will loop) qDebug() << "Alarm sound: " << m_audioPath; - AlarmPlayer::instance().setSource(m_audioPath); + // TODO clean up usage of audio path as URL. + AlarmPlayer::instance().setSource(m_audioPath.toLocalFile()); AlarmPlayer::instance().play(); setRinging(true); diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/alarmplayer.cpp kclock-25.04.3/src/kclockd/alarmplayer.cpp --- kclock-25.04.0/src/kclockd/alarmplayer.cpp 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/kclockd/alarmplayer.cpp 2025-07-27 13:27:32.000000000 +0200 @@ -9,8 +9,14 @@ #include <QDateTime> #include <QFile> +#include <QFileInfo> #include <QStandardPaths> +#include <KConfigGroup> +#include <KSharedConfig> + +using namespace Qt::Literals::StringLiterals; + AlarmPlayer &AlarmPlayer::instance() { static AlarmPlayer singleton; @@ -21,6 +27,7 @@ : QObject{parent} , m_player(new QMediaPlayer(this)) , m_audio(new QAudioOutput) + , m_soundThemeWatcher(KConfigWatcher::create(KSharedConfig::openConfig(QStringLiteral("kdeglobals")))) { m_player->setAudioOutput(m_audio); connect(m_player, &QMediaPlayer::playbackStateChanged, this, &AlarmPlayer::loopAudio); @@ -60,16 +67,37 @@ Q_EMIT volumeChanged(); } -void AlarmPlayer::setSource(const QUrl &path) +void AlarmPlayer::setSource(const QString &path) { - // if user set a invalid audio path or doesn't even specified a path, resort to default - if (!path.isValid() || !QFile::exists(path.toLocalFile())) { - const QUrl url = QUrl::fromLocalFile( - QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("sounds/freedesktop/stereo/alarm-clock-elapsed.oga"))); - m_player->setSource(url); + if (path.isEmpty() || !QFileInfo::exists(path)) { + m_player->setSource(QUrl::fromLocalFile(defaultAlarmSoundPath())); } else { - m_player->setSource(path); + m_player->setSource(QUrl::fromLocalFile(path)); } } +QString AlarmPlayer::soundThemeName() const +{ + const KConfigGroup soundGroup = m_soundThemeWatcher->config()->group(QStringLiteral("Sounds")); + const QString themeName = soundGroup.readEntry(QStringLiteral("Theme"), QStringLiteral("ocean")); + return themeName; +} + +QString AlarmPlayer::defaultAlarmSoundPath() const +{ + const QString soundPath = QStringLiteral("sounds/%1/stereo/alarm-clock-elapsed.%2"); + + for (const QString &theme : {soundThemeName(), u"freedesktop"_s}) { + for (const QLatin1String extension : {"wav"_L1, "oga"_L1, "ogg"_L1}) { + const QString path = QStandardPaths::locate(QStandardPaths::GenericDataLocation, soundPath.arg(theme, extension)); + if (!path.isEmpty()) { + return path; + } + } + } + + qCritical() << "Failed to find any alarm clock sound!"; + return QString(); +} + #include "moc_alarmplayer.cpp" diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/alarmplayer.h kclock-25.04.3/src/kclockd/alarmplayer.h --- kclock-25.04.0/src/kclockd/alarmplayer.h 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/kclockd/alarmplayer.h 2025-07-27 13:27:32.000000000 +0200 @@ -12,6 +12,8 @@ #include <QAudioOutput> +#include <KConfigWatcher> + class AlarmPlayer : public QObject { Q_OBJECT @@ -22,10 +24,13 @@ int volume(); Q_INVOKABLE void setVolume(int volume); - Q_INVOKABLE void setSource(const QUrl &path); + Q_INVOKABLE void setSource(const QString &path); Q_INVOKABLE void play(); Q_INVOKABLE void stop(); + QString soundThemeName() const; + QString defaultAlarmSoundPath() const; + Q_SIGNALS: void volumeChanged(); @@ -35,6 +40,7 @@ private: QMediaPlayer *m_player; QAudioOutput *m_audio; + KConfigWatcher::Ptr m_soundThemeWatcher; bool m_userStop = false; // indicate if user asks to stop diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/timer.cpp kclock-25.04.3/src/kclockd/timer.cpp --- kclock-25.04.0/src/kclockd/timer.cpp 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/kclockd/timer.cpp 2025-07-27 13:27:32.000000000 +0200 @@ -263,7 +263,7 @@ Utilities::pauseMprisSources(); - AlarmPlayer::instance().setSource(findRingSoundLocation()); + AlarmPlayer::instance().setSource(QString()); // use default. AlarmPlayer::instance().play(); m_ringing = true; @@ -290,18 +290,4 @@ } } -QUrl Timer::findRingSoundLocation() -{ - const auto locations = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); - const QString path = QStringLiteral("/sounds/freedesktop/stereo/alarm-clock-elapsed.oga"); - QString alarmSoundPath; - - for (const auto &directory : locations) { - if (QFile(directory + path).exists()) { - return QUrl(directory + path); - } - } - - return QUrl(); -} #include "moc_timer.cpp" diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/kclockd/timer.h kclock-25.04.3/src/kclockd/timer.h --- kclock-25.04.0/src/kclockd/timer.h 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/kclockd/timer.h 2025-07-27 13:27:32.000000000 +0200 @@ -81,7 +81,6 @@ void reschedule(); private: - QUrl findRingSoundLocation(); void setRunning(bool running); void ring(); diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/plasmoid/KClock_1x2/package/metadata.json kclock-25.04.3/src/plasmoid/KClock_1x2/package/metadata.json --- kclock-25.04.0/src/plasmoid/KClock_1x2/package/metadata.json 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/plasmoid/KClock_1x2/package/metadata.json 2025-06-30 18:54:48.000000000 +0200 @@ -1,4 +1,5 @@ { + "KPackageStructure": "Plasma/Applet", "KPlugin": { "Authors": [ { @@ -26,6 +27,7 @@ "Name[lt]": "HanY", "Name[lv]": "HanY", "Name[nl]": "HanY", + "Name[nn]": "HanY", "Name[pa]": "ਹਾਂਯੇ", "Name[pl]": "HanY", "Name[pt]": "HanY", @@ -66,6 +68,7 @@ "Description[lt]": "KClock valdiklis (1x2)", "Description[lv]": "„KClock“ logdaļa (1×2)", "Description[nl]": "KClock-widget (1x2)", + "Description[nn]": "KClock-element (1 × 2)", "Description[pa]": "ਕੇ-ਘੜੀ ਵਿਜੈਟ (1x2)", "Description[pl]": "Element interfejsu KClock (1x2)", "Description[pt]": "Elemento do KClock (1x2)", @@ -112,6 +115,7 @@ "Name[lt]": "KClock_1x2", "Name[lv]": "KClock_1x2", "Name[nl]": "KClock_1x2", + "Name[nn]": "KClock_1x2", "Name[pa]": "ਕੇ-ਘੜੀ_1x2", "Name[pl]": "KClock_1x2", "Name[pt]": "KClock_1x2", @@ -126,13 +130,11 @@ "Name[x-test]": "xxKClock_1x2xx", "Name[zh_CN]": "KClock_1x2", "Name[zh_TW]": "KClock_1x2", - "ServiceTypes": [ - "Plasma/Applet" - ], "Version": "1.0", "Website": "https://apps.kde.org/kclock" }, "X-Plasma-API": "declarativeappletscript", + "X-Plasma-API-Minimum-Version": "6.0", "X-Plasma-DBusActivationService": "org.kde.kclock.*", "X-Plasma-MainScript": "ui/main.qml", "X-Plasma-NotificationArea": "true", diff -ur '--exclude=po' '--exclude=*.desktop' kclock-25.04.0/src/plasmoid/KClock_KWeather_3x3/package/metadata.json kclock-25.04.3/src/plasmoid/KClock_KWeather_3x3/package/metadata.json --- kclock-25.04.0/src/plasmoid/KClock_KWeather_3x3/package/metadata.json 2025-04-11 05:12:02.000000000 +0200 +++ kclock-25.04.3/src/plasmoid/KClock_KWeather_3x3/package/metadata.json 2025-06-30 18:54:48.000000000 +0200 @@ -1,4 +1,5 @@ { + "KPackageStructure": "Plasma/Applet", "KPlugin": { "Authors": [ { @@ -26,6 +27,7 @@ "Name[lt]": "HanY", "Name[lv]": "HanY", "Name[nl]": "HanY", + "Name[nn]": "HanY", "Name[pa]": "ਹਾਂਯੇ", "Name[pl]": "HanY", "Name[pt]": "HanY", @@ -66,6 +68,7 @@ "Description[lt]": "KClock valdiklis (3x3 su informacija apie orus)", "Description[lv]": "„KCloc“k logdaļa (3×3 ar laikapstākļu informāciju)", "Description[nl]": "KClock-widget (3x3 met weerinformatie)", + "Description[nn]": "KClock-element (3 × 3 med vêrmelding)", "Description[pa]": "ਕੇ-ਘੜੀ ਵਿਜੈਟ (ਮੌਸਮੀ ਜਾਣਕਾਰੀ ਸਮੇਤ 3x3)", "Description[pl]": "Element interfejsu (3x3 z danymi pogodowymi)", "Description[pt]": "Elemento do KClock (3x3 com Dados Meteorológicos)", @@ -107,6 +110,7 @@ "Name[lt]": "KClock_KWeather_3x3", "Name[lv]": "KClock_KWeather_3x3", "Name[nl]": "KClock_KWeather_3x3", + "Name[nn]": "KClock_KWeather_3x3", "Name[pa]": "ਕੇ-ਘੜੀ_ਕੇ-ਮੌਸਮ_3x3", "Name[pl]": "KClock_KWeather_3x3", "Name[pt]": "KClock_KWeather_3x3", @@ -121,9 +125,6 @@ "Name[x-test]": "xxKClock_KWeather_3x3xx", "Name[zh_CN]": "KClock_KWeather_3x3", "Name[zh_TW]": "KClock_KWeather_3x3", - "ServiceTypes": [ - "Plasma/Applet" - ], "Version": "1.0", "Website": "https://apps.kde.org/kclock" },