[-]
[+]
|
Changed |
_service:tar_git:kasts.spec
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,6 +2,6 @@
<service name="tar_git">
<param name="url">https://github.com/sailfishos-chum/kasts.git</param>
<param name="branch">main</param>
- <param name="revision">23.04.2+git3</param>
+ <param name="revision">23.08.0+git1</param>
</service>
</services>
\ No newline at end of file
|
[-]
[+]
|
Deleted |
_service:tar_git:kasts-23.04.2+git3.tar.xz/upstream/po/ru/kasts.po
^
|
@@ -1,1843 +0,0 @@
-# Copyright (C) YEAR This file is copyright:
-# This file is distributed under the same license as the kasts package.
-#
-# Alexander Yavorsky <kekcuha@gmail.com>, 2023.
-msgid ""
-msgstr ""
-"Project-Id-Version: kasts\n"
-"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-05-19 10:54+0300\n"
-"Last-Translator: Alexander Yavorsky <kekcuha@gmail.com>\n"
-"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
-"Language: ru\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
-"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Lokalize 21.08.3\n"
-
-#, kde-format
-msgctxt "NAME OF TRANSLATORS"
-msgid "Your names"
-msgstr "Мария Шикунова"
-
-#, kde-format
-msgctxt "EMAIL OF TRANSLATORS"
-msgid "Your emails"
-msgstr "translation-team@basealt.ru"
-
-#: audiomanager.cpp:404
-#, kde-format
-msgid "No connection or streaming on metered connection not allowed"
-msgstr ""
-"Подключение отсутствует или запрещена трансляция при использовании "
-"тарифицируемого подключения"
-
-#: audiomanager.cpp:545
-#, kde-format
-msgid "Invalid Media"
-msgstr "Недопустимый медиафайл"
-
-#: enclosure.cpp:164
-#, kde-format
-msgid "Podcast downloads not allowed due to user setting"
-msgstr "Загрузка подкастов запрещена пользовательскими параметрами"
-
-#: enclosuredownloadjob.cpp:33
-#, kde-format
-msgid "Downloading %1"
-msgstr "Выполняется загрузка %1"
-
-#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
-msgstr "Ошибка обновления подкаста"
-
-#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
-msgstr "Ошибка загрузки медиафайла"
-
-#: error.cpp:52
-#, kde-format
-msgid "Update Not Allowed on Metered Connection"
-msgstr "Обновление запрещено при использовании тарифицируемого подключения"
-
-#: error.cpp:54
-#, kde-format
-msgid "Invalid Media File"
-msgstr "Недопустимый медиафайл"
-
-#: error.cpp:56
-#, kde-format
-msgid "Nothing Found"
-msgstr "Ничего не найдено"
-
-#: error.cpp:58
-#, kde-format
-msgid "Error moving storage path"
-msgstr "Ошибка при изменении пути хранения данных"
-
-#: error.cpp:60
-#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
-msgstr "Ошибка синхронизации состояния ленты и / или эпизода"
-
-#: error.cpp:62
-#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
-msgstr ""
-"Подключение отсутствует или запрещена трансляция при использовании "
-"тарифицируемого подключения"
-
-#: kmediasession/example-app/qml/main.qml:20
-#, kde-format
-msgid "Example player KMediaSession"
-msgstr "Пример проигрывателя KMediaSession"
-
-#: kmediasession/example-app/qml/main.qml:72
-#, kde-format
-msgid "Select file..."
-msgstr "Выбрать файл…"
-
-#: kmediasession/example-app/qml/main.qml:78
-#, kde-format
-msgid "Select media file"
-msgstr "Выбор медиафайла"
-
-#: kmediasession/example-app/qml/main.qml:85
-#, kde-format
-msgid "OR"
-msgstr "ИЛИ"
-
-#: kmediasession/example-app/qml/main.qml:93
-#, kde-format
-msgid "Open"
-msgstr "Открыть"
-
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
-#, kde-format
-msgid "Play"
-msgstr "Воспроизвести"
-
-#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
-#, kde-format
-msgid "Pause"
-msgstr "Приостановить"
-
-#: kmediasession/example-app/qml/main.qml:117 qml/SleepTimerDialog.qml:41
-#, kde-format
-msgid "Stop"
-msgstr "Остановить"
-
-#: kmediasession/example-app/qml/main.qml:147
-#, kde-format
-msgid "Mute"
-msgstr "Выключить звук"
-
-#: kmediasession/example-app/qml/main.qml:174
-#, kde-format
-msgid "title: %1"
-msgstr "название: %1"
-
-#: kmediasession/example-app/qml/main.qml:177
-#, kde-format
-msgid "artist: %1"
-msgstr "исполнитель: %1"
-
-#: kmediasession/example-app/qml/main.qml:180
-#, kde-format
-msgid "album: %1"
-msgstr "альбом: %1"
-
-#: kmediasession/example-app/qml/main.qml:191
-#, kde-format
-msgid "mediaStatus: %1"
-msgstr "Состояние медиафайла: %1"
-
-#: kmediasession/example-app/qml/main.qml:194
-#, kde-format
-msgid "playbackStatus: %1"
-msgstr "Состояние воспроизведения: %1"
-
-#: kmediasession/example-app/qml/main.qml:197
-#, kde-format
-msgid "error: %1"
-msgstr "ошибка: %1"
-
-#: kmediasession/powermanagement/powermanagementinterface.cpp:188
-#: kmediasession/powermanagement/powermanagementinterface.cpp:214
-#, kde-format
-msgctxt "Explanation for sleep inhibit during media playback"
-msgid "Playing Media"
-msgstr "Воспроизведение медиафайла"
-
-#: main.cpp:112
-#, kde-format
-msgid "Podcast Application"
-msgstr "Приложение для подкастов"
-
-#: main.cpp:114
-#, kde-format
-msgid "Adds a new podcast to subscriptions."
-msgstr "Добавляет новый подкаст в подписки."
-
-#: main.cpp:115
-#, kde-format
-msgid "Podcast URL"
-msgstr "URL-адрес подкаста"
-
-#: main.cpp:120
-#, kde-format
-msgid "Kasts"
-msgstr "Kasts"
|
[-]
[+]
|
Deleted |
_service:tar_git:kasts-23.04.2+git3.tar.xz/upstream/src/qml/SearchFilterBar.qml
^
|
@@ -1,201 +0,0 @@
-/**
- * SPDX-FileCopyrightText: 2023 Bart De Vries <bart@mogwai.be>
- *
- * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
- */
-
-import QtQuick 2.14
-import QtQuick.Controls 2.14 as Controls
-import QtQuick.Layouts 1.14
-import org.kde.kirigami 2.19 as Kirigami
-
-import org.kde.kasts 1.0
-
-Controls.Control {
- id: searchFilterBar
-
- required property var proxyModel
- required property var parentKey
-
- leftPadding: Kirigami.Units.largeSpacing + Kirigami.Units.smallSpacing
- rightPadding: Kirigami.Units.largeSpacing
- topPadding: Kirigami.Units.smallSpacing
- bottomPadding: Kirigami.Units.smallSpacing
-
- background: Rectangle {
- Kirigami.Theme.inherit: false
- Kirigami.Theme.colorSet: Kirigami.Theme.Header
- color: Kirigami.Theme.backgroundColor
-
- Kirigami.Separator {
- anchors.bottom: parent.bottom
- anchors.left: parent.left
- anchors.right: parent.right
- }
- }
-
- contentItem: RowLayout {
- Kirigami.SearchField {
- Layout.fillWidth: true
- id: searchField
- placeholderText: i18nc("@label:textbox Placeholder text for episode search field", "Search Episodes")
- focus: true
- autoAccept: false
- onAccepted: {
- proxyModel.searchFilter = searchField.text;
- }
-
- Kirigami.Action {
- id: searchSettingsButton
- icon.name: "settings-configure"
- text: i18nc("@action:intoolbar", "Advanced Search Options")
-
- onTriggered: {
- if (searchSettingsMenu.visible) {
- searchSettingsMenu.dismiss();
- } else {
- searchSettingsMenu.popup(searchSettingsButton);
- }
- }
- }
- Component.onCompleted: {
- // rightActions are defined from right-to-left
- // if we want to insert the settings action as the rightmost, then it
- // must be defined as first action, which means that we need to save the
- // default clear action and push that as a second action
- var origAction = searchField.rightActions[0];
- searchField.rightActions[0] = searchSettingsButton;
- searchField.rightActions.push(origAction);
- }
-
- Keys.onEscapePressed: {
- proxyModel.filterType = AbstractEpisodeProxyModel.NoFilter;
- proxyModel.searchFilter = "";
- parentKey.checked = false;
- event.accepted = true;
- }
- Keys.onReturnPressed: {
- accepted();
- event.accepted = true;
- }
- }
-
- Controls.ToolButton {
- id: filterButton
- icon.name: "view-filter"
- text: i18nc("@action:intoolbar Button to open menu to filter episodes based on their status (played, new, etc.)", "Filter")
- display: wideScreen ? Controls.AbstractButton.TextBesideIcon : Controls.AbstractButton.IconOnly
-
- Controls.ToolTip.visible: hovered
- Controls.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
- Controls.ToolTip.text: i18nc("@info:tooltip", "Filter Episodes by Status")
-
- onPressed: {
- if (filterMenu.visible) {
- filterMenu.dismiss();
- } else {
- filterMenu.popup(filterButton, filterButton.x, filterButton.y + filterButton.height);
- }
- }
- }
- }
-
- Component.onCompleted: {
- searchField.forceActiveFocus();
- }
-
- ListModel {
- id: filterModel
-
- // have to use script because i18n doesn't work within ListElement
- Component.onCompleted: {
- var filterList = [AbstractEpisodeProxyModel.NoFilter,
- AbstractEpisodeProxyModel.ReadFilter,
- AbstractEpisodeProxyModel.NotReadFilter,
- AbstractEpisodeProxyModel.NewFilter,
- AbstractEpisodeProxyModel.NotNewFilter]
- for (var i in filterList) {
- filterModel.append({"name": proxyModel.getFilterName(filterList[i]),
- "filterType": filterList[i]});
- }
- }
- }
-
- Controls.Menu {
- id: filterMenu
-
- title: i18nc("@title:menu", "Select Filter")
-
- Controls.ButtonGroup { id: filterGroup }
-
- Repeater {
- model: filterModel
-
- Controls.RadioButton {
- padding: Kirigami.Units.smallSpacing
- text: model.name
- checked: model.filterType === proxyModel.filterType
- Controls.ButtonGroup.group: filterGroup
-
- onToggled: {
- if (checked) {
- proxyModel.filterType = model.filterType;
- }
- filterMenu.dismiss();
- }
- }
- }
- }
-
- ListModel {
- id: searchSettingsModel
-
- function reload() {
- clear();
- var searchList = [AbstractEpisodeProxyModel.TitleFlag,
- AbstractEpisodeProxyModel.ContentFlag,
- AbstractEpisodeProxyModel.FeedNameFlag]
- for (var i in searchList) {
- searchSettingsModel.append({"name": proxyModel.getSearchFlagName(searchList[i]),
- "searchFlag": searchList[i],
- "checked": proxyModel.searchFlags & searchList[i]});
- }
- }
-
- Component.onCompleted: {
- reload();
- }
- }
-
- Controls.Menu {
- id: searchSettingsMenu
-
- title: i18nc("@title:menu", "Search Preferences")
-
- Controls.Label {
- padding: Kirigami.Units.smallSpacing
- text: i18nc("@title:group Group of fields in which can be searched", "Search in:")
- }
-
- Repeater {
- model: searchSettingsModel
-
- Controls.CheckBox {
- padding: Kirigami.Units.smallSpacing
- text: model.name
- checked: model.checked
- onToggled: {
- if (checked) {
- proxyModel.searchFlags = proxyModel.searchFlags | model.searchFlag;
- } else {
- proxyModel.searchFlags = proxyModel.searchFlags & ~model.searchFlag;
- }
- }
- }
- }
-
- onOpened: {
- searchSettingsModel.reload();
- }
|
[-]
[+]
|
Deleted |
_service:tar_git:kasts-23.04.2+git3.tar.xz/upstream/src/qtquickcontrols2.conf
^
|
@@ -1,5 +0,0 @@
-[Material]
-Primary=Blue
-Accent=Blue
-Theme=System
->
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/.flatpak-manifest.json
^
|
@@ -64,8 +64,8 @@
"sources": [
{
"type": "archive",
- "url": "https://taglib.github.io/releases/taglib-1.13.tar.gz",
- "sha256": "58f08b4db3dc31ed152c04896ee9172d22052bc7ef12888028c01d8b1d60ade0",
+ "url": "https://taglib.github.io/releases/taglib-1.13.1.tar.gz",
+ "sha256": "c8da2b10f1bfec2cd7dbfcd33f4a2338db0765d851a50583d410bacf055cfd0b",
"x-checker-data": {
"type": "anitya",
"project-id": 1982,
@@ -107,13 +107,13 @@
"sources": [
{
"type": "archive",
- "url": "https://github.com/frankosterfeld/qtkeychain/archive/v0.13.2.tar.gz",
- "sha256": "20beeb32de7c4eb0af9039b21e18370faf847ac8697ab3045906076afbc4caa5",
+ "url": "https://github.com/frankosterfeld/qtkeychain/archive/0.14.1.tar.gz",
+ "sha256": "afb2d120722141aca85f8144c4ef017bd74977ed45b80e5d9e9614015dadd60c",
"x-checker-data": {
"type": "anitya",
"project-id": 4138,
"stable-only": true,
- "url-template": "https://github.com/frankosterfeld/qtkeychain/archive/v$version.tar.gz"
+ "url-template": "https://github.com/frankosterfeld/qtkeychain/archive/$version.tar.gz"
}
}
],
@@ -129,8 +129,8 @@
"sources": [
{
"type": "archive",
- "url": "https://download.kde.org/stable/kirigami-addons/kirigami-addons-0.7.1.tar.xz",
- "sha256": "c4e94821e81fcda173e71e9bfd5def66961a276278dc784b9b0c6f7cbcd4a0c8",
+ "url": "https://download.kde.org/stable/kirigami-addons/kirigami-addons-0.9.0.tar.xz",
+ "sha256": "56d8073cd9797d4adf5a75f5dc0d2385fc2e896ab6e6106131a6f0d6a976d8a2",
"x-checker-data": {
"type": "anitya",
"project-id": 242933,
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/CMakeLists.txt
^
|
@@ -7,8 +7,8 @@
# KDE Applications version, managed by release script.
set(RELEASE_SERVICE_VERSION_MAJOR "23")
-set(RELEASE_SERVICE_VERSION_MINOR "04")
-set(RELEASE_SERVICE_VERSION_MICRO "2")
+set(RELEASE_SERVICE_VERSION_MINOR "08")
+set(RELEASE_SERVICE_VERSION_MICRO "0")
set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
project(kasts VERSION ${RELEASE_SERVICE_VERSION})
@@ -20,6 +20,9 @@
set(KF_MIN_VERSION "5.102.0")
set(QT_MIN_VERSION "5.15.2")
+if (ANDROID)
+ set(QT_MIN_VERSION 5.15.10) # due to 5.15.10 changing NDK versioning
+endif()
find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE)
@@ -58,9 +61,17 @@
find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Core Quick Test Gui QuickControls2 Sql Svg Xml)
find_package(KF${KF_MAJOR_VERSION} ${KF_MIN_VERSION} REQUIRED COMPONENTS I18n CoreAddons Kirigami2 Syndication Config ThreadWeaver)
+
+if (QT_MAJOR_VERSION EQUAL "6")
+find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Network)
+else()
+find_package(KF${KF_MAJOR_VERSION} ${KF_MIN_VERSION} OPTIONAL_COMPONENTS NetworkManagerQt)
+endif()
+
if (NOT KF_MAJOR_VERSION EQUAL "6") # TODO temporary workaround until kirigami-addons is switched to KF6
find_package(KF5KirigamiAddons 0.7 REQUIRED)
endif()
+
find_package(Taglib REQUIRED)
find_package(Qt${QT_MAJOR_VERSION}Keychain)
set_package_properties(Qt${QT_MAJOR_VERSION}Keychain PROPERTIES
@@ -68,8 +79,6 @@
PURPOSE "Secure storage of account secrets"
)
-find_package(KF${KF_MAJOR_VERSION} ${KF_MIN_VERSION} OPTIONAL_COMPONENTS NetworkManagerQt)
-
if (ANDROID)
find_package(Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} REQUIRED COMPONENTS Svg)
if (QT_MAJOR_VERSION EQUAL "5")
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/README.md
^
|
@@ -43,7 +43,7 @@
## Linux
```
-git clone https://invent.kde.org/plasma-mobile/kasts
+git clone https://invent.kde.org/multimedia/kasts
cd kasts
mkdir build && cd build
cmake .. -DCMAKE_PREFIX_PATH=/usr
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/android/build.gradle
^
|
@@ -48,6 +48,7 @@
compileSdkVersion androidCompileSdkVersion.toInteger()
buildToolsVersion androidBuildToolsVersion
+ ndkVersion androidNdkVersion
sourceSets {
main {
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/org.kde.kasts.appdata.xml
^
|
@@ -13,6 +13,7 @@
<name xml:lang="de">Kasts</name>
<name xml:lang="en-GB">Kasts</name>
<name xml:lang="es">Kasts</name>
+ <name xml:lang="eu">Kasts</name>
<name xml:lang="fi">Kasts</name>
<name xml:lang="fr">Kasts</name>
<name xml:lang="id">Kasts</name>
@@ -24,11 +25,10 @@
<name xml:lang="pl">Kasts</name>
<name xml:lang="pt">Kasts</name>
<name xml:lang="pt-BR">Kasts</name>
- <name xml:lang="ru">Kasts</name>
<name xml:lang="sk">Kasts</name>
<name xml:lang="sl">Kasts</name>
<name xml:lang="sv">Kasts</name>
- <name xml:lang="tr">Kasts</name>
+ <name xml:lang="tr">Kastlar</name>
<name xml:lang="uk">Kasts</name>
<name xml:lang="x-test">xxKastsxx</name>
<name xml:lang="zh-CN">Kasts</name>
@@ -39,16 +39,16 @@
<summary xml:lang="de">Podcast-Anwendung</summary>
<summary xml:lang="en-GB">Podcast application</summary>
<summary xml:lang="es">Aplicación de pódcast</summary>
+ <summary xml:lang="eu">Podcast aplikazioa</summary>
<summary xml:lang="fi">Podcast-sovellus</summary>
<summary xml:lang="fr">Application de podcasts</summary>
<summary xml:lang="id">Aplikasi podcast</summary>
<summary xml:lang="it">Applicazione per podcast</summary>
<summary xml:lang="ka">პოდკასტის აპლიკაცია</summary>
- <summary xml:lang="ko">팟캐스트 프로그램</summary>
+ <summary xml:lang="ko">팟캐스트 앱</summary>
<summary xml:lang="nl">Podcastprogramma</summary>
<summary xml:lang="pl">Aplikacja do podkastów</summary>
<summary xml:lang="pt">Aplicação de 'podcasts'</summary>
- <summary xml:lang="ru">Приложение для подкастов</summary>
<summary xml:lang="sl">Aplikacija podcastov</summary>
<summary xml:lang="sv">Poddradioprogram</summary>
<summary xml:lang="tr">Pod yayını uygulaması</summary>
@@ -68,6 +68,7 @@
<developer_name xml:lang="de">Die KDE-Gemeinschaft</developer_name>
<developer_name xml:lang="en-GB">The KDE Community</developer_name>
<developer_name xml:lang="es">La Comunidad KDE</developer_name>
+ <developer_name xml:lang="eu">KDE komunitatea</developer_name>
<developer_name xml:lang="fi">KDE-yhteisö</developer_name>
<developer_name xml:lang="fr">La communauté KDE</developer_name>
<developer_name xml:lang="id">KDE Community</developer_name>
@@ -79,7 +80,6 @@
<developer_name xml:lang="pl">Społeczność KDE</developer_name>
<developer_name xml:lang="pt">A Comunidade do KDE</developer_name>
<developer_name xml:lang="pt-BR">A comunidade KDE</developer_name>
- <developer_name xml:lang="ru">Сообщество KDE</developer_name>
<developer_name xml:lang="sk">KDE Komunita</developer_name>
<developer_name xml:lang="sl">Skupnost KDE</developer_name>
<developer_name xml:lang="sv">KDE-gemenskapen</developer_name>
@@ -93,19 +93,19 @@
<p xml:lang="ca-valencia">Kasts és una aplicació convergent de podcast que treballa bé en l'escriptori i al mòbil.</p>
<p xml:lang="en-GB">Kasts is a convergent podcast application that looks good on desktop and mobile.</p>
<p xml:lang="es">Kasts es una aplicación convergente de pódcast que se ve bien en el escritorio y en dispositivos móviles.</p>
+ <p xml:lang="eu">«Kasts» podcast aplikazio konbergente bat da, mahaigainean eta gailu mugikorretan itxura ona duena.</p>
<p xml:lang="fi">Kasts on mukautuva podcast-sovellus, joka näyttää hyvältä niin työpöydällä kuin mobiilissa.</p>
<p xml:lang="fr">Kasts est une application unifiée pour podcast, fonctionnant bien sur ordinateurs et sur mobile.</p>
<p xml:lang="id">Kasts adalah aplikasi podcast konvergen yang terlihat bagus di desktop dan seluler.</p>
<p xml:lang="it">Kasts è un'applicazione podcast convergente che va bene su desktop e mobile.</p>
<p xml:lang="ka">Kasts პოდკასტების კონვერგენტული აპლიკაციაა, რომელიც ორივე, კომპიუტერზე და მობილურზე, კარგად გამოიყურება.</p>
- <p xml:lang="ko">Kasts는 데스크톱과 모바일 양쪽에서 작동하는 팟캐스트 프로그램입니다.</p>
+ <p xml:lang="ko">Kasts는 데스크톱과 모바일 양쪽에서 작동하는 팟캐스트 앱입니다.</p>
<p xml:lang="nl">Kasts is een convergente podcast-toepassing die er goed uitziet op het bureaublad en op de mobiel.</p>
<p xml:lang="pl">Kasts jest dostosowującą się aplikacją do podkastów, która wygląda dobrze na urządzeniach biurkowych i przenośnych.</p>
<p xml:lang="pt">O Kasts é uma aplicação de 'podcasts' convergente que parece bonita em computadores e em dispositivos móveis.</p>
- <p xml:lang="ru">Kasts — это универсальное приложение для подкастов, эффективно работающее как на компьютерах, так и на мобильных устройствах.</p>
<p xml:lang="sl">Kasts je konvergentna aplikacija za podcaste za namizje in mobilne naprave.</p>
<p xml:lang="sv">Kasts är ett konvergent poddradioprogram som ser bra ut på skrivbordsdatorer och mobiler.</p>
- <p xml:lang="tr">Kasts, hem masaüstü hem de taşınabilirde iyi çalışan, yakınsak bir Podcast uygulamasıdır.</p>
+ <p xml:lang="tr">Kastlar, hem masaüstü hem de taşınabilirde iyi çalışan, yakınsak bir pod yayını uygulamasıdır.</p>
<p xml:lang="uk">Kasts — універсальна програма для роботи із трансляціями (подкастами), яка однаково добре виглядає на комп'ютерах і мобільних пристроях.</p>
<p xml:lang="x-test">xxKasts is a convergent podcast application that looks good on desktop and mobile.xx</p>
<p>Its main features are:</p>
@@ -114,6 +114,7 @@
<p xml:lang="cs">Hlavní vlastnosti jsou:</p>
<p xml:lang="en-GB">Its main features are:</p>
<p xml:lang="es">Sus funcionalidades principales son:</p>
+ <p xml:lang="eu">Bere ezaugarri nagusiak:</p>
<p xml:lang="fi">Sen pääominaisuuksia ovat:</p>
<p xml:lang="fr">Ses principales fonctionnalités sont :</p>
<p xml:lang="id">Fitur utamanya adalah:</p>
@@ -123,7 +124,6 @@
<p xml:lang="nl">De hoofdkenmerken zijn:</p>
<p xml:lang="pl">Jego głównymi cechami są:</p>
<p xml:lang="pt">As suas funcionalidades principais são:</p>
- <p xml:lang="ru">Его основные возможности:</p>
<p xml:lang="sl">Njene glavne zmožnosti so:</p>
<p xml:lang="sv">Dess huvudfunktioner är:</p>
<p xml:lang="tr">Temel özellikleri:</p>
@@ -136,6 +136,7 @@
<li xml:lang="cs">Správa epizod přes frontu přehrávání</li>
<li xml:lang="en-GB">Episode management through play queue</li>
<li xml:lang="es">Gestión de episodios mediante cola de reproducción</li>
+ <li xml:lang="eu">Atalen kudeaketa, jotze-ilararen bidez</li>
<li xml:lang="fi">Jaksohallinta toistojonon kauta</li>
<li xml:lang="fr">Gestion des épisodes grâce à une file de lecture</li>
<li xml:lang="id">Pengelolaan episode melalui antrean putar</li>
@@ -145,7 +146,6 @@
<li xml:lang="nl">Beheer van episoden via afspeelwachtrij</li>
<li xml:lang="pl">Zarządzanie odcinkami poprzez kolejkę odtwarzania</li>
<li xml:lang="pt">Gestão de episódios através da fila de reprodução</li>
- <li xml:lang="ru">Управление эпизодами с помощью очереди воспроизведения;</li>
<li xml:lang="sl">Upravljanje z epizodami prek čakalne vrste predvajanj</li>
<li xml:lang="sv">Avsnittshantering via uppspelningskö</li>
<li xml:lang="tr">Çalma kuyruğu üzerinden bölüm yönetimi</li>
@@ -156,6 +156,7 @@
<li xml:lang="ca-valencia">Sincronitza la posició de reproducció amb altres clients a través de gpodder.net o gpodder-nextcloud</li>
<li xml:lang="en-GB">Sync playback positions with other clients through gpodder.net or gpodder-nextcloud</li>
<li xml:lang="es">Sincronización de posiciones de reproducción con otros clientes mediante gpodder.net o gpodder-nextcloud</li>
+ <li xml:lang="eu">Jotze kokalekua beste bezero batzuekin partekatzea «gpodder.net» edo «gpodder-nextcloud» bidez</li>
<li xml:lang="fi">Toistosijainnin tahdistus eri asiakkailla gpodder.netin tai gpodder-nextcloudin avulla</li>
<li xml:lang="fr">Synchroniser les positions de lecture avec d'autres client, grâce à « gpodder.net » ou « gpodder-nextcloud »</li>
<li xml:lang="id">Sinkronkan posisi pemutaran dengan klien lain melalui gpodder.net atau gpodder-nextcloud</li>
@@ -165,7 +166,6 @@
<li xml:lang="nl">Afspeelposities synchroniseren met andere clients via gpodder.net of gpodder-nextcloud</li>
<li xml:lang="pl">Uwspólnianie postępu w odtwarzaniu z innymi programami przez gpodder.net lub gpodder-nextcloud</li>
<li xml:lang="pt">Sincronizar as posições de reprodução com outros clientes através do gpodder.net ou do gpodder-nextcloud</li>
- <li xml:lang="ru">Синхронизация позиций воспроизведения с другими клиентами с помощью gpodder.net или gpodder для Nextcloud;</li>
<li xml:lang="sl">Sinhronizacija pozicij predvajanja z ostalimi odjemalci prek gpodder.net ali gpodder-nextcloud</li>
<li xml:lang="sv">Synkronisera uppspelningsposition med andra klienter via gpodder.net eller gpodder-nextcloud</li>
<li xml:lang="tr">Çalma konumlarını, gpodder.net veya gpodder-nextcloud üzerinden eşzamanlama</li>
@@ -177,6 +177,7 @@
<li xml:lang="cs">Měnitelná rychlost přehrávání</li>
<li xml:lang="en-GB">Variable playback speed</li>
<li xml:lang="es">Velocidad de reproducción variable</li>
+ <li xml:lang="eu">Atzera-jotze abiadura aldagarria</li>
<li xml:lang="fi">Muuntuva toistonopeus</li>
<li xml:lang="fr">Vitesse variable de lecture</li>
<li xml:lang="id">Kecepatan pemutaran variabel</li>
@@ -186,7 +187,6 @@
<li xml:lang="nl">Variabele afspeelsnelheid</li>
<li xml:lang="pl">Zmienna szybkość odtwarzania</li>
<li xml:lang="pt">Velocidade de reprodução variável</li>
- <li xml:lang="ru">Настраиваемая скорость воспроизведения;</li>
<li xml:lang="sl">Variabilna hitrost predvajanja</li>
<li xml:lang="sv">Variabel uppspelningshastighet</li>
<li xml:lang="tr">Değişken çalma hızı</li>
@@ -198,6 +198,7 @@
<li xml:lang="cs">Hledání podcastů</li>
<li xml:lang="en-GB">Search for podcasts</li>
<li xml:lang="es">Búsqueda de pódcast</li>
+ <li xml:lang="eu">Miatu podcast bila</li>
<li xml:lang="fi">Podcast-haku</li>
<li xml:lang="fr">Recherche de podcasts</li>
<li xml:lang="id">Pencarian podcasts</li>
@@ -207,7 +208,6 @@
<li xml:lang="nl">Zoeken naar podcasts</li>
<li xml:lang="pl">Poszukaj podkastów</li>
<li xml:lang="pt">Procurar por 'podcasts'</li>
- <li xml:lang="ru">Поиск по подкастам;</li>
<li xml:lang="sl">Iskanje podkastov</li>
<li xml:lang="sv">Sök efter poddradioprogram</li>
<li xml:lang="tr">Pod yayını arama</li>
@@ -219,6 +219,7 @@
<li xml:lang="cs">Plná integrace do systému: např. potlačení uspání systému při poslechu</li>
<li xml:lang="en-GB">Full system integration: e.g. inhibit system suspend while listening</li>
<li xml:lang="es">Completa integración con el sistema: por ejemplo, inhibición de la suspensión del sistema cuando se está reproduciendo</li>
+ <li xml:lang="eu">Sistema osoarekin bateratzea: adib. entzun bitartean sistema esekitzea eragoztea</li>
<li xml:lang="fi">Täysi järjestelmäeheytys, esim. estää järjestelmän lepotilan kuunneltaessa</li>
<li xml:lang="fr">Intégration totale avec le système : par exemple, inhibition de la mise en veille du système durant la lecture</li>
<li xml:lang="id">Integrasi sistem penuh: mis. menghambat sistem suspensi saat mendengarkan</li>
@@ -228,10 +229,9 @@
<li xml:lang="nl">Volledige systeemintegratie: bijv. het systeem niet uitschakelen tijdens luisteren</li>
<li xml:lang="pl">Pełna integracja z systemem, tj. nie usypianie systemu podczas słuchania</li>
<li xml:lang="pt">Integração total com o sistema: p.ex. inibir a suspensão do sistema enquanto escuta algo</li>
- <li xml:lang="ru">Полная интеграция с системой: при воспроизведении подкастов работа системы не приостанавливается;</li>
<li xml:lang="sl">Popolna sistemska integracija: npr. preprečevanje mirovanja sistema pri poslušanju</li>
<li xml:lang="sv">Fullständig systemintegrering: t.ex. förhindra att systemet går till viloläge under uppspelning</li>
- <li xml:lang="tr">Tam sistem tümleşimi; örn. dinlerken sistem uykusunu ertele</li>
+ <li xml:lang="tr">Tam sistem tümleşimi; örn. dinlerken sistem uykusunu engelleme</li>
<li xml:lang="uk">Повна інтеграція із системою, зокрема заборона присипляння пристрою під час прослуховування</li>
<li xml:lang="x-test">xxFull system integration: e.g. inhibit system suspend while listeningxx</li>
</ul>
@@ -251,16 +251,18 @@
<caption xml:lang="ca-valencia">Kasts en l'escriptori amb la barra de capçalera predeterminada</caption>
<caption xml:lang="en-GB">Kasts on the desktop with default header bar</caption>
<caption xml:lang="es">Kasts en el escritorio con la barra de cabeceras predeterminada</caption>
+ <caption xml:lang="eu">«Kasts» mahaigainean goiburu-barra lehenetsiarekin</caption>
<caption xml:lang="fi">Kasts työpöydällä oletusotsikkorivillä</caption>
<caption xml:lang="fr">Kasts sur le bureau avec la barre d'en-tête par défaut</caption>
<caption xml:lang="it">Kasts sul desktop con barra delle intestazioni predefinita</caption>
<caption xml:lang="ka">Kasts -ი სამუშაო კომპიუტერზე ნაგულისხმები თავსართის ზოლით</caption>
+ <caption xml:lang="ko">기본 헤더 표시줄이 있는 데스크톱에서의 Kasts</caption>
<caption xml:lang="nl">Kasts op het bureaublad met standaard kopbalk</caption>
<caption xml:lang="pl">Kasts na biurko z domyślnym paskiem nagłówkowym</caption>
<caption xml:lang="pt">O Kasts no computador sem o cabeçalho predefinido</caption>
- <caption xml:lang="ru">Kasts на рабочем столе со стандартной панелью заголовка</caption>
<caption xml:lang="sl">Kasts na namizju s privzeto letvico glave</caption>
- <caption xml:lang="tr">Öntanımlı başlık çubuğuyla masaüstünde Kasts</caption>
+ <caption xml:lang="sv">Kasts på skrivbordet med vanlig huvudrad</caption>
+ <caption xml:lang="tr">Öntanımlı başlık çubuğuyla masaüstünde Kastlar</caption>
<caption xml:lang="uk">Kasts на стільниці із типовою смужкою заголовка</caption>
<caption xml:lang="x-test">xxKasts on the desktop with default header barxx</caption>
<image>https://cdn.kde.org/screenshots/kasts/kasts-desktop.png</image>
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/org.kde.kasts.desktop
^
|
@@ -7,9 +7,13 @@
Name[cs]=Kasts
Name[de]=Kasts
Name[en_GB]=Kasts
+Name[eo]=Kasts
Name[es]=Kasts
+Name[eu]=Kasts
Name[fi]=Kasts
Name[fr]=Kasts
+Name[gl]=Kasts
+Name[ia]=Kasts
Name[it]=Kasts
Name[ka]=Kasts
Name[ko]=Kasts
@@ -18,11 +22,10 @@
Name[pl]=Kasts
Name[pt]=Kasts
Name[pt_BR]=Kasts
-Name[ru]=Kasts
Name[sk]=Kasts
Name[sl]=Kasts
Name[sv]=Kasts
-Name[tr]=Kasts
+Name[tr]=Kastlar
Name[uk]=Kasts
Name[x-test]=xxKastsxx
Name[zh_CN]=Kasts
@@ -32,18 +35,20 @@
Comment[cs]=Mobilní aplikace pro přehrávání podcastů
Comment[de]=Podcast-Anwendung für Mobilgeräte
Comment[en_GB]=Mobile Podcast Application
+Comment[eo]=Poŝtelefona Podkast-Aplikaĵo
Comment[es]=Aplicación de pódcast para móviles
+Comment[eu]=Mugikorreko podcast aplikazioa
Comment[fi]=Podcast-mobiilisovellus
Comment[fr]=Application mobile pour podcasts
+Comment[gl]=Aplicación de podcasts para móbiles.
Comment[it]=Applicazione mobile per podcast
Comment[ka]=მობილური პოდკასტის აპლიკაცია
-Comment[ko]=모바일 팟캐스트 프로그램
+Comment[ko]=모바일 팟캐스트 앱
Comment[nl]=Podcastprogramma voor mobiel
Comment[pa]=ਮੋਬਾਈਲ ਪੋਡਕਾਸਟ ਐਪਲੀਕੇਸ਼ਨ
Comment[pl]=Przenośna aplikacja do podkastów
Comment[pt]=Aplicação Móvel de 'Podcasts'
Comment[pt_BR]=Aplicativo de podcast móvel
-Comment[ru]=Мобильное приложение для подкастов
Comment[sk]=Mobilná aplikácia na podcasty
Comment[sl]=Aplikacija mobilnih podcastov
Comment[sv]=Mobilt poddradioprogram
@@ -57,18 +62,20 @@
GenericName[cs]=Aplikace pro přehrávání podcastů
GenericName[de]=Podcast-Anwendung
GenericName[en_GB]=Podcast Application
+GenericName[eo]=Podkast-Aplikaĵo
GenericName[es]=Aplicación de pódcast
+GenericName[eu]=Podcast aplikazioa
GenericName[fi]=Podcast-sovellus
GenericName[fr]=Application pour podcasts
+GenericName[gl]=Aplicación de podcasts
GenericName[it]=Applicazione podcast
GenericName[ka]=პოდკასტის აპლიკაცია
-GenericName[ko]=팟캐스트 프로그램
+GenericName[ko]=팟캐스트 앱
GenericName[nl]=Podcastprogramma
GenericName[pa]=ਪੋਡਕਾਸਟ ਐਪਲੀਕੇਸ਼ਨ
GenericName[pl]=Aplikacja do podkastów
GenericName[pt]=Aplicação de 'Podcasts'
GenericName[pt_BR]=Aplicativo de podcast
-GenericName[ru]=Приложение для подкастов
GenericName[sk]=Aplikácia na podcasty
GenericName[sl]=Aplikacija podcastov
GenericName[sv]=Poddradioprogram
@@ -82,16 +89,19 @@
Keywords[cs]=podcast
Keywords[de]=Podcast
Keywords[en_GB]=podcast
+Keywords[eo]=podkasto
Keywords[es]=pódcast
+Keywords[eu]=podcast
Keywords[fi]=podcast
Keywords[fr]=podcast
+Keywords[gl]=podcast
+Keywords[ia]=podcast
Keywords[it]=podcast
Keywords[ka]=პოდკასტი
Keywords[ko]=팟캐스트
Keywords[nl]=podcast
Keywords[pl]=podkast
Keywords[pt]=podcast
-Keywords[ru]=podcast;подкаст
Keywords[sl]=podcast
Keywords[sv]=poddsändning
Keywords[tr]=pod yayını
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/ca/kasts.po
^
|
@@ -3,14 +3,14 @@
# This file is distributed under the license LGPL version 2.1 or
# version 3 or later versions approved by the membership of KDE e.V.
#
-# Antoni Bella Pérez <antonibella5@yahoo.com>, 2021, 2022.
+# Antoni Bella Pérez <antonibella5@yahoo.com>, 2021, 2022, 2023.
# Josep M. Ferrer <txemaq@gmail.com>, 2021, 2022, 2023.
msgid ""
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-02-28 10:12+0100\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-28 10:46+0200\n"
"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
"Language: ca\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 20.12.0\n"
+"X-Generator: Lokalize 22.12.3\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -30,19 +30,19 @@
msgid "Your emails"
msgstr "antonibella5@yahoo.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
"No hi ha connexió o no es permet la transmissió en continu amb una connexió "
"d'ús mesurat"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
-msgstr "Suport no vàlid"
+msgstr "Fitxer multimèdia no vàlid"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -55,27 +55,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Error en actualitzar el podcast"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
-msgstr "Error en la baixada dels suports"
+msgid "Media download error"
+msgstr "Error en la baixada dels elements multimèdia"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
-msgstr "Actualització no permesa amb la connexió d'ús mesurat"
+msgid "Update not allowed on metered connection"
+msgstr "Actualització no permesa en la connexió d'ús mesurat"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
-msgstr "Fitxer de suport no vàlid"
+msgid "Invalid media file"
+msgstr "Fitxer multimèdia no vàlid"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "No s'ha trobat res"
#: error.cpp:58
@@ -85,29 +85,29 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Error de sincronització en l'estat de la font o de l'episodi"
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
"No hi ha connexió o no es permet la transmissió en continu amb una connexió "
"d'ús mesurat"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr "Exemple de reproductor KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "Selecció de fitxer..."
+msgid "Select File…"
+msgstr "Selecció de fitxer…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr "Selecció de fitxer multimèdia"
#: kmediasession/example-app/qml/main.qml:85
@@ -120,16 +120,14 @@
msgid "Open"
msgstr "Obre"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Reprodueix"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pausa"
@@ -146,33 +144,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "títol: %1"
+msgid "Title: %1"
+msgstr "Títol: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "artista: %1"
+msgid "Artist: %1"
+msgstr "Artista: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "àlbum: %1"
+msgid "Album: %1"
+msgstr "Àlbum: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "estat del fitxer multimèdia: %1"
+msgid "Media status: %1"
+msgstr "Estat del fitxer multimèdia: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
-msgstr "estat de la reproducció: %1"
+msgid "Playback status: %1"
+msgstr "Estat de la reproducció: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "error: %1"
+msgid "Error: %1"
+msgstr "Error: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -181,94 +179,168 @@
msgid "Playing Media"
msgstr "Reproducció de fitxer multimèdia"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Aplicació de podcast"
-#: main.cpp:114
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/ca@valencia/kasts.po
^
|
@@ -3,14 +3,14 @@
# This file is distributed under the license LGPL version 2.1 or
# version 3 or later versions approved by the membership of KDE e.V.
#
-# Antoni Bella Pérez <antonibella5@yahoo.com>, 2021, 2022.
+# Antoni Bella Pérez <antonibella5@yahoo.com>, 2021, 2022, 2023.
# Josep M. Ferrer <txemaq@gmail.com>, 2021, 2022, 2023.
msgid ""
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-02-28 10:12+0100\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-28 10:46+0200\n"
"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
"Language: ca@valencia\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 20.12.0\n"
+"X-Generator: Lokalize 22.12.3\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -30,19 +30,19 @@
msgid "Your emails"
msgstr "antonibella5@yahoo.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
"No hi ha connexió o no es permet la transmissió en continu amb una connexió "
"d'ús mesurat"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
-msgstr "Suport no vàlid"
+msgstr "Fitxer multimèdia no vàlid"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "Baixades de podcast no permeses a causa de la configuració de l'usuari"
@@ -54,27 +54,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "S'ha produït un error en actualitzar el podcast"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
-msgstr "S'ha produït un error en la baixada dels suports"
+msgid "Media download error"
+msgstr "S'ha produït un error en la baixada dels elements multimèdia"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
-msgstr "Actualització no permesa amb la connexió d'ús mesurat"
+msgid "Update not allowed on metered connection"
+msgstr "Actualització no permesa en la connexió d'ús mesurat"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
-msgstr "Fitxer de suport no vàlid"
+msgid "Invalid media file"
+msgstr "Fitxer multimèdia no vàlid"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "No s'ha trobat res"
#: error.cpp:58
@@ -84,30 +84,30 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
"S'ha produït un error de sincronització en l'estat de la font o de l'episodi"
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
"No hi ha connexió o no es permet la transmissió en continu amb una connexió "
"d'ús mesurat"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr "Exemple de reproductor KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "Seleccioneu un fitxer..."
+msgid "Select File…"
+msgstr "Seleccioneu un fitxer…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr "Seleccioneu un fitxer multimèdia"
#: kmediasession/example-app/qml/main.qml:85
@@ -120,16 +120,14 @@
msgid "Open"
msgstr "Obri"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Reproduïx"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pausa"
@@ -146,33 +144,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "títol: %1"
+msgid "Title: %1"
+msgstr "Títol: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "artista: %1"
+msgid "Artist: %1"
+msgstr "Artista: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "àlbum: %1"
+msgid "Album: %1"
+msgstr "Àlbum: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "estat del fitxer multimèdia: %1"
+msgid "Media status: %1"
+msgstr "Estat del fitxer multimèdia: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
-msgstr "estat de la reproducció: %1"
+msgid "Playback status: %1"
+msgstr "Estat de la reproducció: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "s'ha produït un error: %1"
+msgid "Error: %1"
+msgstr "S'ha produït un error: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -181,94 +179,168 @@
msgid "Playing Media"
msgstr "Reproduïu un fitxer multimèdia"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Aplicació de podcast"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/cs/kasts.po
^
|
@@ -6,8 +6,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-03-01 16:22+0100\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-06-23 10:06+0200\n"
"Last-Translator: Vit Pelcak <vit@pelcak.org>\n"
"Language-Team: Czech <kde-i18n-doc@kde.org>\n"
"Language: cs\n"
@@ -15,7 +15,7 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Lokalize 22.12.3\n"
+"X-Generator: Lokalize 23.04.2\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr "vit@pelcak.org"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "Spojení nebo streamování na měřeném připojení není povoleno"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Neplatné médium"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "Uživatelské nastavení nepovoluje stažení podcastů"
@@ -49,27 +49,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
-msgstr "Chyba aktualizace podcastu"
+msgid "Podcast update error"
+msgstr ""
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
-msgstr "Chyba stahování média"
+msgid "Media download error"
+msgstr ""
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr ""
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
-msgstr "Neplatný soubor média"
+msgid "Invalid media file"
+msgstr ""
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Nic nenalezeno"
#: error.cpp:58
@@ -79,28 +79,28 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr "Ukázkový přehrávač KMediaSession"
+msgid "Example KMediaSession Player"
+msgstr ""
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "Vyberte soubor..."
+msgid "Select File…"
+msgstr "Vybrat soubor…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
-msgstr "Vyberte soubor médií"
+msgid "Select Media File"
+msgstr ""
#: kmediasession/example-app/qml/main.qml:85
#, kde-format
@@ -112,16 +112,14 @@
msgid "Open"
msgstr "Otevřít"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Přehrát"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pozastavit"
@@ -138,33 +136,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "název: %1"
+msgid "Title: %1"
+msgstr "Název: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "umělec: %1"
+msgid "Artist: %1"
+msgstr "Umělec: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "album: %1"
+msgid "Album: %1"
+msgstr "Album: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "stav média: %1"
+msgid "Media status: %1"
+msgstr ""
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
-msgstr "stav přehrávání: %1"
+msgid "Playback status: %1"
+msgstr ""
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "chyba: %1"
+msgid "Error: %1"
+msgstr "Chyba: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -173,93 +171,167 @@
msgid "Playing Media"
msgstr "Přehrávám média"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Aplikace pro přehrávání podcastů"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr ""
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/de/kasts.po
^
|
@@ -6,8 +6,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-05-12 19:55+0200\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-06-12 00:16+0200\n"
"Last-Translator: Frederik Schwarzer <schwarzer@kde.org>\n"
"Language-Team: German <kde-i18n-de@kde.org>\n"
"Language: de\n"
@@ -15,7 +15,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 22.07.70\n"
+"X-Generator: Lokalize 23.07.70\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr "kde-i18n-de@kde.org"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Ungültige Medien"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -49,28 +49,33 @@
msgstr "%1 wird heruntergeladen"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
+#, fuzzy, kde-format
+#| msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Fehler beim Aktualisieren des Podcasts"
#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
+#, fuzzy, kde-format
+#| msgid "Media Download Error"
+msgid "Media download error"
msgstr "Fehler beim Herunterladen von Medien"
#: error.cpp:52
-#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Aktualisierung ist bei gebührenpflichtigen Verbindungen nicht erlaubt"
#: error.cpp:54
-#, kde-format
-msgid "Invalid Media File"
+#, fuzzy, kde-format
+#| msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Ungültige Mediendatei"
#: error.cpp:56
-#, kde-format
-msgid "Nothing Found"
+#, fuzzy, kde-format
+#| msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Nichts gefunden"
#: error.cpp:58
@@ -79,29 +84,33 @@
msgstr "Fehler beim Verschieben des Speicherpfades"
#: error.cpp:60
-#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+#, fuzzy, kde-format
+#| msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Fehler beim Synchronisieren des Quellen- und/oder Episodenstatus’"
#: error.cpp:62
#, fuzzy, kde-format
#| msgid "Update Not Allowed on Metered Connection"
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "Aktualisierung ist bei gebührenpflichtigen Verbindungen nicht erlaubt"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr ""
#: kmediasession/example-app/qml/main.qml:72
-#, kde-format
-msgid "Select file..."
-msgstr "Datei auswählen ..."
+#, fuzzy, kde-format
+#| msgctxt "@title:menu"
+#| msgid "Select Filter"
+msgid "Select File…"
+msgstr "Filter auswählen"
#: kmediasession/example-app/qml/main.qml:78
-#, kde-format
-msgid "Select media file"
+#, fuzzy, kde-format
+#| msgid "Select media file"
+msgid "Select Media File"
msgstr "Mediendatei auswählen"
#: kmediasession/example-app/qml/main.qml:85
@@ -114,16 +123,14 @@
msgid "Open"
msgstr "Öffnen"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Wiedergabe"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Anhalten"
@@ -139,34 +146,38 @@
msgstr "Stummschalten"
#: kmediasession/example-app/qml/main.qml:174
-#, kde-format
-msgid "title: %1"
+#, fuzzy, kde-format
+#| msgid "title: %1"
+msgid "Title: %1"
msgstr "Titel: %1"
#: kmediasession/example-app/qml/main.qml:177
-#, kde-format
-msgid "artist: %1"
+#, fuzzy, kde-format
+#| msgid "artist: %1"
+msgid "Artist: %1"
msgstr "Interpret: %1"
#: kmediasession/example-app/qml/main.qml:180
-#, kde-format
-msgid "album: %1"
+#, fuzzy, kde-format
+#| msgid "album: %1"
+msgid "Album: %1"
msgstr "Album: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:194
#, fuzzy, kde-format
#| msgid "Playback Rate: "
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "Wiedergabegeschwindigkeit:"
#: kmediasession/example-app/qml/main.qml:197
-#, kde-format
-msgid "error: %1"
+#, fuzzy, kde-format
+#| msgid "error: %1"
+msgid "Error: %1"
msgstr "Fehler: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -176,92 +187,181 @@
msgid "Playing Media"
msgstr "Mediendatei abspielen"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/en_GB/kasts.po
^
|
@@ -6,8 +6,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-03-02 22:05+0000\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-06-17 12:09+0100\n"
"Last-Translator: Steve Allewell <steve.allewell@gmail.com>\n"
"Language-Team: British English\n"
"Language: en_GB\n"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr "steve.allewell@gmail.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "No connection or streaming on metered connection not allowed"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Invalid Media"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "Podcast downloads not allowed due to user setting"
@@ -48,28 +48,33 @@
msgstr "Downloading %1"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
+#, fuzzy, kde-format
+#| msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Podcast Update Error"
#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
+#, fuzzy, kde-format
+#| msgid "Media Download Error"
+msgid "Media download error"
msgstr "Media Download Error"
#: error.cpp:52
-#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Update Not Allowed on Metered Connection"
#: error.cpp:54
-#, kde-format
-msgid "Invalid Media File"
+#, fuzzy, kde-format
+#| msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Invalid Media File"
#: error.cpp:56
-#, kde-format
-msgid "Nothing Found"
+#, fuzzy, kde-format
+#| msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Nothing Found"
#: error.cpp:58
@@ -78,28 +83,34 @@
msgstr "Error moving storage path"
#: error.cpp:60
-#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+#, fuzzy, kde-format
+#| msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Error Syncing Feed and/or Episode Status"
#: error.cpp:62
-#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "No Connection or Streaming Not Allowed on Metered Connection"
#: kmediasession/example-app/qml/main.qml:20
-#, kde-format
-msgid "Example player KMediaSession"
+#, fuzzy, kde-format
+#| msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr "Example player KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
-#, kde-format
-msgid "Select file..."
-msgstr "Select file..."
+#, fuzzy, kde-format
+#| msgctxt "@title:menu"
+#| msgid "Select Filter"
+msgid "Select File…"
+msgstr "Select Filter"
#: kmediasession/example-app/qml/main.qml:78
-#, kde-format
-msgid "Select media file"
+#, fuzzy, kde-format
+#| msgid "Select media file"
+msgid "Select Media File"
msgstr "Select media file"
#: kmediasession/example-app/qml/main.qml:85
@@ -112,16 +123,14 @@
msgid "Open"
msgstr "Open"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Play"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pause"
@@ -137,33 +146,39 @@
msgstr "Mute"
#: kmediasession/example-app/qml/main.qml:174
-#, kde-format
-msgid "title: %1"
+#, fuzzy, kde-format
+#| msgid "title: %1"
+msgid "Title: %1"
msgstr "title: %1"
#: kmediasession/example-app/qml/main.qml:177
-#, kde-format
-msgid "artist: %1"
+#, fuzzy, kde-format
+#| msgid "artist: %1"
+msgid "Artist: %1"
msgstr "artist: %1"
#: kmediasession/example-app/qml/main.qml:180
-#, kde-format
-msgid "album: %1"
+#, fuzzy, kde-format
+#| msgid "album: %1"
+msgid "Album: %1"
msgstr "album: %1"
#: kmediasession/example-app/qml/main.qml:191
-#, kde-format
-msgid "mediaStatus: %1"
+#, fuzzy, kde-format
+#| msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr "mediaStatus: %1"
#: kmediasession/example-app/qml/main.qml:194
-#, kde-format
-msgid "playbackStatus: %1"
+#, fuzzy, kde-format
+#| msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "playbackStatus: %1"
#: kmediasession/example-app/qml/main.qml:197
-#, kde-format
-msgid "error: %1"
+#, fuzzy, kde-format
+#| msgid "error: %1"
+msgid "Error: %1"
msgstr "error: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -173,92 +188,181 @@
msgid "Playing Media"
msgstr "Playing Media"
-#: main.cpp:112
+#: main.cpp:113
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/es/kasts.po
^
|
@@ -8,8 +8,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-02-28 02:56+0100\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-30 19:12+0200\n"
"Last-Translator: Eloy Cuadra <ecuadra@eloihr.net>\n"
"Language-Team: Spanish <kde-l10n-es@kde.org>\n"
"Language: es\n"
@@ -17,7 +17,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 22.12.2\n"
+"X-Generator: Lokalize 23.04.3\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -29,17 +29,17 @@
msgid "Your emails"
msgstr "ecuadra@eloihr.net"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "No hay conexión o no se permite emitir en conexiones de uso medido"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Medio no válido"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "No se pueden descargar pódcast por las preferencias del usuario"
@@ -51,27 +51,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Error de actualización de pódcast"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr "Error de descarga multimedia"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Actualizar «No disponible» en conexiones de uso medido"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
-msgstr "Archivo de medio no válido"
+msgid "Invalid media file"
+msgstr "Archivo multimedia no válido"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "No se ha encontrado nada"
#: error.cpp:58
@@ -81,27 +81,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Error al sincronizar la fuente y/o el estado de los episodios"
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
-msgstr "No hay conexión o no se permite emitir en conexiones de uso medido"
+msgid "Connection or streaming not allowed on metered connection"
+msgstr "Conexión o emisión no permitida en conexiones de uso medido"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr "Reproductor de ejemplo KMediaSession"
+msgid "Example KMediaSession Player"
+msgstr "Reproductor KMediaSession de ejemplo"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
+msgid "Select File…"
msgstr "Seleccionar archivo..."
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr "Seleccionar archivo multimedia"
#: kmediasession/example-app/qml/main.qml:85
@@ -114,16 +114,14 @@
msgid "Open"
msgstr "Abrir"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Reproducir"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pausar"
@@ -140,33 +138,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "título: %1"
+msgid "Title: %1"
+msgstr "Título: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "artista: %1"
+msgid "Artist: %1"
+msgstr "Artista: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "álbum: %1"
+msgid "Album: %1"
+msgstr "Álbum: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "estado del medio: %1"
+msgid "Media status: %1"
+msgstr "Estado del medio: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
-msgstr "estado de reproducción: %1"
+msgid "Playback status: %1"
+msgstr "Estado de reproducción: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "error: %1"
+msgid "Error: %1"
+msgstr "Error: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -175,94 +173,168 @@
msgid "Playing Media"
msgstr "Reproduciendo medio"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Aplicación de pódcast"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr "Añade un nuevo pódcast a las suscripciones."
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr "URL del pódcast"
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
|
[-]
[+]
|
Added |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/eu/kasts.po
^
|
@@ -0,0 +1,2060 @@
+# Copyright (C) YEAR This file is copyright:
+# This file is distributed under the same license as the kasts package.
+#
+# Iñigo Salvador Azurmendi <xalba@ni.eus>, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: kasts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-08-03 23:16+0200\n"
+"Last-Translator: Iñigo Salvador Azurmendi <xalba@ni.eus>\n"
+"Language-Team: Basque <kde-i18n-eu@kde.org>\n"
+"Language: eu\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 23.04.3\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Iñigo Salvador Azurmendi"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "xalba@ni.eus"
+
+#: audiomanager.cpp:402
+#, kde-format
+msgid "No connection or streaming on metered connection not allowed"
+msgstr "Konexiorik ez edo ez da korronterik baimentzen tarifatutako konexioan"
+
+#: audiomanager.cpp:541
+#, kde-format
+msgid "Invalid Media"
+msgstr "Komunikabide baliogabea"
+
+#: enclosure.cpp:163
+#, kde-format
+msgid "Podcast downloads not allowed due to user setting"
+msgstr "Erabiltzailearen ezarpenek ez dute onartzen podcastak zama-jaistea"
+
+#: enclosuredownloadjob.cpp:33
+#, kde-format
+msgid "Downloading %1"
+msgstr "%1 zama-jaisten"
+
+#: error.cpp:48
+#, kde-format
+msgid "Podcast update error"
+msgstr "Podcasta eguneratzeko errorea"
+
+#: error.cpp:50
+#, kde-format
+msgid "Media download error"
+msgstr "Komunikabidea zama-jaisteko errorea"
+
+#: error.cpp:52
+#, kde-format
+msgid "Update not allowed on metered connection"
+msgstr "Eguneratzea ez dago baimenduta tarifatutako konexioan"
+
+#: error.cpp:54
+#, kde-format
+msgid "Invalid media file"
+msgstr "Komunikabide-fitxategia baliogabea"
+
+#: error.cpp:56
+#, kde-format
+msgid "Nothing found"
+msgstr "Ez da ezer aurkitu"
+
+#: error.cpp:58
+#, kde-format
+msgid "Error moving storage path"
+msgstr "Biltegiratze bide-izena mugitzeko errorea"
+
+#: error.cpp:60
+#, kde-format
+msgid "Error syncing feed and/or episode status"
+msgstr "Jarioa eta/edo atalen egoera sinkronizatzeko errorea"
+
+#: error.cpp:62
+#, kde-format
+msgid "Connection or streaming not allowed on metered connection"
+msgstr "Konexioa edo korrontea ez dago baimenduta tarifatutako konexioan"
+
+#: kmediasession/example-app/qml/main.qml:20
+#, kde-format
+msgid "Example KMediaSession Player"
+msgstr "KMediaSession jotzaile adibidea"
+
+#: kmediasession/example-app/qml/main.qml:72
+#, kde-format
+msgid "Select File…"
+msgstr "Hautatu fitxategia..."
+
+#: kmediasession/example-app/qml/main.qml:78
+#, kde-format
+msgid "Select Media File"
+msgstr "Hautatu komunikabide-fitxategia"
+
+#: kmediasession/example-app/qml/main.qml:85
+#, kde-format
+msgid "OR"
+msgstr "EDO"
+
+#: kmediasession/example-app/qml/main.qml:93
+#, kde-format
+msgid "Open"
+msgstr "Ireki"
+
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
+#, kde-format
+msgid "Play"
+msgstr "Jo"
+
+#: kmediasession/example-app/qml/main.qml:109
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
+#, kde-format
+msgid "Pause"
+msgstr "Etenaldia"
+
+#: kmediasession/example-app/qml/main.qml:117 qml/SleepTimerDialog.qml:41
+#, kde-format
+msgid "Stop"
+msgstr "Gelditu"
+
+#: kmediasession/example-app/qml/main.qml:147
+#, kde-format
+msgid "Mute"
+msgstr "Isilarazi"
+
+#: kmediasession/example-app/qml/main.qml:174
+#, kde-format
+msgid "Title: %1"
+msgstr "Izenburua: %1"
+
+#: kmediasession/example-app/qml/main.qml:177
+#, kde-format
+msgid "Artist: %1"
+msgstr "Artista: %1"
+
+#: kmediasession/example-app/qml/main.qml:180
+#, kde-format
+msgid "Album: %1"
+msgstr "Albuma: %1"
+
+#: kmediasession/example-app/qml/main.qml:191
+#, kde-format
+msgid "Media status: %1"
+msgstr "Komunikabidearen egoera: %1"
+
+#: kmediasession/example-app/qml/main.qml:194
+#, kde-format
+msgid "Playback status: %1"
+msgstr "Atzera-jotze egoera: %1"
+
+#: kmediasession/example-app/qml/main.qml:197
+#, kde-format
+msgid "Error: %1"
+msgstr "Errorea: %1"
+
+#: kmediasession/powermanagement/powermanagementinterface.cpp:188
+#: kmediasession/powermanagement/powermanagementinterface.cpp:214
+#, kde-format
+msgctxt "Explanation for sleep inhibit during media playback"
+msgid "Playing Media"
+msgstr "Komunikabidea jotzen"
+
+#: main.cpp:113
+#, kde-format
+msgid "Podcast Application"
+msgstr "Podcast aplikazioa"
+
+#: main.cpp:115
+#, kde-format
+msgid "Adds a new podcast to subscriptions."
+msgstr "Harpidetzetara podcast berri bat gehitzen du."
+
+#: main.cpp:116
+#, kde-format
+msgid "Podcast URL"
+msgstr "Podcastaren URL"
+
+#: main.cpp:121 qml/main.qml:20
+#, kde-format
+msgid "Kasts"
+msgstr "Kasts"
+
+#: main.cpp:123
+#, kde-format
+msgid "Podcast Player"
+msgstr "Podcast jotzailea"
+
+#: main.cpp:125
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/fi/kasts.po
^
|
@@ -6,8 +6,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-03-29 23:07+0300\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-06-27 17:50+0300\n"
"Last-Translator: Tommi Nieminen <translator@legisign.org>\n"
"Language-Team: Finnish <kde-i18n-doc@kde.org>\n"
"Language: fi\n"
@@ -15,7 +15,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 20.12.0\n"
+"X-Generator: Lokalize 22.12.3\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr "translator@legisign.org"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "Ei yhteyttä tai suoratoistoa ei sallittu maksullisessa yhteydessä"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Virheellinen media"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "Käyttäjäasetus ei salli podcastien latausta"
@@ -48,28 +48,33 @@
msgstr "Ladataan: %1"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
+#, fuzzy, kde-format
+#| msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Podcast-virkistysvirhe"
#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
+#, fuzzy, kde-format
+#| msgid "Media Download Error"
+msgid "Media download error"
msgstr "Median latausvirhe"
#: error.cpp:52
-#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Maksullinen yhteys ei salli virkistystä"
#: error.cpp:54
-#, kde-format
-msgid "Invalid Media File"
+#, fuzzy, kde-format
+#| msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Virheellinen mediatiedosto"
#: error.cpp:56
-#, kde-format
-msgid "Nothing Found"
+#, fuzzy, kde-format
+#| msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Mitään ei löytynyt"
#: error.cpp:58
@@ -78,28 +83,34 @@
msgstr "Virhe siirrettäessä tallennuspaikkaa"
#: error.cpp:60
-#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+#, fuzzy, kde-format
+#| msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Virhe synkronoitaessa syötteen tai jakson tilaa"
#: error.cpp:62
-#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "Ei yhteyttä tai suoratoistoa ei sallittu maksullisessa yhteydessä"
#: kmediasession/example-app/qml/main.qml:20
-#, kde-format
-msgid "Example player KMediaSession"
+#, fuzzy, kde-format
+#| msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr "Esimerkkisoitin KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
-#, kde-format
-msgid "Select file..."
-msgstr "Valitse tiedosto…"
+#, fuzzy, kde-format
+#| msgctxt "@title:menu"
+#| msgid "Select Filter"
+msgid "Select File…"
+msgstr "Valitse suodatin"
#: kmediasession/example-app/qml/main.qml:78
-#, kde-format
-msgid "Select media file"
+#, fuzzy, kde-format
+#| msgid "Select media file"
+msgid "Select Media File"
msgstr "Valitse mediatiedosto"
#: kmediasession/example-app/qml/main.qml:85
@@ -112,16 +123,14 @@
msgid "Open"
msgstr "Avaa"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Soita"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Keskeytä"
@@ -137,33 +146,39 @@
msgstr "Vaimenna"
#: kmediasession/example-app/qml/main.qml:174
-#, kde-format
-msgid "title: %1"
+#, fuzzy, kde-format
+#| msgid "title: %1"
+msgid "Title: %1"
msgstr "otsikko: %1"
#: kmediasession/example-app/qml/main.qml:177
-#, kde-format
-msgid "artist: %1"
+#, fuzzy, kde-format
+#| msgid "artist: %1"
+msgid "Artist: %1"
msgstr "artisti: %1"
#: kmediasession/example-app/qml/main.qml:180
-#, kde-format
-msgid "album: %1"
+#, fuzzy, kde-format
+#| msgid "album: %1"
+msgid "Album: %1"
msgstr "albumi: %1"
#: kmediasession/example-app/qml/main.qml:191
-#, kde-format
-msgid "mediaStatus: %1"
+#, fuzzy, kde-format
+#| msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr "median tila: %1"
#: kmediasession/example-app/qml/main.qml:194
-#, kde-format
-msgid "playbackStatus: %1"
+#, fuzzy, kde-format
+#| msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "toiston tila: %1"
#: kmediasession/example-app/qml/main.qml:197
-#, kde-format
-msgid "error: %1"
+#, fuzzy, kde-format
+#| msgid "error: %1"
+msgid "Error: %1"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/fr/kasts.po
^
|
@@ -4,9 +4,9 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-03-01 07:01+0100\n"
-"Last-Translator: Xavier BESNARD <xavier.besnard]neuf.fr>\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-05-27 11:17+0200\n"
+"Last-Translator: Xavier BESNARD <xavier.besnard@neuf.fr>\n"
"Language-Team: fr\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
@@ -25,19 +25,19 @@
msgid "Your emails"
msgstr "xavier.besnard@neuf.fr"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
"Aucune connexion ou lecture en flux n'est autorisée sur une connexion "
"facturée."
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Média non valable"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -50,28 +50,33 @@
msgstr "Téléchargement de %1"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
+#, fuzzy, kde-format
+#| msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Erreur de mise à jour de podcasts"
#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
+#, fuzzy, kde-format
+#| msgid "Media Download Error"
+msgid "Media download error"
msgstr "Erreur de téléchargement de média"
#: error.cpp:52
-#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Les mises à jour ne sont pas autorisées avec une connexion facturée"
#: error.cpp:54
-#, kde-format
-msgid "Invalid Media File"
+#, fuzzy, kde-format
+#| msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Fichier de média non valable"
#: error.cpp:56
-#, kde-format
-msgid "Nothing Found"
+#, fuzzy, kde-format
+#| msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Rien n'a été trouvé"
#: error.cpp:58
@@ -80,32 +85,38 @@
msgstr "Erreur lors du déplacement du dossier de stockage"
#: error.cpp:60
-#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+#, fuzzy, kde-format
+#| msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
"Erreur durant la synchronisation de l'état des discussions et /ou des "
"épisodes"
#: error.cpp:62
-#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
"Aucune connexion ou lecture en flux n'est autorisée sur une connexion "
"facturée."
#: kmediasession/example-app/qml/main.qml:20
-#, kde-format
-msgid "Example player KMediaSession"
+#, fuzzy, kde-format
+#| msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr "Exemple de lecteur KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
-#, kde-format
-msgid "Select file..."
-msgstr "Sélectionner un fichier..."
+#, fuzzy, kde-format
+#| msgctxt "@title:menu"
+#| msgid "Select Filter"
+msgid "Select File…"
+msgstr "Sélectionner un filtre"
#: kmediasession/example-app/qml/main.qml:78
-#, kde-format
-msgid "Select media file"
+#, fuzzy, kde-format
+#| msgid "Select media file"
+msgid "Select Media File"
msgstr "Sélectionner un fichier de média"
#: kmediasession/example-app/qml/main.qml:85
@@ -118,16 +129,14 @@
msgid "Open"
msgstr "Ouvrir"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Lire"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pause"
@@ -143,33 +152,39 @@
msgstr "Couper le son"
#: kmediasession/example-app/qml/main.qml:174
-#, kde-format
-msgid "title: %1"
+#, fuzzy, kde-format
+#| msgid "title: %1"
+msgid "Title: %1"
msgstr "Titre : %1"
#: kmediasession/example-app/qml/main.qml:177
-#, kde-format
-msgid "artist: %1"
+#, fuzzy, kde-format
+#| msgid "artist: %1"
+msgid "Artist: %1"
msgstr "Artiste : %1"
#: kmediasession/example-app/qml/main.qml:180
-#, kde-format
-msgid "album: %1"
+#, fuzzy, kde-format
+#| msgid "album: %1"
+msgid "Album: %1"
msgstr "Album : %1"
#: kmediasession/example-app/qml/main.qml:191
-#, kde-format
-msgid "mediaStatus: %1"
+#, fuzzy, kde-format
+#| msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr "État du média : %1"
#: kmediasession/example-app/qml/main.qml:194
-#, kde-format
-msgid "playbackStatus: %1"
+#, fuzzy, kde-format
+#| msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "État de lecture : %1"
#: kmediasession/example-app/qml/main.qml:197
-#, kde-format
-msgid "error: %1"
+#, fuzzy, kde-format
+#| msgid "error: %1"
+msgid "Error: %1"
msgstr "Erreur : %1"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/it/kasts.po
^
|
@@ -6,8 +6,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-03-01 01:33+0100\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-28 16:24+0200\n"
"Last-Translator: Vincenzo Reale <smart2128vr@gmail.com>\n"
"Language-Team: Italian <kde-i18n-it@kde.org>\n"
"Language: it\n"
@@ -15,7 +15,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.04.1\n"
+"X-Generator: Lokalize 23.04.3\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -27,18 +27,18 @@
msgid "Your emails"
msgstr "smart2128vr@gmail.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
"Nessuna connessione o trasmissione non consentita sulla connessione a consumo"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Supporto non valido"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -52,27 +52,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Errore di aggiornamento del podcast"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
-msgstr "Errore di scaricamento del supporto"
+msgid "Media download error"
+msgstr "Errore di scaricamento del file multimediale"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Aggiornamento non consentito su connessione a consumo"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "File multimediale non valido"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Non è stato trovato niente"
#: error.cpp:58
@@ -82,30 +82,29 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
"Errore durante la sincronizzazione della fonte e/o dello stato dell'episodio"
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
-msgstr ""
-"Nessuna connessione o trasmissione non consentita sulla connessione a consumo"
+msgid "Connection or streaming not allowed on metered connection"
+msgstr "Connessione o trasmissione non consentita su connessione a consumo"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr "Lettore di esempio KMediaSession"
+msgid "Example KMediaSession Player"
+msgstr "Esempio lettore KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "Seleziona file..."
+msgid "Select File…"
+msgstr "Seleziona file…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
-msgstr "Seleziona file del supporto"
+msgid "Select Media File"
+msgstr "Seleziona file multimediale"
#: kmediasession/example-app/qml/main.qml:85
#, kde-format
@@ -117,16 +116,14 @@
msgid "Open"
msgstr "Apri"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Riproduci"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pausa"
@@ -143,33 +140,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "titolo: %1"
+msgid "Title: %1"
+msgstr "Titolo: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "artista: %1"
+msgid "Artist: %1"
+msgstr "Artista: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "album: %1"
+msgid "Album: %1"
+msgstr "Album: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "stato del supporto: %1"
+msgid "Media status: %1"
+msgstr "Stato del supporto: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
-msgstr "stato di riproduzione: %1"
+msgid "Playback status: %1"
+msgstr "Stato di riproduzione: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "errore: %1"
+msgid "Error: %1"
+msgstr "Errore: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -178,94 +175,168 @@
msgid "Playing Media"
msgstr "Riproduzione del supporto"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Applicazione podcast"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr "Aggiungi un nuovo podcast alle sottoscrizioni."
-#: main.cpp:115
+#: main.cpp:116
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/ja/kasts.po
^
|
@@ -2,7 +2,7 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
"PO-Revision-Date: 2021-05-08 21:05-0700\n"
"Last-Translator: Japanese KDE translation team <kde-jp@kde.org>\n"
"Language-Team: Japanese <kde-jp@kde.org>\n"
@@ -24,17 +24,17 @@
msgid "Your emails"
msgstr ""
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr ""
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -46,27 +46,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr ""
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr ""
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr ""
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr ""
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr ""
#: error.cpp:58
@@ -76,27 +76,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr ""
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
+msgid "Select File…"
msgstr ""
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr ""
#: kmediasession/example-app/qml/main.qml:85
@@ -109,16 +109,14 @@
msgid "Open"
msgstr ""
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr ""
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr ""
@@ -135,32 +133,32 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
+msgid "Title: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
+msgid "Artist: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
+msgid "Album: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
+msgid "Error: %1"
msgstr ""
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -170,92 +168,166 @@
msgid "Playing Media"
msgstr ""
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr ""
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr ""
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr ""
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr ""
-#: main.cpp:122
+#: main.cpp:123
#, kde-format
msgid "Podcast Player"
msgstr ""
-#: main.cpp:124
+#: main.cpp:125
#, kde-format
-msgid "© 2020-2023 KDE Community"
+msgid "© 2020–2023 KDE Community"
msgstr ""
-#: main.cpp:125
+#: main.cpp:126
#, kde-format
msgid "Tobias Fella"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/ka/kasts.po
^
|
@@ -7,8 +7,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-02-28 07:00+0100\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-28 09:11+0200\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <kde-i18n-doc@kde.org>\n"
"Language: ka\n"
@@ -16,7 +16,7 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 3.2.2\n"
+"X-Generator: Poedit 3.3.2\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -28,17 +28,17 @@
msgid "Your emails"
msgstr "Temuri.doghonadze@gmail.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "გაზომვად შეერთებებზე მიერთება და სტრიმინგი დაშვებული არაა"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "არასწორი მედია"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "პოდკასტის გადმოწერა დაუშვებელია მომხმარებლის პარამეტრების გამო"
@@ -50,28 +50,28 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "პოდკასტის განახლების შეცდომა"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr "მედიის გადმოწერის შეცდომა"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "განახლება გაზომვადი ქსელური შეერთების დროს აკრძალულია"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "არასწორი მედია ფაილი"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
-msgstr "ვერაფერი მოიძებნა"
+msgid "Nothing found"
+msgstr "ვერაფერი ვიპოვე"
#: error.cpp:58
#, kde-format
@@ -80,27 +80,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "ლენტის ან/და ეპიზოდის სტატუსის სინქრონიზაციის შეცდომა"
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "გაზომვად შეერთებებზე მიერთება და სტრიმინგი დაშვებული არაა"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr "დამკვრელის მაგალითი KMediaSession"
+msgid "Example KMediaSession Player"
+msgstr "საჩვენებელი KMediaSession-ის დამკვრელი"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "აირჩიეთ ფაილი..."
+msgid "Select File…"
+msgstr "აირჩიეთ ფაილი…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr "აირჩიეთ მედია ფაილი"
#: kmediasession/example-app/qml/main.qml:85
@@ -113,16 +113,14 @@
msgid "Open"
msgstr "გახსნა"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "დაკვრა"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "შეჩერება"
@@ -139,32 +137,32 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
+msgid "Title: %1"
msgstr "სათაური: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
+msgid "Artist: %1"
msgstr "შემსრულებელი: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
+msgid "Album: %1"
msgstr "ალბომი: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "მედიისსტატუსი: %1"
+msgid "Media status: %1"
+msgstr "მედიის სტატუსი: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "დაკვრის მდგომარეობა: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
+msgid "Error: %1"
msgstr "შეცდომა: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -174,94 +172,168 @@
msgid "Playing Media"
msgstr "მუსიკის დაკვრა"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "პოდკასტის აპლიკაცია"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr "გამოწერისთვის ახალი პოდკასტის დამატება."
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr "პოდკასტის URL"
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr "Kasts"
-#: main.cpp:122
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/ko/kasts.po
^
|
@@ -1,21 +1,21 @@
# Copyright (C) YEAR This file is copyright:
# This file is distributed under the same license as the kasts package.
-# Shinjo Park <kde@peremen.name>, 2021, 2022.
+# Shinjo Park <kde@peremen.name>, 2021, 2022, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2022-10-03 16:30+0200\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-08-07 23:14+0200\n"
"Last-Translator: Shinjo Park <kde@peremen.name>\n"
-"Language-Team: Korean <kde-i18n-doc@kde.org>\n"
+"Language-Team: Korean <kde-kr@kde.org>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Lokalize 21.12.3\n"
+"X-Generator: Lokalize 22.12.3\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr "kde@peremen.name"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
-msgstr ""
+msgstr "연결되지 않았거나 종량제 연결에서 스트리밍이 허용되지 않음"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "잘못된 미디어"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "사용자 설정 때문에 팟캐스트 다운로드가 허용되지 않음"
@@ -49,27 +49,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "팟캐스트 업데이트 오류"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr "미디어 다운로드 오류"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "종량제 연결에서 업데이트가 허용되지 않음"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "잘못된 미디어 파일"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "찾을 수 없음"
#: error.cpp:58
@@ -79,53 +79,47 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "피드 및 에피소드 상태 동기화 오류"
#: error.cpp:62
-#, fuzzy, kde-format
-#| msgid "Update Not Allowed on Metered Connection"
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
-msgstr "종량제 연결에서 업데이트가 허용되지 않음"
+#, kde-format
+msgid "Connection or streaming not allowed on metered connection"
+msgstr "종량제 연결에서 연결이나 스트리밍이 허용되지 않음"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr ""
+msgid "Example KMediaSession Player"
+msgstr "예제 KMediaSession 재생기"
#: kmediasession/example-app/qml/main.qml:72
-#, fuzzy, kde-format
-#| msgid "Select folder..."
-msgid "Select file..."
-msgstr "폴더 선택..."
+#, kde-format
+msgid "Select File…"
+msgstr "파일 선택…"
#: kmediasession/example-app/qml/main.qml:78
-#, fuzzy, kde-format
-#| msgid "Select Filter"
-msgid "Select media file"
-msgstr "필터 선택"
+#, kde-format
+msgid "Select Media File"
+msgstr "미디어 파일 선택"
#: kmediasession/example-app/qml/main.qml:85
#, kde-format
msgid "OR"
-msgstr ""
+msgstr "또는"
#: kmediasession/example-app/qml/main.qml:93
-#, fuzzy, kde-format
-#| msgid "Open Podcast"
+#, kde-format
msgid "Open"
-msgstr "팟캐스트 열기"
+msgstr "열기"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "재생"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "일시 정지"
@@ -138,145 +132,206 @@
#: kmediasession/example-app/qml/main.qml:147
#, kde-format
msgid "Mute"
-msgstr ""
+msgstr "음소거"
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr ""
+msgid "Title: %1"
+msgstr "제목: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr ""
+msgid "Artist: %1"
+msgstr "아티스트: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr ""
+msgid "Album: %1"
+msgstr "앨범: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr ""
+msgid "Media status: %1"
+msgstr "미디어 상태: %1"
#: kmediasession/example-app/qml/main.qml:194
-#, fuzzy, kde-format
-#| msgid "Playback Rate: "
-msgid "playbackStatus: %1"
-msgstr "재생 속도:"
+#, kde-format
+msgid "Playback status: %1"
+msgstr "재생 상태: %1"
#: kmediasession/example-app/qml/main.qml:197
-#, fuzzy, kde-format
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/lt/kasts.po
^
|
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
"PO-Revision-Date: 2023-02-24 00:58+0000\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -28,17 +28,17 @@
msgid "Your emails"
msgstr ""
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr ""
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -50,27 +50,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr ""
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr ""
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr ""
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr ""
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr ""
#: error.cpp:58
@@ -80,27 +80,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr ""
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
+msgid "Select File…"
msgstr ""
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr ""
#: kmediasession/example-app/qml/main.qml:85
@@ -113,16 +113,14 @@
msgid "Open"
msgstr ""
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr ""
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr ""
@@ -139,32 +137,32 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
+msgid "Title: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
+msgid "Artist: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
+msgid "Album: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
+msgid "Error: %1"
msgstr ""
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -174,92 +172,166 @@
msgid "Playing Media"
msgstr ""
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr ""
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr ""
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr ""
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr ""
-#: main.cpp:122
+#: main.cpp:123
#, kde-format
msgid "Podcast Player"
msgstr ""
-#: main.cpp:124
+#: main.cpp:125
#, kde-format
-msgid "© 2020-2023 KDE Community"
+msgid "© 2020–2023 KDE Community"
msgstr ""
-#: main.cpp:125
+#: main.cpp:126
#, kde-format
msgid "Tobias Fella"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/nl/kasts.po
^
|
@@ -6,16 +6,16 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-02-28 10:42+0100\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-28 21:27+0200\n"
"Last-Translator: Freek de Kruijf <freekdekruijf@kde.nl>\n"
-"Language-Team: \n"
+"Language-Team: Dutch <kde-i18n-nl@kde.org>\n"
"Language: nl\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 22.12.2\n"
+"X-Generator: Lokalize 23.04.3\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr "freekdekruijf@kde.nl"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "Geen verbinding of streaming op bemeterde verbinding toegestaan"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Ongeldig medium"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -50,27 +50,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Fout bij bijwerken van podcast"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr "Mediadownloadfout"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Bijwerken is niet toegestaan op bemeterde verbinding"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Ongeldig mediumbestand"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Niets gevonden"
#: error.cpp:58
@@ -80,27 +80,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Fout bij synchroniseren van feed en/of status van episode"
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "Geen verbinding of streaming niet toegestaan op bemeterde verbinding"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr "Voorbeeldspeler KMediaSession"
+msgid "Example KMediaSession Player"
+msgstr "Voorbeeld KMediaSession-speler"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "Bestand selecteren..."
+msgid "Select File…"
+msgstr "Bestand selecteren…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr "Mediabestand selecteren"
#: kmediasession/example-app/qml/main.qml:85
@@ -113,16 +113,14 @@
msgid "Open"
msgstr "Openen"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Afspelen"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pauzeren"
@@ -139,33 +137,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "titel: %1"
+msgid "Title: %1"
+msgstr "Titel: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "artiest: %1"
+msgid "Artist: %1"
+msgstr "Artiest: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "album: %1"
+msgid "Album: %1"
+msgstr "Album: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "medium-status: %1"
+msgid "Media status: %1"
+msgstr "Medium-status: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "Afspeel-status: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "fout: %1"
+msgid "Error: %1"
+msgstr "Fout: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -174,94 +172,168 @@
msgid "Playing Media"
msgstr "Medium wordt afgespeeld"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Podcastprogramma"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr "Voegt een niewe podcast toe aan inschrijvingen."
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr "Podcast-URL"
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/pa/kasts.po
^
|
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
"PO-Revision-Date: 2021-06-21 09:28-0700\n"
"Last-Translator: A S Alam <aalam@satluj.org>\n"
"Language-Team: Punjabi <punjabi-users@lists.sf.net>\n"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr "alam yellow @gmail.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr ""
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -48,28 +48,30 @@
msgstr "%1 ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
+#, fuzzy, kde-format
+#| msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "ਪੋਡਕਾਸਟ ਅੱਪਡੇਟ ਗਲਤੀ"
#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
+#, fuzzy, kde-format
+#| msgid "Media Download Error"
+msgid "Media download error"
msgstr "ਮੀਡੀਆ ਡਾਊਨਲੋਡ ਗਲਤੀ"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr ""
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr ""
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr ""
#: error.cpp:58
@@ -79,27 +81,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr ""
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
+msgid "Select File…"
msgstr ""
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr ""
#: kmediasession/example-app/qml/main.qml:85
@@ -113,16 +115,14 @@
msgid "Open"
msgstr "ਪੋਡਕਾਸਟ ਜੋੜੋ"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "ਚਲਾਓ"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "ਵਿਰਾਮ"
@@ -139,33 +139,34 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
+msgid "Title: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
+msgid "Artist: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
+msgid "Album: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:194
-#, kde-format
-msgid "playbackStatus: %1"
-msgstr ""
+#, fuzzy, kde-format
+#| msgid "Play Settings"
+msgid "Playback status: %1"
+msgstr "ਚਲਾਉਣ ਸੈਟਿੰਗਾਂ"
#: kmediasession/example-app/qml/main.qml:197
#, fuzzy, kde-format
#| msgid "Error (%1): %2"
-msgid "error: %1"
+msgid "Error: %1"
msgstr "ਗ਼ਲਤੀ (%1): %2"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -177,96 +178,173 @@
msgid "Playing Media"
msgstr "ਸੰਗੀਤ ਚੱਲ ਰਿਹਾ ਹੈ"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "ਪੋਡਕਾਸਟ ਐਪਲੀਕੇਸ਼ਨ"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr ""
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr "ਪੋਡਕਾਸਟ URL"
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr "ਕਾਸਟਸ"
-#: main.cpp:122
+#: main.cpp:123
#, kde-format
msgid "Podcast Player"
msgstr "ਪੋਡਕਾਸਟ ਪਲੇਅਰ"
-#: main.cpp:124
+#: main.cpp:125
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/pl/kasts.po
^
|
@@ -7,8 +7,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-04-29 11:06+0200\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-06-10 10:10+0200\n"
"Last-Translator: Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>\n"
"Language-Team: Polish <kde-i18n-doc@kde.org>\n"
"Language: pl\n"
@@ -29,17 +29,17 @@
msgid "Your emails"
msgstr "lukasz.wojnilowicz@gmail.com, ignacy.kajdan@gmail.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "Połączenie lub strumieniowanie na taryfowej sieci jest niedozwolone"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Nieprawidłowa treść"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "Pobieranie podkastów niedozwolone ze względu na ustawienia użytkownika"
@@ -50,28 +50,33 @@
msgstr "Pobieranie %1"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
+#, fuzzy, kde-format
+#| msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Błąd uaktualniania podkastu"
#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
+#, fuzzy, kde-format
+#| msgid "Media Download Error"
+msgid "Media download error"
msgstr "Błąd pobierania treści"
#: error.cpp:52
-#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Uaktualnienia niedozwolone w połączeniach taryfowych"
#: error.cpp:54
-#, kde-format
-msgid "Invalid Media File"
+#, fuzzy, kde-format
+#| msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Nieprawidłowy plik multimedialny"
#: error.cpp:56
-#, kde-format
-msgid "Nothing Found"
+#, fuzzy, kde-format
+#| msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Nic nie znaleziono"
#: error.cpp:58
@@ -80,28 +85,34 @@
msgstr "Błąd podczas zmiany położenia pamięci dyskowej"
#: error.cpp:60
-#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+#, fuzzy, kde-format
+#| msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Błąd synchronizacji kanału i/lub stanu odcinka"
#: error.cpp:62
-#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "Połączenie lub strumieniowanie na taryfowej sieci jest niedozwolone"
#: kmediasession/example-app/qml/main.qml:20
-#, kde-format
-msgid "Example player KMediaSession"
+#, fuzzy, kde-format
+#| msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr "Przykładowy odtwarzacz KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
-#, kde-format
-msgid "Select file..."
-msgstr "Wybierz plik..."
+#, fuzzy, kde-format
+#| msgctxt "@title:menu"
+#| msgid "Select Filter"
+msgid "Select File…"
+msgstr "Wybierz filtr"
#: kmediasession/example-app/qml/main.qml:78
-#, kde-format
-msgid "Select media file"
+#, fuzzy, kde-format
+#| msgid "Select media file"
+msgid "Select Media File"
msgstr "Wybierz plik multimedialny"
#: kmediasession/example-app/qml/main.qml:85
@@ -114,16 +125,14 @@
msgid "Open"
msgstr "Otwórz"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Odtwórz"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Wstrzymaj"
@@ -139,33 +148,39 @@
msgstr "Wycisz"
#: kmediasession/example-app/qml/main.qml:174
-#, kde-format
-msgid "title: %1"
+#, fuzzy, kde-format
+#| msgid "title: %1"
+msgid "Title: %1"
msgstr "tytuł: %1"
#: kmediasession/example-app/qml/main.qml:177
-#, kde-format
-msgid "artist: %1"
+#, fuzzy, kde-format
+#| msgid "artist: %1"
+msgid "Artist: %1"
msgstr "wykonawca: %1"
#: kmediasession/example-app/qml/main.qml:180
-#, kde-format
-msgid "album: %1"
+#, fuzzy, kde-format
+#| msgid "album: %1"
+msgid "Album: %1"
msgstr "album: %1"
#: kmediasession/example-app/qml/main.qml:191
-#, kde-format
-msgid "mediaStatus: %1"
+#, fuzzy, kde-format
+#| msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr "stan pliku: %1"
#: kmediasession/example-app/qml/main.qml:194
-#, kde-format
-msgid "playbackStatus: %1"
+#, fuzzy, kde-format
+#| msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "stan odtwarzania: %1"
#: kmediasession/example-app/qml/main.qml:197
-#, kde-format
-msgid "error: %1"
+#, fuzzy, kde-format
+#| msgid "error: %1"
+msgid "Error: %1"
msgstr "błąd: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -175,92 +190,181 @@
msgid "Playing Media"
msgstr "Odtwarzanie pliku"
-#: main.cpp:112
+#: main.cpp:113
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/pt/kasts.po
^
|
@@ -2,8 +2,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-03-06 16:25+0000\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-06-10 10:20+0100\n"
"Last-Translator: José Nuno Coelho Pires <zepires@gmail.com>\n"
"Language-Team: Portuguese <kde-i18n-pt@kde.org>\n"
"Language: pt\n"
@@ -17,7 +17,7 @@
"X-POFile-SpellExtra: org gpodder net GPodder Nextcloud nextcloud GPOdder\n"
"X-POFile-SpellExtra: peguntas pizzaria servior grandequantidade ocuprar\n"
"X-POFile-SpellExtra: subtitiuir afecnionamemto dac akltito aparce min esó\n"
-"X-POFile-SpellExtra: KMediaSession\n"
+"X-POFile-SpellExtra: KMediaSession Online\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -29,19 +29,19 @@
msgid "Your emails"
msgstr "zepires@gmail.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
"Não existe nenhuma ligação ou a transmissão em ligações móveis limitadas não "
"é permitida"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Conteúdo Inválido"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -54,28 +54,33 @@
msgstr "A obter o %1"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
+#, fuzzy, kde-format
+#| msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Erro de Actualização do 'Podcast'"
#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
+#, fuzzy, kde-format
+#| msgid "Media Download Error"
+msgid "Media download error"
msgstr "Erro de Transferência dos Conteúdos"
#: error.cpp:52
-#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "A Actualização Não é Permitida em Redes com 'Plafonds'"
#: error.cpp:54
-#, kde-format
-msgid "Invalid Media File"
+#, fuzzy, kde-format
+#| msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Ficheiro de Conteúdos Inválido"
#: error.cpp:56
-#, kde-format
-msgid "Nothing Found"
+#, fuzzy, kde-format
+#| msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Nada Encontrado"
#: error.cpp:58
@@ -84,28 +89,34 @@
msgstr "Erro ao mover o local de armazenamento"
#: error.cpp:60
-#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+#, fuzzy, kde-format
+#| msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Erro ao Sincronizar o Estado da Fonte e/ou Episódio"
#: error.cpp:62
-#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "Sem Ligação ou Transmissão Proibida em Redes Móveis Limitadas"
#: kmediasession/example-app/qml/main.qml:20
-#, kde-format
-msgid "Example player KMediaSession"
+#, fuzzy, kde-format
+#| msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr "Exemplo de KMediaSession do leitor"
#: kmediasession/example-app/qml/main.qml:72
-#, kde-format
-msgid "Select file..."
-msgstr "Seleccionar o ficheiro..."
+#, fuzzy, kde-format
+#| msgctxt "@title:menu"
+#| msgid "Select Filter"
+msgid "Select File…"
+msgstr "Seleccionar o Filtro"
#: kmediasession/example-app/qml/main.qml:78
-#, kde-format
-msgid "Select media file"
+#, fuzzy, kde-format
+#| msgid "Select media file"
+msgid "Select Media File"
msgstr "Seleccionar o ficheiro multimédia"
#: kmediasession/example-app/qml/main.qml:85
@@ -118,16 +129,14 @@
msgid "Open"
msgstr "Abrir"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Reproduzir"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pausa"
@@ -143,33 +152,39 @@
msgstr "Silenciar"
#: kmediasession/example-app/qml/main.qml:174
-#, kde-format
-msgid "title: %1"
+#, fuzzy, kde-format
+#| msgid "title: %1"
+msgid "Title: %1"
msgstr "título: %1"
#: kmediasession/example-app/qml/main.qml:177
-#, kde-format
-msgid "artist: %1"
+#, fuzzy, kde-format
+#| msgid "artist: %1"
+msgid "Artist: %1"
msgstr "artista: %1"
#: kmediasession/example-app/qml/main.qml:180
-#, kde-format
-msgid "album: %1"
+#, fuzzy, kde-format
+#| msgid "album: %1"
+msgid "Album: %1"
msgstr "álbum: %1"
#: kmediasession/example-app/qml/main.qml:191
-#, kde-format
-msgid "mediaStatus: %1"
+#, fuzzy, kde-format
+#| msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr "estado: %1"
#: kmediasession/example-app/qml/main.qml:194
-#, kde-format
-msgid "playbackStatus: %1"
+#, fuzzy, kde-format
+#| msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "estado de reprodução: %1"
#: kmediasession/example-app/qml/main.qml:197
-#, kde-format
-msgid "error: %1"
+#, fuzzy, kde-format
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/pt_BR/kasts.po
^
|
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
"PO-Revision-Date: 2021-06-04 15:07-0300\n"
"Last-Translator: Luiz Fernando Ranghetti <elchevive@opensuse.org>\n"
"Language-Team: Brazilian Portuguese <kde-i18n-pt_BR@kde.org>\n"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr ""
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr ""
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -48,28 +48,29 @@
msgstr "Baixando %1"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
-msgstr ""
+#, fuzzy, kde-format
+#| msgid "Podcast Player"
+msgid "Podcast update error"
+msgstr "Reprodutor de podcast"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr ""
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr ""
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr ""
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr ""
#: error.cpp:58
@@ -79,27 +80,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr ""
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
+msgid "Select File…"
msgstr ""
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr ""
#: kmediasession/example-app/qml/main.qml:85
@@ -113,16 +114,14 @@
msgid "Open"
msgstr "Adicionar podcast"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr ""
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr ""
@@ -139,33 +138,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
+msgid "Title: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
+msgid "Artist: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
+msgid "Album: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:197
#, fuzzy, kde-format
#| msgid "Error (%1): %2"
-msgid "error: %1"
+msgid "Error: %1"
msgstr "Erro (%1): %2"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -177,94 +176,170 @@
msgid "Playing Media"
msgstr "Reproduzindo música"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Aplicativo de podcast"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr ""
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr "URL do podcast"
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr "Kasts"
-#: main.cpp:122
+#: main.cpp:123
#, kde-format
msgid "Podcast Player"
msgstr "Reprodutor de podcast"
-#: main.cpp:124
+#: main.cpp:125
#, fuzzy, kde-format
#| msgid "© 2020-2021 KDE Community"
-msgid "© 2020-2023 KDE Community"
+msgid "© 2020–2023 KDE Community"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/sk/kasts.po
^
|
@@ -4,7 +4,7 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
"PO-Revision-Date: 2021-05-16 22:06+0200\n"
"Last-Translator: Roman Paholik <wizzardsk@gmail.com>\n"
"Language-Team: Slovak <kde-sk@linux.sk>\n"
@@ -26,17 +26,17 @@
msgid "Your emails"
msgstr "wizzardsk@gmail.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr ""
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -47,28 +47,29 @@
msgstr "Preberá sa %1"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
-msgstr ""
+#, fuzzy, kde-format
+#| msgid "Last updated: %1"
+msgid "Podcast update error"
+msgstr "Naposledy aktualizované: %1"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr ""
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr ""
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr ""
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr ""
#: error.cpp:58
@@ -78,27 +79,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr ""
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
+msgid "Select File…"
msgstr ""
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr ""
#: kmediasession/example-app/qml/main.qml:85
@@ -112,16 +113,14 @@
msgid "Open"
msgstr "Pridať Podcast"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Prehrať"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Pozastaviť"
@@ -138,33 +137,34 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
+msgid "Title: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
+msgid "Artist: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
+msgid "Album: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:194
-#, kde-format
-msgid "playbackStatus: %1"
-msgstr ""
+#, fuzzy, kde-format
+#| msgid "Settings"
+msgid "Playback status: %1"
+msgstr "Nastavenia"
#: kmediasession/example-app/qml/main.qml:197
#, fuzzy, kde-format
#| msgid "Error (%1): %2"
-msgid "error: %1"
+msgid "Error: %1"
msgstr "Chyba (%1): %2"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -176,98 +176,175 @@
msgid "Playing Media"
msgstr "Prehrávam hudbu"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr ""
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr ""
-#: main.cpp:115
+#: main.cpp:116
#, fuzzy, kde-format
#| msgid "Add Podcast"
msgid "Podcast URL"
msgstr "Pridať Podcast"
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr ""
-#: main.cpp:122
+#: main.cpp:123
#, kde-format
msgid "Podcast Player"
msgstr ""
-#: main.cpp:124
+#: main.cpp:125
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/sl/kasts.po
^
|
@@ -6,8 +6,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-02-28 09:02+0100\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-28 09:51+0200\n"
"Last-Translator: Matjaž Jeran <matjaz.jeran@amis.net>\n"
"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
"Language: sl\n"
@@ -16,7 +16,7 @@
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
"%100==4 ? 3 : 0);\n"
-"X-Generator: Lokalize 22.12.2\n"
+"X-Generator: Lokalize 23.04.3\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -28,17 +28,17 @@
msgid "Your emails"
msgstr "matjaz.jeran@amis.net,miles@filmsi.net"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "Ni povezave ali tokovni prenos na merjeni povezavi ni dovoljen"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Neveljavni medij"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "Nalaganje podcastov ni dovoljeno zaradi uporabnikovih nastavitev"
@@ -50,27 +50,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Napaka posodabljanja podcasta"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr "Napaka ob prenosu medija"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
-msgstr "Osveži ne dovoljeno pri merjeni povezavi"
+msgid "Update not allowed on metered connection"
+msgstr "Osveževanje ni dovoljeno pri merjeni povezavi"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Neveljavna medijska datoteka"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Ničesar najdenega"
#: error.cpp:58
@@ -80,27 +80,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
-msgstr "Napaka pri sinhronizaciji vira in/ali stanju epizode"
+msgid "Error syncing feed and/or episode status"
+msgstr "Napaka pri sinhronizaciji vira in/ali stanja epizode"
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "Ni povezave ali tokovni prenos na merjeni povezavi ni dovoljen"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr "Na primer predvajalnik KMediaSession"
+msgid "Example KMediaSession Player"
+msgstr "Primer predvajalnik KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "Izberi datoteko..."
+msgid "Select File…"
+msgstr "Izberi datoteko…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr "Izberi večpredstavnostno datoteko"
#: kmediasession/example-app/qml/main.qml:85
@@ -113,16 +113,14 @@
msgid "Open"
msgstr "Odpri"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Predvajaj"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Premor"
@@ -139,33 +137,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "naslov: %1"
+msgid "Title: %1"
+msgstr "Naslov: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "umetnik: %1"
+msgid "Artist: %1"
+msgstr "Umetnik: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "album: %1"
+msgid "Album: %1"
+msgstr "Album: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "stanje medija: %1"
+msgid "Media status: %1"
+msgstr "Stanje medija: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
-msgstr "stanje playbacka: %1"
+msgid "Playback status: %1"
+msgstr "Stanje playbacka: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "napaka: %1"
+msgid "Error: %1"
+msgstr "Napaka: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -174,94 +172,168 @@
msgid "Playing Media"
msgstr "Predvajanje medija"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Aplikacija za podcaste"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr "Doda nov podcast v naročila."
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr "Spletni naslov podcasta"
-#: main.cpp:120
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/sv/kasts.po
^
|
@@ -1,10 +1,10 @@
-# Stefan Asserhäll <stefan.asserhall@bredband.net>, 2021, 2022.
+# Stefan Asserhäll <stefan.asserhall@bredband.net>, 2021, 2022, 2023.
msgid ""
msgstr ""
"Project-Id-Version: desktop files\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2022-09-25 10:01+0200\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-28 10:05+0200\n"
"Last-Translator: Stefan Asserhäll <stefan.asserhall@bredband.net>\n"
"Language-Team: Swedish <kde-i18n-doc@kde.org>\n"
"Language: sv\n"
@@ -24,17 +24,17 @@
msgid "Your emails"
msgstr "stefan.asserhall@bredband.net"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
-msgstr ""
+msgstr "Ingen anslutning eller ström är inte tillåten för uppmätt anslutning"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Ogiltigt media"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -48,27 +48,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Uppdateringsfel för poddradioprogram"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr "Fel vid nerladdning av media"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Uppdatering tillåts inte för uppmätt anslutning"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Ogiltig mediafil"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Ingenting hittades"
#: error.cpp:58
@@ -78,53 +78,47 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Fel vid synkronisering av kanal och/eller avsnittsstatus"
#: error.cpp:62
-#, fuzzy, kde-format
-#| msgid "Update Not Allowed on Metered Connection"
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
-msgstr "Uppdatering tillåts inte för uppmätt anslutning"
+#, kde-format
+msgid "Connection or streaming not allowed on metered connection"
+msgstr "Anslutning eller strömmar tillåts inte för uppmätt anslutning"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr ""
+msgid "Example KMediaSession Player"
+msgstr "Exempel KMediaSession-spelare"
#: kmediasession/example-app/qml/main.qml:72
-#, fuzzy, kde-format
-#| msgid "Select folder..."
-msgid "Select file..."
-msgstr "Välj katalog..."
+#, kde-format
+msgid "Select File…"
+msgstr "Välj fil…"
#: kmediasession/example-app/qml/main.qml:78
-#, fuzzy, kde-format
-#| msgid "Select Filter"
-msgid "Select media file"
-msgstr "Välj filter"
+#, kde-format
+msgid "Select Media File"
+msgstr "Välj mediefil"
#: kmediasession/example-app/qml/main.qml:85
#, kde-format
msgid "OR"
-msgstr ""
+msgstr "ELLER"
#: kmediasession/example-app/qml/main.qml:93
-#, fuzzy, kde-format
-#| msgid "Open Podcast"
+#, kde-format
msgid "Open"
-msgstr "Öppna poddradioprogram"
+msgstr "Öppna"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Spela"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Paus"
@@ -137,145 +131,206 @@
#: kmediasession/example-app/qml/main.qml:147
#, kde-format
msgid "Mute"
-msgstr ""
+msgstr "Tysta"
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr ""
+msgid "Title: %1"
+msgstr "Titel: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr ""
+msgid "Artist: %1"
+msgstr "Artist: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr ""
+msgid "Album: %1"
+msgstr "Album: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr ""
+msgid "Media status: %1"
+msgstr "Mediestatus: %1"
#: kmediasession/example-app/qml/main.qml:194
-#, fuzzy, kde-format
-#| msgid "Playback Rate: "
-msgid "playbackStatus: %1"
-msgstr "Uppspelningshastighet:"
+#, kde-format
+msgid "Playback status: %1"
+msgstr "Uppspelningsstatus: %1"
#: kmediasession/example-app/qml/main.qml:197
-#, fuzzy, kde-format
-#| msgid "Error (%1): %2"
-msgid "error: %1"
-msgstr "Fel (%1): %2"
+#, kde-format
+msgid "Error: %1"
+msgstr "Fel: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
-#, fuzzy, kde-format
-#| msgctxt "Explanation for sleep inhibit during play of music"
-#| msgid "Playing Music"
+#, kde-format
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/tr/kasts.po
^
|
@@ -6,8 +6,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-05-22 14:02+0300\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-08-15 02:20+0300\n"
"Last-Translator: Emir SARI <emir_sari@icloud.com>\n"
"Language-Team: Turkish <kde-l10n-tr@kde.org>\n"
"Language: tr\n"
@@ -15,7 +15,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.03.70\n"
+"X-Generator: Lokalize 23.11.70\n"
#, kde-format
msgctxt "NAME OF TRANSLATORS"
@@ -27,17 +27,17 @@
msgid "Your emails"
msgstr "emir_sari@icloud.com"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr "Kısıtlı bağlantılarda bir bağlantıya veya akışa izin verilmiyor"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Geçersiz Ortam"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "Kullanıcı ayarlarından dolayı pod yayını indirmelerine izin verilmiyor"
@@ -45,32 +45,37 @@
#: enclosuredownloadjob.cpp:33
#, kde-format
msgid "Downloading %1"
-msgstr "%1 indiriliyor"
+msgstr "İndiriliyor: %1"
#: error.cpp:48
-#, kde-format
-msgid "Podcast Update Error"
+#, fuzzy, kde-format
+#| msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Pod Yayını Güncelleme Hatası"
#: error.cpp:50
-#, kde-format
-msgid "Media Download Error"
+#, fuzzy, kde-format
+#| msgid "Media Download Error"
+msgid "Media download error"
msgstr "Ortam İndirme Hatası"
#: error.cpp:52
-#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "Kısıtlı Bağlantıda Güncellemeye İzin Verilmiyor"
#: error.cpp:54
-#, kde-format
-msgid "Invalid Media File"
+#, fuzzy, kde-format
+#| msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Geçersiz Ortam Dosyası"
#: error.cpp:56
-#, kde-format
-msgid "Nothing Found"
-msgstr "Bir Şey Bulunmadı"
+#, fuzzy, kde-format
+#| msgid "Nothing Found"
+msgid "Nothing found"
+msgstr "Bir şey bulunamadı"
#: error.cpp:58
#, kde-format
@@ -78,29 +83,31 @@
msgstr "Depolama yolu taşınırken hata"
#: error.cpp:60
-#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+#, fuzzy, kde-format
+#| msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Bölüm Durumu ve/veya Besleme Eşzamanlanırken Hata"
#: error.cpp:62
-#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+#, fuzzy, kde-format
+#| msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr "Kısıtlı Bağlantıda Bağlantıya veya Akışa İzin Verilmiyor"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
-msgstr "Örnek oynatıcı KMediaSession"
+msgid "Example KMediaSession Player"
+msgstr "Örnek KMediaSession Çaları"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "Dosya seç..."
+msgid "Select File…"
+msgstr "Dosya Seç…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
-msgstr "Ortam dosyası seç"
+msgid "Select Media File"
+msgstr "Ortam Dosyası Seç"
#: kmediasession/example-app/qml/main.qml:85
#, kde-format
@@ -112,16 +119,14 @@
msgid "Open"
msgstr "Aç"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Çal"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Duraklat"
@@ -138,33 +143,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "başlık: %1"
+msgid "Title: %1"
+msgstr "Başlık: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "sanatçı: %1"
+msgid "Artist: %1"
+msgstr "Sanatçı: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "albüm: %1"
+msgid "Album: %1"
+msgstr "Albüm: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
-msgstr "ortamDurumu: %1"
+msgid "Media status: %1"
+msgstr "Ortam durumu: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
-msgstr "çalmaDurumu: %1"
+msgid "Playback status: %1"
+msgstr "Çalma durumu: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "hata: %1"
+msgid "Error: %1"
+msgstr "Hata: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -173,93 +178,167 @@
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/uk/kasts.po
^
|
@@ -6,8 +6,8 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-02-28 08:47+0200\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-07-28 16:20+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
"Language: uk\n"
@@ -28,19 +28,19 @@
msgid "Your emails"
msgstr "yurchor@ukr.net"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
"Немає з'єднання або потокове передавання даних на з'єднанні з обліком "
"передавання даних заборонено"
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "Некоректне мультимедіа"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "Отримання трансляцій заборонено через налаштування користувача"
@@ -52,27 +52,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr "Помилка під час спроби оновлення трансляцій"
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr "Помилка під час отримання мультимедійних даних"
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr "При з'єднанні з обліком даних оновлення заборонено"
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr "Некоректний мультимедійний файл"
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr "Нічого не знайдено"
#: error.cpp:58
@@ -82,29 +82,29 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr "Помилка під час спроби синхронізувати стан подачі і/або епізоду"
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
-"Немає з'єднання або потокове передавання даних на з'єднанні з обліком "
-"передавання даних заборонено"
+"З'єднання або потокове передавання даних на з'єднанні з обліком передавання "
+"даних заборонено"
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr "Приклад програвача KMediaSession"
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
-msgstr "Вибір файла…"
+msgid "Select File…"
+msgstr "Вибрати файл…"
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr "Виберіть файл мультимедійних даних"
#: kmediasession/example-app/qml/main.qml:85
@@ -117,16 +117,14 @@
msgid "Open"
msgstr "Відкрити"
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "Відтворити"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "Призупинити"
@@ -143,33 +141,33 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
-msgstr "назва: %1"
+msgid "Title: %1"
+msgstr "Назва: %1"
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
-msgstr "виконавець: %1"
+msgid "Artist: %1"
+msgstr "Виконавець: %1"
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
-msgstr "альбом: %1"
+msgid "Album: %1"
+msgstr "Альбом: %1"
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr "Стан даних: %1"
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr "Стан відтворення: %1"
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
-msgstr "помилка: %1"
+msgid "Error: %1"
+msgstr "Помилка: %1"
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
#: kmediasession/powermanagement/powermanagementinterface.cpp:214
@@ -178,94 +176,168 @@
msgid "Playing Media"
msgstr "Відтворюємо музику"
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "Програма для трансляцій"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr "Додає новий трансляцію до підписок."
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr "Адреса трансляції"
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr "Kasts"
-#: main.cpp:122
+#: main.cpp:123
#, kde-format
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/zh_CN/kasts.po
^
|
@@ -2,8 +2,8 @@
msgstr ""
"Project-Id-Version: kdeorg\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
-"PO-Revision-Date: 2023-05-22 14:04\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
+"PO-Revision-Date: 2023-08-02 12:45\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -29,17 +29,17 @@
"kde-china@kde.org, tysontan@tysontan.com, wordless@echo.moe, "
"staronthedky@kde.org"
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr "媒体无效"
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr "按照用户设置的条件,不允许下载播客"
@@ -51,28 +51,28 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
-msgstr "播客更新出错"
+msgid "Podcast update error"
+msgstr ""
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
-msgstr "媒体下载出错"
+msgid "Media download error"
+msgstr ""
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
-msgstr "使用计费连接时不允许更新"
+msgid "Update not allowed on metered connection"
+msgstr ""
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
-msgstr "媒体文件无效"
+msgid "Invalid media file"
+msgstr ""
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
-msgstr "未找到任何内容"
+msgid "Nothing found"
+msgstr ""
#: error.cpp:58
#, kde-format
@@ -81,27 +81,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
-msgstr "同步订阅源和/或单集状态时出错"
+msgid "Error syncing feed and/or episode status"
+msgstr ""
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr ""
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
+msgid "Select File…"
msgstr ""
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr ""
#: kmediasession/example-app/qml/main.qml:85
@@ -114,16 +114,14 @@
msgid "Open"
msgstr ""
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr "播放"
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr "暂停"
@@ -140,32 +138,32 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
+msgid "Title: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
+msgid "Artist: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
+msgid "Album: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
+msgid "Error: %1"
msgstr ""
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -175,92 +173,166 @@
msgid "Playing Media"
msgstr ""
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr "播客应用程序"
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr "添加新播客到订阅列表。"
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr "播客 URL"
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr "Kasts"
-#: main.cpp:122
+#: main.cpp:123
#, kde-format
msgid "Podcast Player"
msgstr "播客播放器"
-#: main.cpp:124
+#: main.cpp:125
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/po/zh_TW/kasts.po
^
|
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: kasts\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
-"POT-Creation-Date: 2023-05-26 02:25+0000\n"
+"POT-Creation-Date: 2023-07-28 02:34+0000\n"
"PO-Revision-Date: 2022-06-13 01:10+0000\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -28,17 +28,17 @@
msgid "Your emails"
msgstr ""
-#: audiomanager.cpp:404
+#: audiomanager.cpp:402
#, kde-format
msgid "No connection or streaming on metered connection not allowed"
msgstr ""
-#: audiomanager.cpp:545
+#: audiomanager.cpp:541
#, kde-format
msgid "Invalid Media"
msgstr ""
-#: enclosure.cpp:164
+#: enclosure.cpp:163
#, kde-format
msgid "Podcast downloads not allowed due to user setting"
msgstr ""
@@ -50,27 +50,27 @@
#: error.cpp:48
#, kde-format
-msgid "Podcast Update Error"
+msgid "Podcast update error"
msgstr ""
#: error.cpp:50
#, kde-format
-msgid "Media Download Error"
+msgid "Media download error"
msgstr ""
#: error.cpp:52
#, kde-format
-msgid "Update Not Allowed on Metered Connection"
+msgid "Update not allowed on metered connection"
msgstr ""
#: error.cpp:54
#, kde-format
-msgid "Invalid Media File"
+msgid "Invalid media file"
msgstr ""
#: error.cpp:56
#, kde-format
-msgid "Nothing Found"
+msgid "Nothing found"
msgstr ""
#: error.cpp:58
@@ -80,27 +80,27 @@
#: error.cpp:60
#, kde-format
-msgid "Error Syncing Feed and/or Episode Status"
+msgid "Error syncing feed and/or episode status"
msgstr ""
#: error.cpp:62
#, kde-format
-msgid "No Connection or Streaming Not Allowed on Metered Connection"
+msgid "Connection or streaming not allowed on metered connection"
msgstr ""
#: kmediasession/example-app/qml/main.qml:20
#, kde-format
-msgid "Example player KMediaSession"
+msgid "Example KMediaSession Player"
msgstr ""
#: kmediasession/example-app/qml/main.qml:72
#, kde-format
-msgid "Select file..."
+msgid "Select File…"
msgstr ""
#: kmediasession/example-app/qml/main.qml:78
#, kde-format
-msgid "Select media file"
+msgid "Select Media File"
msgstr ""
#: kmediasession/example-app/qml/main.qml:85
@@ -113,16 +113,14 @@
msgid "Open"
msgstr ""
-#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:40
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:153
-#: qml/GenericEntryDelegate.qml:325
+#: kmediasession/example-app/qml/main.qml:101 qml/ChapterListDelegate.qml:38
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:329
#, kde-format
msgid "Play"
msgstr ""
#: kmediasession/example-app/qml/main.qml:109
-#: qml/Desktop/DesktopPlayerControls.qml:129 qml/EntryPage.qml:145
-#: qml/GenericEntryDelegate.qml:346
+#: qml/Desktop/DesktopPlayerControls.qml:129 qml/GenericEntryDelegate.qml:350
#, kde-format
msgid "Pause"
msgstr ""
@@ -139,32 +137,32 @@
#: kmediasession/example-app/qml/main.qml:174
#, kde-format
-msgid "title: %1"
+msgid "Title: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:177
#, kde-format
-msgid "artist: %1"
+msgid "Artist: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:180
#, kde-format
-msgid "album: %1"
+msgid "Album: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:191
#, kde-format
-msgid "mediaStatus: %1"
+msgid "Media status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:194
#, kde-format
-msgid "playbackStatus: %1"
+msgid "Playback status: %1"
msgstr ""
#: kmediasession/example-app/qml/main.qml:197
#, kde-format
-msgid "error: %1"
+msgid "Error: %1"
msgstr ""
#: kmediasession/powermanagement/powermanagementinterface.cpp:188
@@ -174,92 +172,166 @@
msgid "Playing Media"
msgstr ""
-#: main.cpp:112
+#: main.cpp:113
#, kde-format
msgid "Podcast Application"
msgstr ""
-#: main.cpp:114
+#: main.cpp:115
#, kde-format
msgid "Adds a new podcast to subscriptions."
msgstr ""
-#: main.cpp:115
+#: main.cpp:116
#, kde-format
msgid "Podcast URL"
msgstr ""
-#: main.cpp:120
+#: main.cpp:121 qml/main.qml:20
#, kde-format
msgid "Kasts"
msgstr ""
-#: main.cpp:122
+#: main.cpp:123
#, kde-format
msgid "Podcast Player"
msgstr ""
-#: main.cpp:124
+#: main.cpp:125
#, kde-format
-msgid "© 2020-2023 KDE Community"
+msgid "© 2020–2023 KDE Community"
msgstr ""
-#: main.cpp:125
+#: main.cpp:126
#, kde-format
msgid "Tobias Fella"
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/CMakeLists.txt
^
|
@@ -3,7 +3,9 @@
# SPDX-License-Identifier: BSD-2-Clause
add_subdirectory(kmediasession)
+if (NOT QT_MAJOR_VERSION EQUAL "6")
add_subdirectory(solidextras)
+endif()
set(kasts_srcs
main.cpp
@@ -23,6 +25,7 @@
updatefeedjob.cpp
fetchfeedsjob.cpp
systrayicon.cpp
+ networkconnectionmanager.cpp
models/abstractepisodemodel.cpp
models/abstractepisodeproxymodel.cpp
models/chaptermodel.cpp
@@ -131,6 +134,13 @@
DEFAULT_SEVERITY Info
)
+ecm_qt_declare_logging_category(kasts_srcs
+ HEADER "networkconnectionmanagerlogging.h"
+ IDENTIFIER "kastsNetworkConnectionManager"
+ CATEGORY_NAME "org.kde.kasts.networkconnectionmanager"
+ DEFAULT_SEVERITY Info
+)
+
if(ANDROID)
list(APPEND kasts_srcs
androidlogging.h)
@@ -161,7 +171,13 @@
kconfig_add_kcfg_files(kasts settingsmanager.kcfgc GENERATE_MOC)
target_include_directories(kasts PRIVATE ${CMAKE_BINARY_DIR})
-target_link_libraries(kasts PRIVATE Qt::Core Qt::Qml Qt::Quick Qt::QuickControls2 Qt::Sql Qt::Svg Qt::Xml KF${KF_MAJOR_VERSION}::Kirigami2 KF${KF_MAJOR_VERSION}::Syndication KF${KF_MAJOR_VERSION}::CoreAddons KF${KF_MAJOR_VERSION}::ConfigGui KF${KF_MAJOR_VERSION}::I18n Taglib::Taglib KastsSolidExtras ${QTKEYCHAIN_LIBRARIES} KF${KF_MAJOR_VERSION}::ThreadWeaver KMediaSession)
+target_link_libraries(kasts PRIVATE Qt::Core Qt::Qml Qt::Quick Qt::QuickControls2 Qt::Sql Qt::Svg Qt::Xml KF${KF_MAJOR_VERSION}::Kirigami2 KF${KF_MAJOR_VERSION}::Syndication KF${KF_MAJOR_VERSION}::CoreAddons KF${KF_MAJOR_VERSION}::ConfigGui KF${KF_MAJOR_VERSION}::I18n Taglib::Taglib ${QTKEYCHAIN_LIBRARIES} KF${KF_MAJOR_VERSION}::ThreadWeaver KMediaSession)
+
+if (QT_MAJOR_VERSION EQUAL "6")
+target_link_libraries(kasts PRIVATE Qt6::Network)
+else ()
+target_link_libraries(kasts PRIVATE KastsSolidExtras)
+endif()
if(KASTS_FLATPAK)
target_compile_definitions(kasts PUBLIC KASTS_FLATPAK)
@@ -200,6 +216,7 @@
document-import
document-export
document-open-folder
+ document-save
edit-delete-remove
edit-clear-all
edit-select-all
@@ -238,7 +255,19 @@
player-volume-muted
player-volume
application-exit
+ starred-symbolic
+ non-starred-symbolic
media-playback-cloud
+ zoom-in
+ zoom-out
+ object-rotate-left
+ object-rotate-right
+ add-subtitle
+ view-sort
+ view-sort-descending
+ view-sort-ascending
+ view-sort-descending-name
+ view-sort-ascending-name
)
else()
target_link_libraries(kasts PRIVATE Qt::Widgets)
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/audiomanager.cpp
^
|
@@ -19,15 +19,12 @@
#include "feed.h"
#include "fetcher.h"
#include "models/errorlogmodel.h"
+#include "networkconnectionmanager.h"
#include "settingsmanager.h"
-#include <solidextras/networkstatus.h>
-
class AudioManagerPrivate
{
private:
- SolidExtras::NetworkStatus m_networkStatus;
-
KMediaSession m_player = KMediaSession(QStringLiteral("kasts"), QStringLiteral("org.kde.kasts"));
Entry *m_entry = nullptr;
@@ -277,12 +274,11 @@
d->m_entry = nullptr;
// Check if the previous track needs to be marked as read
- // TODO: make grace time a setting in SettingsManager
if (oldEntry && !signalDisconnect) {
qCDebug(kastsAudio) << "Checking previous track";
qCDebug(kastsAudio) << "Left time" << (duration() - position());
qCDebug(kastsAudio) << "MediaStatus" << d->m_player.mediaStatus();
- if (((duration() > 0) && (position() > 0) && ((duration() - position()) < SKIP_TRACK_END))
+ if (((duration() > 0) && (position() > 0) && ((duration() - position()) < SettingsManager::self()->markAsPlayedBeforeEnd() * 1000))
|| (d->m_player.mediaStatus() == KMediaSession::EndOfMedia)) {
qCDebug(kastsAudio) << "Mark as read:" << oldEntry->title();
oldEntry->enclosure()->setPlayPosition(0);
@@ -298,9 +294,7 @@
// do some checks on the new entry to see whether it's valid and not corrupted
if (entry != nullptr && entry->hasEnclosure() && entry->enclosure()
- && (entry->enclosure()->status() == Enclosure::Downloaded
- || (d->m_networkStatus.connectivity() != SolidExtras::NetworkStatus::No
- && (d->m_networkStatus.metered() != SolidExtras::NetworkStatus::Yes || SettingsManager::self()->allowMeteredStreaming())))) {
+ && (entry->enclosure()->status() == Enclosure::Downloaded || NetworkConnectionManager::instance().streamingAllowed())) {
qCDebug(kastsAudio) << "Going to change source";
setEntryInfo(entry);
@@ -394,12 +388,16 @@
// if we're streaming, check that we're still connected and check for metered
// connection
if (isStreaming()) {
- if (d->m_networkStatus.connectivity() == SolidExtras::NetworkStatus::No
- || (d->m_networkStatus.metered() != SolidExtras::NetworkStatus::No && !SettingsManager::self()->allowMeteredStreaming())) {
+ if (!NetworkConnectionManager::instance().streamingAllowed()) {
qCDebug(kastsAudio) << "Refusing to play: no connection or streaming on metered connection not allowed";
+ QString feedUrl, entryId;
+ if (d->m_entry) {
+ feedUrl = d->m_entry->feed()->url();
+ entryId = d->m_entry->id();
+ }
Q_EMIT logError(Error::Type::MeteredStreamingNotAllowed,
- d->m_entry->feed()->url(),
- d->m_entry->id(),
+ feedUrl,
+ entryId,
0,
i18n("No connection or streaming on metered connection not allowed"),
QString());
@@ -474,13 +472,13 @@
void AudioManager::skipForward()
{
qCDebug(kastsAudio) << "AudioManager::skipForward";
- seek(std::min((position() + SKIP_STEP), duration()));
+ seek(std::min((position() + (1000 * SettingsManager::skipForward())), duration()));
}
void AudioManager::skipBackward()
{
qCDebug(kastsAudio) << "AudioManager::skipBackward";
- seek(std::max((qint64)0, (position() - SKIP_STEP)));
+ seek(std::max((qint64)0, (position() - (1000 * SettingsManager::skipBackward()))));
}
bool AudioManager::canGoNext() const
@@ -491,14 +489,12 @@
// check if there is a next track
if (index < DataManager::instance().queue().count() - 1) {
Entry *next_entry = DataManager::instance().getEntry(DataManager::instance().queue()[index + 1]);
- if (next_entry->enclosure()) {
+ if (next_entry && next_entry->enclosure()) {
qCDebug(kastsAudio) << "Enclosure status" << next_entry->enclosure()->path() << next_entry->enclosure()->status();
if (next_entry->enclosure()->status() == Enclosure::Downloaded) {
return true;
} else {
- SolidExtras::NetworkStatus networkStatus;
- if (networkStatus.connectivity() == SolidExtras::NetworkStatus::Yes
- && (networkStatus.metered() == SolidExtras::NetworkStatus::No || SettingsManager::self()->allowMeteredStreaming())) {
+ if (NetworkConnectionManager::instance().streamingAllowed()) {
return true;
}
}
@@ -552,9 +548,12 @@
qCDebug(kastsAudio) << "AudioManager::playerDurationChanged" << duration;
// Check if duration mentioned in enclosure corresponds to real duration
- if (duration > 0 && (duration / 1000) != d->m_entry->enclosure()->duration()) {
- qCDebug(kastsAudio) << "Correcting duration of" << d->m_entry->id() << "to" << duration / 1000 << "(was" << d->m_entry->enclosure()->duration() << ")";
- d->m_entry->enclosure()->setDuration(duration / 1000);
+ if (d->m_entry && d->m_entry->enclosure()) {
+ if (duration > 0 && (duration / 1000) != d->m_entry->enclosure()->duration()) {
+ qCDebug(kastsAudio) << "Correcting duration of" << d->m_entry->id() << "to" << duration / 1000 << "(was" << d->m_entry->enclosure()->duration()
+ << ")";
+ d->m_entry->enclosure()->setDuration(duration / 1000);
+ }
}
qint64 correctedDuration = duration;
@@ -589,7 +588,7 @@
checkForPendingSeek();
if (!d->m_lockPositionSaving) {
- if (d->m_entry) {
+ if (d->m_entry && d->m_entry->enclosure()) {
if (d->m_entry->enclosure()) {
d->m_entry->enclosure()->setPlayPosition(position());
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/audiomanager.h
^
|
@@ -51,9 +51,6 @@
Q_PROPERTY(bool isStreaming READ isStreaming NOTIFY isStreamingChanged)
public:
- const qint64 SKIP_STEP = 10000;
- const qint64 SKIP_TRACK_END = 15000;
-
static AudioManager &instance()
{
static AudioManager _instance;
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/database.cpp
^
|
@@ -7,14 +7,20 @@
#include "database.h"
+#include <QCryptographicHash>
#include <QDateTime>
#include <QDebug>
#include <QDir>
+#include <QFile>
+#include <QFileInfo>
+#include <QRegularExpression>
#include <QSqlDatabase>
#include <QSqlError>
#include <QStandardPaths>
#include <QUrl>
+#include "settingsmanager.h"
+
#define TRUE_OR_RETURN(x) \
if (!x) \
return false;
@@ -62,6 +68,10 @@
TRUE_OR_RETURN(migrateTo5());
if (dbversion < 6)
TRUE_OR_RETURN(migrateTo6());
+ if (dbversion < 7)
+ TRUE_OR_RETURN(migrateTo7());
+ if (dbversion < 8)
+ TRUE_OR_RETURN(migrateTo8());
return true;
}
@@ -150,6 +160,96 @@
TRUE_OR_RETURN(commit());
return true;
}
+
+bool Database::migrateTo7()
+{
+ qDebug() << "Migrating database to version 7";
+ TRUE_OR_RETURN(transaction());
+ TRUE_OR_RETURN(execute(QStringLiteral("ALTER TABLE Entries ADD COLUMN favorite BOOL DEFAULT 0;")));
+ TRUE_OR_RETURN(execute(QStringLiteral("PRAGMA user_version = 7;")));
+ TRUE_OR_RETURN(commit());
+ return true;
+}
+
+bool Database::migrateTo8()
+{
+ qDebug() << "Migrating database to version 8; this can take a while";
+
+ const int maxFilenameLength = 200;
+ QString enclosurePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
+ if (!SettingsManager::self()->storagePath().isEmpty()) {
+ enclosurePath = SettingsManager::self()->storagePath().toLocalFile();
+ }
+ enclosurePath += QStringLiteral("/enclosures/");
+
+ TRUE_OR_RETURN(transaction());
+ TRUE_OR_RETURN(execute(QStringLiteral("ALTER TABLE Feeds ADD COLUMN dirname TEXT;")));
+
+ QStringList dirNameList;
+ QSqlQuery query(QStringLiteral("SELECT url, name FROM Feeds;"));
+ while (query.next()) {
+ QString url = query.value(QStringLiteral("url")).toString();
+ QString name = query.value(QStringLiteral("name")).toString();
+
+ // Generate directory name for enclosures based on feed name
+ QString dirBaseName = name.remove(QRegularExpression(QStringLiteral("[^a-zA-Z0-9 ._()-]"))).simplified().left(maxFilenameLength);
+ dirBaseName = dirBaseName.isEmpty() ? QStringLiteral("Noname") : dirBaseName;
+ QString dirName = dirBaseName;
+
+ // Check for duplicate names
+ int numDups = 1; // Minimum to append is " (1)" if file already exists
+ while (dirNameList.contains(dirName)) {
+ dirName = QStringLiteral("%1 (%2)").arg(dirBaseName, QString::number(numDups));
+ numDups++;
+ }
+
+ dirNameList << dirName;
+
+ QSqlQuery writeQuery;
+ writeQuery.prepare(QStringLiteral("UPDATE Feeds SET dirname=:dirname WHERE url=:url;"));
+ writeQuery.bindValue(QStringLiteral(":dirname"), dirName);
+ writeQuery.bindValue(QStringLiteral(":url"), url);
+ TRUE_OR_RETURN(execute(writeQuery));
+ }
+
+ // Rename enclosures to new filename convention
+ query.prepare(
+ QStringLiteral("SELECT entry.title, enclosure.id, enclosure.url, feed.dirname FROM Enclosures enclosure JOIN Entries entry ON enclosure.id = entry.id "
+ "JOIN Feeds feed ON enclosure.feed = feed.url;"));
+ TRUE_OR_RETURN(execute(query));
+ while (query.next()) {
+ QString queryTitle = query.value(QStringLiteral("title")).toString();
+ QString queryId = query.value(QStringLiteral("id")).toString();
+ QString queryUrl = query.value(QStringLiteral("url")).toString();
+ QString feedDirName = query.value(QStringLiteral("dirname")).toString();
+
+ // Rename any existing files with the new filename generated above
+ QString legacyPath = enclosurePath + QString::fromStdString(QCryptographicHash::hash(queryUrl.toUtf8(), QCryptographicHash::Md5).toHex().toStdString());
+
+ if (QFileInfo::exists(legacyPath) && QFileInfo(legacyPath).isFile()) {
+ // Generate filename based on episode name and url hash with feedname as subdirectory
+ QString enclosureFilenameBase = queryTitle.remove(QRegularExpression(QStringLiteral("[^a-zA-Z0-9 ._()-]"))).simplified().left(maxFilenameLength);
+ enclosureFilenameBase = enclosureFilenameBase.isEmpty() ? QStringLiteral("Noname") : enclosureFilenameBase;
+ enclosureFilenameBase += QStringLiteral(".")
+ + QString::fromStdString(QCryptographicHash::hash(queryUrl.toUtf8(), QCryptographicHash::Md5).toHex().toStdString()).left(6);
+
+ QString enclosureFilenameExt = QFileInfo(QUrl::fromUserInput(queryUrl).fileName()).suffix();
+
+ QString enclosureFilename =
+ !enclosureFilenameExt.isEmpty() ? enclosureFilenameBase + QStringLiteral(".") + enclosureFilenameExt : enclosureFilenameBase;
+
+ QString newDirPath = enclosurePath + feedDirName + QStringLiteral("/");
+ QString newFilePath = newDirPath + enclosureFilename;
+
+ QFileInfo().absoluteDir().mkpath(newDirPath);
+ QFile::rename(legacyPath, newFilePath);
+ }
+ }
+
+ TRUE_OR_RETURN(execute(QStringLiteral("PRAGMA user_version = 8;")));
+ TRUE_OR_RETURN(commit());
+ return true;
+}
bool Database::execute(const QString &query, const QString &connectionName)
{
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/database.h
^
|
@@ -42,6 +42,8 @@
bool migrateTo4();
bool migrateTo5();
bool migrateTo6();
+ bool migrateTo7();
+ bool migrateTo8();
void cleanup();
void setWalMode();
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/datamanager.cpp
^
|
@@ -27,28 +27,34 @@
DataManager::DataManager()
{
- connect(
- &Fetcher::instance(),
- &Fetcher::feedDetailsUpdated,
- this,
- [this](const QString &url, const QString &name, const QString &image, const QString &link, const QString &description, const QDateTime &lastUpdated) {
- qCDebug(kastsDataManager) << "Start updating feed details for" << url;
- Feed *feed = getFeed(url);
- if (feed != nullptr) {
- feed->setName(name);
- feed->setImage(image);
- feed->setLink(link);
- feed->setDescription(description);
- feed->setLastUpdated(lastUpdated);
- qCDebug(kastsDataManager) << "Retrieving authors";
- feed->updateAuthors();
- // For feeds that have just been added, this is probably the point
- // where the Feed object gets created; let's set refreshing to
- // true in order to show user feedback that the feed is still
- // being fetched
- feed->setRefreshing(true);
- }
- });
+ connect(&Fetcher::instance(),
+ &Fetcher::feedDetailsUpdated,
+ this,
+ [this](const QString &url,
+ const QString &name,
+ const QString &image,
+ const QString &link,
+ const QString &description,
+ const QDateTime &lastUpdated,
+ const QString &dirname) {
+ qCDebug(kastsDataManager) << "Start updating feed details for" << url;
+ Feed *feed = getFeed(url);
+ if (feed != nullptr) {
+ feed->setName(name);
+ feed->setImage(image);
+ feed->setLink(link);
+ feed->setDescription(description);
+ feed->setLastUpdated(lastUpdated);
+ feed->setDirname(dirname);
+ qCDebug(kastsDataManager) << "Retrieving authors";
+ feed->updateAuthors();
+ // For feeds that have just been added, this is probably the point
+ // where the Feed object gets created; let's set refreshing to
+ // true in order to show user feedback that the feed is still
+ // being fetched
+ feed->setRefreshing(true);
+ }
+ });
connect(&Fetcher::instance(), &Fetcher::entryAdded, this, [this](const QString &feedurl, const QString &id) {
Q_UNUSED(feedurl)
// Only add the new entry to m_entries
@@ -127,31 +133,47 @@
Feed *DataManager::getFeed(const int index) const
{
- return getFeed(m_feedmap[index]);
+ if (index < m_feedmap.size()) {
+ return getFeed(m_feedmap[index]);
+ }
+ return nullptr;
}
Feed *DataManager::getFeed(const QString &feedurl) const
{
- if (m_feeds[feedurl] == nullptr)
- loadFeed(feedurl);
- return m_feeds[feedurl];
+ if (m_feeds.contains(feedurl)) {
+ if (m_feeds[feedurl] == nullptr) {
+ loadFeed(feedurl);
+ }
+ return m_feeds[feedurl];
+ }
+ return nullptr;
}
Entry *DataManager::getEntry(const int feed_index, const int entry_index) const
{
- return getEntry(m_entrymap[m_feedmap[feed_index]][entry_index]);
+ if (feed_index < m_feedmap.size() && entry_index < m_entrymap[m_feedmap[feed_index]].size()) {
+ return getEntry(m_entrymap[m_feedmap[feed_index]][entry_index]);
+ }
+ return nullptr;
}
Entry *DataManager::getEntry(const Feed *feed, const int entry_index) const
{
- return getEntry(m_entrymap[feed->url()][entry_index]);
+ if (feed && entry_index < m_entrymap[feed->url()].size()) {
+ return getEntry(m_entrymap[feed->url()][entry_index]);
+ }
+ return nullptr;
}
Entry *DataManager::getEntry(const QString &id) const
{
- if (m_entries[id] == nullptr)
- loadEntry(id);
- return m_entries[id];
+ if (m_entries.contains(id)) {
+ if (m_entries[id] == nullptr)
+ loadEntry(id);
+ return m_entries[id];
+ }
+ return nullptr;
}
int DataManager::feedCount() const
@@ -174,17 +196,6 @@
return m_entrymap[feed->url()].count();
}
-int DataManager::newEntryCount(const Feed *feed) const
-{
- QSqlQuery query;
- query.prepare(QStringLiteral("SELECT COUNT (id) FROM Entries where feed=:feed AND new=1;"));
- query.bindValue(QStringLiteral(":feed"), feed->url());
- Database::instance().execute(query);
- if (!query.next())
- return -1;
- return query.value(0).toInt();
-}
-
void DataManager::removeFeed(Feed *feed)
{
QList<Feed *> feeds;
@@ -196,14 +207,19 @@
{
// Get feed pointer
Feed *feed = getFeed(m_feedmap[index]);
- removeFeed(feed);
+ if (feed) {
+ removeFeed(feed);
+ }
}
void DataManager::removeFeeds(const QStringList &feedurls)
{
QList<Feed *> feeds;
for (QString feedurl : feedurls) {
- feeds << getFeed(feedurl);
+ Feed *feed = getFeed(feedurl);
+ if (feed) {
+ feeds << feed;
+ }
}
removeFeeds(feeds);
}
@@ -213,7 +229,9 @@
QList<Feed *> feeds;
for (QVariant feedVariant : feedVariantList) {
if (feedVariant.canConvert<Feed *>()) {
- feeds << feedVariant.value<Feed *>();
+ if (feedVariant.value<Feed *>()) {
+ feeds << feedVariant.value<Feed *>();
+ }
}
}
removeFeeds(feeds);
@@ -222,83 +240,90 @@
void DataManager::removeFeeds(const QList<Feed *> &feeds)
{
for (Feed *feed : feeds) {
- const QString feedurl = feed->url();
- int index = m_feedmap.indexOf(feedurl);
-
- qCDebug(kastsDataManager) << "deleting feed" << feedurl << "with index" << index;
-
- // Delete the object instances and mappings
- // First delete entries in Queue
- qCDebug(kastsDataManager) << "delete queueentries of" << feedurl;
- QStringList removeFromQueueList;
- for (auto &id : m_queuemap) {
- if (getEntry(id)->feed()->url() == feedurl) {
- if (AudioManager::instance().entry() == getEntry(id)) {
- AudioManager::instance().next();
+ if (feed) {
+ const QString feedurl = feed->url();
+ int index = m_feedmap.indexOf(feedurl);
+
+ qCDebug(kastsDataManager) << "deleting feed" << feedurl << "with index" << index;
+
+ // Delete the object instances and mappings
+ // First delete entries in Queue
+ qCDebug(kastsDataManager) << "delete queueentries of" << feedurl;
+ QStringList removeFromQueueList;
+ for (auto &id : m_queuemap) {
+ if (getEntry(id)->feed()->url() == feedurl) {
+ if (AudioManager::instance().entry() == getEntry(id)) {
+ AudioManager::instance().next();
+ }
+ removeFromQueueList += id;
}
- removeFromQueueList += id;
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/datamanager.h
^
|
@@ -11,6 +11,7 @@
#include <QString>
#include <QStringList>
+#include "models/abstractepisodeproxymodel.h"
#include "models/episodemodel.h"
class Entry;
@@ -36,7 +37,6 @@
QStringList getIdList(const Feed *feed) const;
int entryCount(const int feed_index) const;
int entryCount(const Feed *feed) const;
- int newEntryCount(const Feed *feed) const;
Q_INVOKABLE void addFeed(const QString &url);
void addFeed(const QString &url, const bool fetch);
void addFeeds(const QStringList &urls);
@@ -55,6 +55,7 @@
Q_INVOKABLE void moveQueueItem(const int from, const int to);
void addToQueue(const QString &id);
void removeFromQueue(const QString &id);
+ Q_INVOKABLE void sortQueue(AbstractEpisodeProxyModel::SortType sortType);
Q_INVOKABLE QString lastPlayingEntry();
Q_INVOKABLE void setLastPlayingEntry(const QString &id);
@@ -67,12 +68,14 @@
Q_INVOKABLE void bulkMarkRead(bool state, QStringList list);
Q_INVOKABLE void bulkMarkNew(bool state, QStringList list);
+ Q_INVOKABLE void bulkMarkFavorite(bool state, QStringList list);
Q_INVOKABLE void bulkQueueStatus(bool state, QStringList list);
Q_INVOKABLE void bulkDownloadEnclosures(QStringList list);
Q_INVOKABLE void bulkDeleteEnclosures(QStringList list);
Q_INVOKABLE void bulkMarkReadByIndex(bool state, QModelIndexList list);
Q_INVOKABLE void bulkMarkNewByIndex(bool state, QModelIndexList list);
+ Q_INVOKABLE void bulkMarkFavoriteByIndex(bool state, QModelIndexList list);
Q_INVOKABLE void bulkQueueStatusByIndex(bool state, QModelIndexList list);
Q_INVOKABLE void bulkDownloadEnclosuresByIndex(QModelIndexList list);
Q_INVOKABLE void bulkDeleteEnclosuresByIndex(QModelIndexList list);
@@ -84,12 +87,15 @@
void queueEntryAdded(const int &index, const QString &id);
void queueEntryRemoved(const int &index, const QString &id);
void queueEntryMoved(const int &from, const int &to);
+ void queueSorted();
void unreadEntryCountChanged(const QString &url);
void newEntryCountChanged(const QString &url);
+ void favoriteEntryCountChanged(const QString &url);
void bulkReadStatusActionFinished();
void bulkNewStatusActionFinished();
+ void bulkFavoriteStatusActionFinished();
// this will relay the AudioManager::playbackRateChanged signal; this is
// required to avoid a dependency loop on startup
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/enclosure.cpp
^
|
@@ -29,12 +29,11 @@
#include "fetcher.h"
#include "models/downloadmodel.h"
#include "models/errorlogmodel.h"
+#include "networkconnectionmanager.h"
#include "settingsmanager.h"
#include "storagemanager.h"
#include "sync/sync.h"
-#include <solidextras/networkstatus.h>
-
Enclosure::Enclosure(Entry *entry)
: QObject(entry)
, m_entry(entry)
@@ -156,7 +155,7 @@
return;
}
- if (SolidExtras::NetworkStatus().metered() == SolidExtras::NetworkStatus::Yes && !SettingsManager::self()->allowMeteredEpisodeDownloads()) {
+ if (!NetworkConnectionManager::instance().episodeDownloadsAllowed()) {
Q_EMIT downloadError(Error::Type::MeteredNotAllowed,
m_entry->feed()->url(),
m_entry->id(),
@@ -263,6 +262,10 @@
if (m_entry->getNew()) {
m_entry->setNew(false);
}
+
+ // Trigger update of image since the downloaded file can have an embedded image
+ Q_EMIT m_entry->imageChanged(m_entry->image());
+ Q_EMIT m_entry->cachedImageChanged(m_entry->cachedImage());
}
void Enclosure::deleteFile()
@@ -291,7 +294,7 @@
QString Enclosure::path() const
{
- return StorageManager::instance().enclosurePath(m_url);
+ return StorageManager::instance().enclosurePath(m_entry->title(), m_url, m_entry->feed()->dirname());
}
Enclosure::Status Enclosure::status() const
@@ -302,7 +305,7 @@
QString Enclosure::cachedEmbeddedImage() const
{
// if image is already cached, then return the path
- QString cachedpath = StorageManager::instance().imagePath(path());
+ QString cachedpath = StorageManager::instance().imagePath(m_url);
if (QFileInfo::exists(cachedpath)) {
if (QFileInfo(cachedpath).size() != 0) {
return QUrl::fromLocalFile(cachedpath).toString();
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/entry.cpp
^
|
@@ -72,6 +72,10 @@
m_new = entryQuery.value(QStringLiteral("new")).toBool();
Q_EMIT newChanged(m_new);
}
+ if (m_favorite != entryQuery.value(QStringLiteral("favorite")).toBool()) {
+ m_favorite = entryQuery.value(QStringLiteral("favorite")).toBool();
+ Q_EMIT favoriteChanged(m_favorite);
+ }
setHasEnclosure(entryQuery.value(QStringLiteral("hasEnclosure")).toBool(), emitSignals);
setImage(entryQuery.value(QStringLiteral("image")).toString(), emitSignals);
@@ -172,6 +176,11 @@
return m_new;
}
+bool Entry::favorite() const
+{
+ return m_favorite;
+}
+
QString Entry::baseUrl() const
{
return QUrl(m_link).adjusted(QUrl::RemovePath).toString();
@@ -340,6 +349,34 @@
}
}
+void Entry::setFavorite(bool favorite)
+{
+ if (favorite != m_favorite) {
+ // Making a detour through DataManager to make bulk operations more
+ // performant. DataManager will call setFavoriteInternal on every item to
+ // be marked new/not new. So implement features there.
+ DataManager::instance().bulkMarkFavorite(favorite, QStringList(m_id));
+ }
+}
+
+void Entry::setFavoriteInternal(bool favorite)
+{
+ if (favorite != m_favorite) {
+ // Make sure that operations done here can be wrapped inside an sqlite
+ // transaction. I.e. no calls that trigger a SELECT operation.
+ m_favorite = favorite;
+ Q_EMIT favoriteChanged(m_favorite);
+
+ QSqlQuery query;
+ query.prepare(QStringLiteral("UPDATE Entries SET favorite=:favorite WHERE id=:id;"));
+ query.bindValue(QStringLiteral(":id"), m_id);
+ query.bindValue(QStringLiteral(":favorite"), m_favorite);
+ Database::instance().execute(query);
+
+ Q_EMIT DataManager::instance().favoriteEntryCountChanged(m_feed->url());
+ }
+}
+
QString Entry::adjustedContent(int width, int fontSize)
{
QString ret(m_content);
@@ -401,11 +438,11 @@
QString Entry::image() const
{
- if (!m_image.isEmpty()) {
- return m_image;
- } else if (m_hasenclosure && !m_enclosure->cachedEmbeddedImage().isEmpty()) {
+ if (m_hasenclosure && !m_enclosure->cachedEmbeddedImage().isEmpty()) {
// use embedded image if available
return m_enclosure->cachedEmbeddedImage();
+ } else if (!m_image.isEmpty()) {
+ return m_image;
} else {
// else fall back to feed image
return m_feed->image();
@@ -414,16 +451,17 @@
QString Entry::cachedImage() const
{
- // First check for the feed image, fall back if needed
+ // First check for an image in the downloaded file
+ if (m_hasenclosure && !m_enclosure->cachedEmbeddedImage().isEmpty()) {
+ // use embedded image if available
+ return m_enclosure->cachedEmbeddedImage();
+ }
+
+ // Then check for the entry image, fall back if needed to feed image
QString image = m_image;
if (image.isEmpty()) {
- if (m_hasenclosure && !m_enclosure->cachedEmbeddedImage().isEmpty()) {
- // use embedded image if available
- return m_enclosure->cachedEmbeddedImage();
- } else {
- // else fall back to feed image
- image = m_feed->image();
- }
+ // else fall back to feed image
+ image = m_feed->image();
}
return Fetcher::instance().image(image);
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/entry.h
^
|
@@ -32,6 +32,7 @@
Q_PROPERTY(QString baseUrl READ baseUrl NOTIFY baseUrlChanged)
Q_PROPERTY(bool read READ read WRITE setRead NOTIFY readChanged)
Q_PROPERTY(bool new READ getNew WRITE setNew NOTIFY newChanged)
+ Q_PROPERTY(bool favorite READ favorite WRITE setFavorite NOTIFY favoriteChanged)
Q_PROPERTY(Enclosure *enclosure READ enclosure CONSTANT)
Q_PROPERTY(bool hasEnclosure READ hasEnclosure NOTIFY hasEnclosureChanged)
Q_PROPERTY(QString image READ image NOTIFY imageChanged)
@@ -51,6 +52,7 @@
QString link() const;
bool read() const;
bool getNew() const;
+ bool favorite() const;
Enclosure *enclosure() const;
bool hasEnclosure() const;
QString image() const;
@@ -62,12 +64,14 @@
void setRead(bool read);
void setNew(bool state);
+ void setFavorite(bool favorite);
void setQueueStatus(bool status);
Q_INVOKABLE QString adjustedContent(int width, int fontSize);
void setNewInternal(bool state);
void setReadInternal(bool read);
+ void setFavoriteInternal(bool favorite);
void setQueueStatusInternal(bool state);
Q_SIGNALS:
@@ -80,6 +84,7 @@
void baseUrlChanged(const QString &baseUrl);
void readChanged(bool read);
void newChanged(bool state);
+ void favoriteChanged(bool favorite);
void hasEnclosureChanged(bool hasEnclosure);
void imageChanged(const QString &url);
void cachedImageChanged(const QString &imagePath);
@@ -106,6 +111,7 @@
QString m_link;
bool m_read;
bool m_new;
+ bool m_favorite;
Enclosure *m_enclosure = nullptr;
QString m_image;
bool m_hasenclosure = false;
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/error.cpp
^
|
@@ -45,21 +45,21 @@
{
switch (type) {
case Error::Type::FeedUpdate:
- return i18n("Podcast Update Error");
+ return i18n("Podcast update error");
case Error::Type::MediaDownload:
- return i18n("Media Download Error");
+ return i18n("Media download error");
case Error::Type::MeteredNotAllowed:
- return i18n("Update Not Allowed on Metered Connection");
+ return i18n("Update not allowed on metered connection");
case Error::Type::InvalidMedia:
- return i18n("Invalid Media File");
+ return i18n("Invalid media file");
case Error::Type::DiscoverError:
- return i18n("Nothing Found");
+ return i18n("Nothing found");
case Error::Type::StorageMoveError:
return i18n("Error moving storage path");
case Error::Type::SyncError:
- return i18n("Error Syncing Feed and/or Episode Status");
+ return i18n("Error syncing feed and/or episode status");
case Error::Type::MeteredStreamingNotAllowed:
- return i18n("No Connection or Streaming Not Allowed on Metered Connection");
+ return i18n("Connection or streaming not allowed on metered connection");
default:
return QString();
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/feed.cpp
^
|
@@ -37,12 +37,15 @@
m_deleteAfterCount = query.value(QStringLiteral("deleteAfterCount")).toInt();
m_deleteAfterType = query.value(QStringLiteral("deleteAfterType")).toInt();
m_notify = query.value(QStringLiteral("notify")).toBool();
+ m_dirname = query.value(QStringLiteral("dirname")).toString();
m_errorId = 0;
m_errorString = QLatin1String("");
updateAuthors();
updateUnreadEntryCountFromDB();
+ updateNewEntryCountFromDB();
+ updateFavoriteEntryCountFromDB();
connect(&Fetcher::instance(), &Fetcher::feedUpdateStatusChanged, this, [this](const QString &url, bool status) {
if (url == m_url) {
@@ -53,11 +56,26 @@
if (url == m_url) {
Q_EMIT entryCountChanged();
updateUnreadEntryCountFromDB();
+ Q_EMIT DataManager::instance().unreadEntryCountChanged(m_url);
Q_EMIT unreadEntryCountChanged();
+ Q_EMIT DataManager::instance().newEntryCountChanged(m_url);
+ Q_EMIT newEntryCountChanged();
setErrorId(0);
setErrorString(QLatin1String(""));
}
});
+ connect(&DataManager::instance(), &DataManager::newEntryCountChanged, this, [this](const QString &url) {
+ if (url == m_url) {
+ updateNewEntryCountFromDB();
+ Q_EMIT newEntryCountChanged();
+ }
+ });
+ connect(&DataManager::instance(), &DataManager::favoriteEntryCountChanged, this, [this](const QString &url) {
+ if (url == m_url) {
+ updateFavoriteEntryCountFromDB();
+ Q_EMIT favoriteEntryCountChanged();
+ }
+ });
connect(&Fetcher::instance(),
&Fetcher::error,
this,
@@ -140,6 +158,28 @@
m_unreadEntryCount = query.value(0).toInt();
}
+void Feed::updateNewEntryCountFromDB()
+{
+ QSqlQuery query;
+ query.prepare(QStringLiteral("SELECT COUNT (id) FROM Entries where feed=:feed AND new=1;"));
+ query.bindValue(QStringLiteral(":feed"), m_url);
+ Database::instance().execute(query);
+ if (!query.next())
+ m_newEntryCount = -1;
+ m_newEntryCount = query.value(0).toInt();
+}
+
+void Feed::updateFavoriteEntryCountFromDB()
+{
+ QSqlQuery query;
+ query.prepare(QStringLiteral("SELECT COUNT (id) FROM Entries where feed=:feed AND favorite=1;"));
+ query.bindValue(QStringLiteral(":feed"), m_url);
+ Database::instance().execute(query);
+ if (!query.next())
+ m_favoriteEntryCount = -1;
+ m_favoriteEntryCount = query.value(0).toInt();
+}
+
QString Feed::url() const
{
return m_url;
@@ -200,6 +240,11 @@
return m_notify;
}
+QString Feed::dirname() const
+{
+ return m_dirname;
+}
+
int Feed::entryCount() const
{
return DataManager::instance().entryCount(this);
@@ -212,7 +257,12 @@
int Feed::newEntryCount() const
{
- return DataManager::instance().newEntryCount(this);
+ return m_newEntryCount;
+}
+
+int Feed::favoriteEntryCount() const
+{
+ return m_favoriteEntryCount;
}
bool Feed::refreshing() const
@@ -301,6 +351,14 @@
}
}
+void Feed::setDirname(const QString &dirname)
+{
+ if (dirname != m_dirname) {
+ m_dirname = dirname;
+ Q_EMIT dirnameChanged(m_dirname);
+ }
+}
+
void Feed::setUnreadEntryCount(const int count)
{
if (count != m_unreadEntryCount) {
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/feed.h
^
|
@@ -32,9 +32,11 @@
Q_PROPERTY(QDateTime subscribed READ subscribed CONSTANT)
Q_PROPERTY(QDateTime lastUpdated READ lastUpdated WRITE setLastUpdated NOTIFY lastUpdatedChanged)
Q_PROPERTY(bool notify READ notify WRITE setNotify NOTIFY notifyChanged)
+ Q_PROPERTY(QString dirname READ dirname WRITE setDirname NOTIFY dirnameChanged)
Q_PROPERTY(int entryCount READ entryCount NOTIFY entryCountChanged)
Q_PROPERTY(int unreadEntryCount READ unreadEntryCount WRITE setUnreadEntryCount NOTIFY unreadEntryCountChanged)
Q_PROPERTY(int newEntryCount READ newEntryCount NOTIFY newEntryCountChanged)
+ Q_PROPERTY(int favoriteEntryCount READ favoriteEntryCount NOTIFY favoriteEntryCountChanged)
Q_PROPERTY(int errorId READ errorId WRITE setErrorId NOTIFY errorIdChanged)
Q_PROPERTY(QString errorString READ errorString WRITE setErrorString NOTIFY errorStringChanged)
Q_PROPERTY(EntriesProxyModel *entries MEMBER m_entries CONSTANT)
@@ -58,9 +60,11 @@
QDateTime subscribed() const;
QDateTime lastUpdated() const;
bool notify() const;
+ QString dirname() const;
int entryCount() const;
int unreadEntryCount() const;
int newEntryCount() const;
+ int favoriteEntryCount() const;
bool read() const;
int errorId() const;
QString errorString() const;
@@ -76,6 +80,7 @@
void setDeleteAfterType(int type);
void setLastUpdated(const QDateTime &lastUpdated);
void setNotify(bool notify);
+ void setDirname(const QString &dirname);
void setUnreadEntryCount(const int count);
void setRefreshing(bool refreshing);
void setErrorId(int errorId);
@@ -94,9 +99,11 @@
void deleteAfterTypeChanged(int type);
void lastUpdatedChanged(const QDateTime &lastUpdated);
void notifyChanged(bool notify);
+ void dirnameChanged(const QString &dirname);
void entryCountChanged();
void unreadEntryCountChanged();
void newEntryCountChanged();
+ void favoriteEntryCountChanged();
void errorIdChanged(int &errorId);
void errorStringChanged(const QString &errorString);
@@ -104,6 +111,8 @@
private:
void updateUnreadEntryCountFromDB();
+ void updateNewEntryCountFromDB();
+ void updateFavoriteEntryCountFromDB();
QString m_url;
QString m_name;
@@ -116,9 +125,12 @@
QDateTime m_subscribed;
QDateTime m_lastUpdated;
bool m_notify;
+ QString m_dirname;
int m_errorId;
QString m_errorString;
int m_unreadEntryCount = -1;
+ int m_newEntryCount = -1;
+ int m_favoriteEntryCount = -1;
EntriesProxyModel *m_entries;
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/fetcher.cpp
^
|
@@ -15,6 +15,7 @@
#include <QFile>
#include <QFileInfo>
#include <QNetworkAccessManager>
+#include <QNetworkProxyFactory>
#include <QNetworkReply>
#include <QTime>
#include <QTimer>
@@ -24,12 +25,11 @@
#include "fetchfeedsjob.h"
#include "kasts-version.h"
#include "models/errorlogmodel.h"
+#include "networkconnectionmanager.h"
#include "settingsmanager.h"
#include "storagemanager.h"
#include "sync/sync.h"
-#include <solidextras/networkstatus.h>
-
Fetcher::Fetcher()
{
connect(this, &Fetcher::error, &ErrorLogModel::instance(), &ErrorLogModel::monitorErrorMessages);
@@ -42,6 +42,8 @@
manager->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
manager->setStrictTransportSecurityEnabled(true);
manager->enableStrictTransportSecurityStore(true);
+
+ QNetworkProxyFactory::setUseSystemConfiguration(true);
}
void Fetcher::fetch(const QString &url)
@@ -127,9 +129,7 @@
// if image has not yet been cached, then check for network connectivity if
// possible; and download the image
- SolidExtras::NetworkStatus networkStatus;
- if (networkStatus.connectivity() == SolidExtras::NetworkStatus::No
- || (networkStatus.metered() == SolidExtras::NetworkStatus::Yes && !SettingsManager::self()->allowMeteredImageDownloads())) {
+ if (!NetworkConnectionManager::instance().imageDownloadsAllowed()) {
return QLatin1String("no-image");
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/fetcher.h
^
|
@@ -51,7 +51,8 @@
const QString &image,
const QString &link,
const QString &description,
- const QDateTime &lastUpdated);
+ const QDateTime &lastUpdated,
+ const QString &dirname);
void feedUpdateStatusChanged(const QString &url, bool status);
void cancelFetching();
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/kmediasession/example-app/qml/main.qml
^
|
@@ -17,7 +17,7 @@
Kirigami.ApplicationWindow {
id: root
- title: i18n("Example player KMediaSession")
+ title: i18n("Example KMediaSession Player")
KMediaSession {
id: audio
@@ -69,13 +69,13 @@
RowLayout {
Controls.Button {
icon.name: "document-open-folder"
- text: i18n("Select file...")
+ text: i18n("Select File…")
onClicked: filePathDialog.open()
}
FileDialog {
id: filePathDialog
- title: i18n("Select media file")
+ title: i18n("Select Media File")
currentFile: audio.source
onAccepted: {
audio.source = filePathDialog.file;
@@ -171,13 +171,13 @@
}
ColumnLayout {
Controls.Label {
- text: i18n("title: %1", audio.metaData.title)
+ text: i18n("Title: %1", audio.metaData.title)
}
Controls.Label {
- text: i18n("artist: %1", audio.metaData.artist)
+ text: i18n("Artist: %1", audio.metaData.artist)
}
Controls.Label {
- text: i18n("album: %1", audio.metaData.album)
+ text: i18n("Album: %1", audio.metaData.album)
}
Image {
fillMode: Image.PreserveAspectFit
@@ -188,13 +188,13 @@
}
ColumnLayout {
Controls.Label {
- text: i18n("mediaStatus: %1", audio.mediaStatus)
+ text: i18n("Media status: %1", audio.mediaStatus)
}
Controls.Label {
- text: i18n("playbackStatus: %1", audio.playbackState)
+ text: i18n("Playback status: %1", audio.playbackState)
}
Controls.Label {
- text: i18n("error: %1", audio.error)
+ text: i18n("Error: %1", audio.error)
}
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/kmediasession/mediabackends/vlcmediabackend.cpp
^
|
@@ -679,16 +679,16 @@
void VlcMediaBackendPrivate::parseMetaData()
{
qCDebug(VlcSignalsLog) << "VlcMediaBackendPrivate::parseMetaData()";
- if (mKMediaSession->metaData()->title().isEmpty()) {
+ if (mMedia && mKMediaSession->metaData()->title().isEmpty()) {
mKMediaSession->metaData()->setTitle(QString::fromUtf8(libvlc_media_get_meta(mMedia, libvlc_meta_Title)));
}
- if (mKMediaSession->metaData()->artist().isEmpty()) {
+ if (mMedia && mKMediaSession->metaData()->artist().isEmpty()) {
mKMediaSession->metaData()->setArtist(QString::fromUtf8(libvlc_media_get_meta(mMedia, libvlc_meta_Artist)));
}
- if (mKMediaSession->metaData()->album().isEmpty()) {
+ if (mMedia && mKMediaSession->metaData()->album().isEmpty()) {
mKMediaSession->metaData()->setAlbum(QString::fromUtf8(libvlc_media_get_meta(mMedia, libvlc_meta_Album)));
}
- if (mKMediaSession->metaData()->artworkUrl().isEmpty()) {
+ if (mMedia && mKMediaSession->metaData()->artworkUrl().isEmpty()) {
mKMediaSession->metaData()->setArtworkUrl(QUrl(QString::fromUtf8(libvlc_media_get_meta(mMedia, libvlc_meta_ArtworkURL))));
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/main.cpp
^
|
@@ -49,6 +49,7 @@
#include "models/feedsproxymodel.h"
#include "models/podcastsearchmodel.h"
#include "models/queuemodel.h"
+#include "networkconnectionmanager.h"
#include "settingsmanager.h"
#include "storagemanager.h"
#include "sync/sync.h"
@@ -78,7 +79,7 @@
QGuiApplication app(argc, argv);
qInstallMessageHandler(myMessageHandler);
QLoggingCategory::setFilterRules(QStringLiteral("org.kde.*=true"));
- QQuickStyle::setStyle(QStringLiteral("Material"));
+ QQuickStyle::setStyle(QStringLiteral("org.kde.breeze"));
#else
QApplication app(argc, argv);
if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE")) {
@@ -121,7 +122,7 @@
QStringLiteral(KASTS_VERSION_STRING),
i18n("Podcast Player"),
KAboutLicense::GPL,
- i18n("© 2020-2023 KDE Community"));
+ i18n("© 2020–2023 KDE Community"));
about.addAuthor(i18n("Tobias Fella"), QString(), QStringLiteral("tobias.fella@kde.org"), QStringLiteral("https://tobiasfella.de"));
about.addAuthor(i18n("Bart De Vries"), QString(), QStringLiteral("bart@mogwai.be"));
about.setProgramLogo(QVariant(QIcon(QStringLiteral(":/logo.svg"))));
@@ -152,6 +153,7 @@
return engine->toScriptValue(KAboutData::applicationData());
});
qmlRegisterSingletonInstance("org.kde.kasts", 1, 0, "Database", &Database::instance());
+ qmlRegisterSingletonInstance("org.kde.kasts", 1, 0, "NetworkConnectionManager", &NetworkConnectionManager::instance());
qmlRegisterSingletonInstance("org.kde.kasts", 1, 0, "Fetcher", &Fetcher::instance());
qmlRegisterSingletonInstance("org.kde.kasts", 1, 0, "DataManager", &DataManager::instance());
qmlRegisterSingletonInstance("org.kde.kasts", 1, 0, "SettingsManager", SettingsManager::self());
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/abstractepisodemodel.cpp
^
|
@@ -19,7 +19,9 @@
{IdRole, "id"},
{ReadRole, "read"},
{NewRole, "new"},
+ {FavoriteRole, "favorite"},
{ContentRole, "content"},
{FeedNameRole, "feedname"},
+ {UpdatedRole, "updated"},
};
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/abstractepisodemodel.h
^
|
@@ -22,8 +22,10 @@
IdRole,
ReadRole,
NewRole,
+ FavoriteRole,
ContentRole,
FeedNameRole,
+ UpdatedRole,
};
Q_ENUM(Roles)
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/abstractepisodeproxymodel.cpp
^
|
@@ -4,13 +4,13 @@
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
-#include "models/episodeproxymodel.h"
+#include "models/abstractepisodemodel.h"
#include <KLocalizedString>
#include "datamanager.h"
#include "entry.h"
-#include "models/abstractepisodemodel.h"
+#include "models/episodeproxymodel.h"
AbstractEpisodeProxyModel::AbstractEpisodeProxyModel(QObject *parent)
: QSortFilterProxyModel(parent)
@@ -40,6 +40,12 @@
case NotNewFilter:
accepted = !sourceModel()->data(index, AbstractEpisodeModel::Roles::NewRole).value<bool>();
break;
+ case FavoriteFilter:
+ accepted = sourceModel()->data(index, AbstractEpisodeModel::Roles::FavoriteRole).value<bool>();
+ break;
+ case NotFavoriteFilter:
+ accepted = !sourceModel()->data(index, AbstractEpisodeModel::Roles::FavoriteRole).value<bool>();
+ break;
default:
accepted = true;
break;
@@ -89,11 +95,17 @@
return m_searchFlags;
}
+AbstractEpisodeProxyModel::SortType AbstractEpisodeProxyModel::sortType() const
+{
+ return m_currentSort;
+}
+
void AbstractEpisodeProxyModel::setFilterType(FilterType type)
{
if (type != m_currentFilter) {
disconnect(&DataManager::instance(), &DataManager::bulkReadStatusActionFinished, this, nullptr);
disconnect(&DataManager::instance(), &DataManager::bulkNewStatusActionFinished, this, nullptr);
+ disconnect(&DataManager::instance(), &DataManager::bulkFavoriteStatusActionFinished, this, nullptr);
beginResetModel();
m_currentFilter = type;
@@ -113,6 +125,12 @@
dynamic_cast<AbstractEpisodeModel *>(sourceModel())->updateInternalState();
endResetModel();
});
+ } else if (type == FavoriteFilter || type == NotFavoriteFilter) {
+ connect(&DataManager::instance(), &DataManager::bulkFavoriteStatusActionFinished, this, [this]() {
+ beginResetModel();
+ dynamic_cast<AbstractEpisodeModel *>(sourceModel())->updateInternalState();
+ endResetModel();
+ });
}
Q_EMIT filterTypeChanged();
@@ -139,25 +157,49 @@
}
}
-QString AbstractEpisodeProxyModel::getFilterName(FilterType type) const
+void AbstractEpisodeProxyModel::setSortType(SortType type)
+{
+ if (type != m_currentSort) {
+ switch (type) {
+ case SortType::DateDescending:
+ m_currentSort = type;
+ setSortRole(AbstractEpisodeModel::UpdatedRole);
+ sort(-1, Qt::DescendingOrder);
+ break;
+ case SortType::DateAscending:
+ m_currentSort = type;
+ setSortRole(AbstractEpisodeModel::UpdatedRole);
+ sort(0, Qt::AscendingOrder);
+ break;
+ }
+
+ Q_EMIT sortTypeChanged();
+ }
+}
+
+QString AbstractEpisodeProxyModel::getFilterName(FilterType type)
{
switch (type) {
case FilterType::NoFilter:
- return i18nc("@label:chooser Choice of filter for episode list", "No Filter");
+ return i18nc("@label:chooser Choice of filter for episode list", "No filter");
case FilterType::ReadFilter:
- return i18nc("@label:chooser Choice of filter for episode list", "Played Episodes");
+ return i18nc("@label:chooser Choice of filter for episode list", "Played episodes");
case FilterType::NotReadFilter:
- return i18nc("@label:chooser Choice of filter for episode list", "Unplayed Episodes");
+ return i18nc("@label:chooser Choice of filter for episode list", "Unplayed episodes");
case FilterType::NewFilter:
return i18nc("@label:chooser Choice of filter for episode list", "Episodes marked as \"New\"");
case FilterType::NotNewFilter:
return i18nc("@label:chooser Choice of filter for episode list", "Episodes not marked as \"New\"");
+ case FilterType::FavoriteFilter:
+ return i18nc("@label:chooser Choice of filter for episode list", "Episodes marked as Favorite");
+ case FilterType::NotFavoriteFilter:
+ return i18nc("@label:chooser Choice of filter for episode list", "Episodes not marked as Favorite");
default:
return QString();
}
}
-QString AbstractEpisodeProxyModel::getSearchFlagName(SearchFlag flag) const
+QString AbstractEpisodeProxyModel::getSearchFlagName(SearchFlag flag)
{
switch (flag) {
case SearchFlag::TitleFlag:
@@ -165,7 +207,31 @@
case SearchFlag::ContentFlag:
return i18nc("@label:chooser Choice of fields to search for string", "Description");
case SearchFlag::FeedNameFlag:
- return i18nc("@label:chooser Choice of fields to search for string", "Podcast Title");
+ return i18nc("@label:chooser Choice of fields to search for string", "Podcast title");
+ default:
+ return QString();
+ }
+}
+
+QString AbstractEpisodeProxyModel::getSortName(SortType type)
+{
+ switch (type) {
+ case SortType::DateDescending:
+ return i18nc("@label:chooser Sort episodes by decreasing date", "Date: newer first");
+ case SortType::DateAscending:
+ return i18nc("@label:chooser Sort episodes by increasing date", "Date: older first");
+ default:
+ return QString();
+ }
+}
+
+QString AbstractEpisodeProxyModel::getSortIconName(SortType type)
+{
+ switch (type) {
+ case SortType::DateDescending:
+ return QStringLiteral("view-sort-descending");
+ case SortType::DateAscending:
+ return QStringLiteral("view-sort-ascending");
default:
return QString();
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/abstractepisodeproxymodel.h
^
|
@@ -25,6 +25,8 @@
NotReadFilter,
NewFilter,
NotNewFilter,
+ FavoriteFilter,
+ NotFavoriteFilter,
};
Q_ENUM(FilterType)
@@ -37,10 +39,17 @@
Q_DECLARE_FLAGS(SearchFlags, SearchFlag)
Q_FLAGS(SearchFlags)
+ enum SortType {
+ DateDescending,
+ DateAscending,
+ };
+ Q_ENUM(SortType)
+
Q_PROPERTY(FilterType filterType READ filterType WRITE setFilterType NOTIFY filterTypeChanged)
Q_PROPERTY(QString filterName READ filterName NOTIFY filterTypeChanged)
Q_PROPERTY(QString searchFilter READ searchFilter WRITE setSearchFilter NOTIFY searchFilterChanged)
Q_PROPERTY(SearchFlags searchFlags READ searchFlags WRITE setSearchFlags NOTIFY searchFlagsChanged)
+ Q_PROPERTY(SortType sortType READ sortType WRITE setSortType NOTIFY sortTypeChanged)
explicit AbstractEpisodeProxyModel(QObject *parent = nullptr);
@@ -50,13 +59,17 @@
QString filterName() const;
QString searchFilter() const;
SearchFlags searchFlags() const;
+ SortType sortType() const;
void setFilterType(FilterType type);
void setSearchFilter(const QString &searchString);
void setSearchFlags(SearchFlags searchFlags);
+ void setSortType(SortType type);
- Q_INVOKABLE QString getFilterName(FilterType type) const;
- Q_INVOKABLE QString getSearchFlagName(SearchFlag flag) const;
+ Q_INVOKABLE static QString getFilterName(FilterType type);
+ Q_INVOKABLE static QString getSearchFlagName(SearchFlag flag);
+ Q_INVOKABLE static QString getSortName(SortType type);
+ Q_INVOKABLE static QString getSortIconName(SortType type);
Q_INVOKABLE QItemSelection createSelection(int rowa, int rowb);
@@ -64,11 +77,14 @@
void filterTypeChanged();
void searchFilterChanged();
void searchFlagsChanged();
+ void sortTypeChanged();
protected:
FilterType m_currentFilter = FilterType::NoFilter;
QString m_searchFilter;
SearchFlags m_searchFlags;
+ SortType m_currentSort = SortType::DateDescending;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractEpisodeProxyModel::SearchFlags)
+Q_DECLARE_METATYPE(AbstractEpisodeProxyModel::SortType)
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/downloadmodel.cpp
^
|
@@ -38,6 +38,7 @@
{EpisodeModel::Roles::IdRole, "id"},
{EpisodeModel::Roles::ReadRole, "read"},
{EpisodeModel::Roles::NewRole, "new"},
+ {EpisodeModel::Roles::FavoriteRole, "favorite"},
};
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/entriesmodel.cpp
^
|
@@ -42,10 +42,14 @@
return QVariant::fromValue(entry->read());
case AbstractEpisodeModel::Roles::NewRole:
return QVariant::fromValue(entry->getNew());
+ case AbstractEpisodeModel::Roles::FavoriteRole:
+ return QVariant::fromValue(entry->favorite());
case AbstractEpisodeModel::Roles::ContentRole:
return QVariant::fromValue(entry->content());
case AbstractEpisodeModel::Roles::FeedNameRole:
return QVariant::fromValue(m_feed->name());
+ case AbstractEpisodeModel::Roles::UpdatedRole:
+ return QVariant::fromValue(entry->updated());
default:
return QVariant();
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/episodemodel.cpp
^
|
@@ -41,10 +41,14 @@
return QVariant::fromValue(m_read[index.row()]);
case AbstractEpisodeModel::Roles::NewRole:
return QVariant::fromValue(m_new[index.row()]);
+ case AbstractEpisodeModel::Roles::FavoriteRole:
+ return QVariant::fromValue(m_favorite[index.row()]);
case AbstractEpisodeModel::Roles::ContentRole:
return QVariant::fromValue(m_contents[index.row()]);
case AbstractEpisodeModel::Roles::FeedNameRole:
return QVariant::fromValue(m_feedNames[index.row()]);
+ case AbstractEpisodeModel::Roles::UpdatedRole:
+ return QVariant::fromValue(m_updated[index.row()]);
default:
return QVariant();
}
@@ -61,19 +65,23 @@
m_entryIds.clear();
m_read.clear();
m_new.clear();
+ m_favorite.clear();
m_titles.clear();
m_contents.clear();
m_feedNames.clear();
+ m_updated.clear();
QSqlQuery query;
- query.prepare(QStringLiteral("SELECT id, read, new, title, content, feed FROM Entries ORDER BY updated DESC;"));
+ query.prepare(QStringLiteral("SELECT id, read, new, favorite, title, content, feed, updated FROM Entries ORDER BY updated DESC;"));
Database::instance().execute(query);
while (query.next()) {
m_entryIds += query.value(QStringLiteral("id")).toString();
m_read += query.value(QStringLiteral("read")).toBool();
m_new += query.value(QStringLiteral("new")).toBool();
+ m_favorite += query.value(QStringLiteral("favorite")).toBool();
m_titles += query.value(QStringLiteral("title")).toString();
m_contents += query.value(QStringLiteral("content")).toString();
m_feedNames += DataManager::instance().getFeed(query.value(QStringLiteral("feed")).toString())->name();
+ m_updated += query.value(QStringLiteral("updated")).toInt();
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/episodemodel.h
^
|
@@ -35,7 +35,9 @@
QStringList m_entryIds;
QVector<bool> m_read;
QVector<bool> m_new;
+ QVector<bool> m_favorite;
QStringList m_titles;
QStringList m_contents;
QStringList m_feedNames;
+ QList<int> m_updated;
};
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/feedsmodel.cpp
^
|
@@ -28,22 +28,10 @@
beginRemoveRows(QModelIndex(), index, index);
endRemoveRows();
});
- connect(&DataManager::instance(), &DataManager::unreadEntryCountChanged, this, [=](const QString &url) {
- for (int i = 0; i < rowCount(QModelIndex()); i++) {
- if (data(index(i, 0), UrlRole).toString() == url) {
- Q_EMIT dataChanged(index(i, 0), index(i, 0));
- return;
- }
- }
- });
- connect(&Fetcher::instance(), &Fetcher::feedDetailsUpdated, this, [=](const QString &url) {
- for (int i = 0; i < rowCount(QModelIndex()); i++) {
- if (data(index(i, 0), UrlRole).toString() == url) {
- Q_EMIT dataChanged(index(i, 0), index(i, 0));
- return;
- }
- }
- });
+ connect(&DataManager::instance(), &DataManager::unreadEntryCountChanged, this, &FeedsModel::triggerFeedUpdate);
+ connect(&DataManager::instance(), &DataManager::newEntryCountChanged, this, &FeedsModel::triggerFeedUpdate);
+ connect(&DataManager::instance(), &DataManager::favoriteEntryCountChanged, this, &FeedsModel::triggerFeedUpdate);
+ connect(&Fetcher::instance(), &Fetcher::feedDetailsUpdated, this, &FeedsModel::triggerFeedUpdate);
}
QHash<int, QByteArray> FeedsModel::roleNames() const
@@ -53,6 +41,8 @@
{UrlRole, "url"},
{TitleRole, "title"},
{UnreadCountRole, "unreadCount"},
+ {NewCountRole, "newCount"},
+ {FavoriteCountRole, "favoriteCount"},
};
}
@@ -74,7 +64,21 @@
return QVariant::fromValue(DataManager::instance().getFeed(index.row())->name());
case UnreadCountRole:
return QVariant::fromValue(DataManager::instance().getFeed(index.row())->unreadEntryCount());
+ case NewCountRole:
+ return QVariant::fromValue(DataManager::instance().getFeed(index.row())->newEntryCount());
+ case FavoriteCountRole:
+ return QVariant::fromValue(DataManager::instance().getFeed(index.row())->favoriteEntryCount());
default:
return QVariant();
}
}
+
+void FeedsModel::triggerFeedUpdate(const QString &url)
+{
+ for (int i = 0; i < rowCount(QModelIndex()); i++) {
+ if (data(index(i, 0), UrlRole).toString() == url) {
+ Q_EMIT dataChanged(index(i, 0), index(i, 0));
+ return;
+ }
+ }
+}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/feedsmodel.h
^
|
@@ -24,6 +24,8 @@
UrlRole,
TitleRole,
UnreadCountRole,
+ NewCountRole,
+ FavoriteCountRole,
};
Q_ENUM(Roles)
@@ -31,4 +33,7 @@
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent) const override;
+
+private:
+ void triggerFeedUpdate(const QString &url);
};
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/feedsproxymodel.cpp
^
|
@@ -6,26 +6,154 @@
#include "models/feedsproxymodel.h"
+#include <QDebug>
+
+#include <KLocalizedString>
+
FeedsProxyModel::FeedsProxyModel(QObject *parent)
: QSortFilterProxyModel(parent)
{
m_feedsModel = new FeedsModel(this);
setSourceModel(m_feedsModel);
setDynamicSortFilter(true);
- sort(0, Qt::AscendingOrder);
+ sort(0);
}
bool FeedsProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
QString leftTitle = sourceModel()->data(left, FeedsModel::TitleRole).toString();
QString rightTitle = sourceModel()->data(right, FeedsModel::TitleRole).toString();
- int leftUnreadCount = sourceModel()->data(left, FeedsModel::UnreadCountRole).toInt();
- int rightUnreadCount = sourceModel()->data(right, FeedsModel::UnreadCountRole).toInt();
- if (leftUnreadCount == rightUnreadCount) {
- return QString::localeAwareCompare(leftTitle, rightTitle) < 0;
- } else {
- return leftUnreadCount > rightUnreadCount;
+ if (m_currentSort == SortType::UnreadDescending || m_currentSort == SortType::UnreadAscending) {
+ int leftUnreadCount = sourceModel()->data(left, FeedsModel::UnreadCountRole).toInt();
+ int rightUnreadCount = sourceModel()->data(right, FeedsModel::UnreadCountRole).toInt();
+
+ if (leftUnreadCount != rightUnreadCount) {
+ if (m_currentSort == SortType::UnreadDescending) {
+ return leftUnreadCount > rightUnreadCount;
+ } else {
+ return leftUnreadCount < rightUnreadCount;
+ }
+ }
+ } else if (m_currentSort == SortType::NewDescending || m_currentSort == SortType::NewAscending) {
+ int leftNewCount = sourceModel()->data(left, FeedsModel::NewCountRole).toInt();
+ int rightNewCount = sourceModel()->data(right, FeedsModel::NewCountRole).toInt();
+
+ if (leftNewCount != rightNewCount) {
+ if (m_currentSort == SortType::NewDescending) {
+ return leftNewCount > rightNewCount;
+ } else {
+ return leftNewCount < rightNewCount;
+ }
+ }
+ } else if (m_currentSort == SortType::FavoriteDescending || m_currentSort == SortType::FavoriteAscending) {
+ int leftFavoriteCount = sourceModel()->data(left, FeedsModel::FavoriteCountRole).toInt();
+ int rightFavoriteCount = sourceModel()->data(right, FeedsModel::FavoriteCountRole).toInt();
+
+ if (leftFavoriteCount != rightFavoriteCount) {
+ if (m_currentSort == SortType::FavoriteDescending) {
+ return leftFavoriteCount > rightFavoriteCount;
+ } else {
+ return leftFavoriteCount < rightFavoriteCount;
+ }
+ }
+ } else if (m_currentSort == SortType::TitleDescending) {
+ return QString::localeAwareCompare(leftTitle, rightTitle) > 0;
+ }
+
+ // In case there is a "tie" always use ascending alphabetical ordering
+ return QString::localeAwareCompare(leftTitle, rightTitle) < 0;
+}
+
+bool FeedsProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
+{
+ QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
+
+ bool found = m_searchFilter.isEmpty();
+ if (!m_searchFilter.isEmpty()) {
+ if (sourceModel()->data(index, FeedsModel::Roles::TitleRole).value<QString>().contains(m_searchFilter, Qt::CaseInsensitive)) {
+ found |= true;
+ }
+ }
+
+ return found;
+}
+
+QString FeedsProxyModel::searchFilter() const
+{
+ return m_searchFilter;
+}
+
+FeedsProxyModel::SortType FeedsProxyModel::sortType() const
+{
+ return m_currentSort;
+}
+
+void FeedsProxyModel::setSearchFilter(const QString &searchString)
+{
+ if (searchString != m_searchFilter) {
+ beginResetModel();
+ m_searchFilter = searchString;
+ endResetModel();
+
+ Q_EMIT searchFilterChanged();
+ }
+}
+
+void FeedsProxyModel::setSortType(SortType type)
+{
+ if (type != m_currentSort) {
+ m_currentSort = type;
+
+ // HACK: get the list re-sorted with a custom lessThan implementation
+ sort(-1);
+ sort(0);
+
+ Q_EMIT sortTypeChanged();
+ }
+}
+
+QString FeedsProxyModel::getSortName(SortType type) const
+{
+ switch (type) {
+ case SortType::UnreadDescending:
+ return i18nc("@label:chooser Sort podcasts by decreasing number of unplayed episodes", "Unplayed count: descending");
+ case SortType::UnreadAscending:
+ return i18nc("@label:chooser Sort podcasts by increasing number of unplayed episodes", "Unplayed count: ascending");
+ case SortType::NewDescending:
+ return i18nc("@label:chooser Sort podcasts by decreasing number of new episodes", "New count: descending");
+ case SortType::NewAscending:
+ return i18nc("@label:chooser Sort podcasts by increasing number of new episodes", "New count: ascending");
+ case SortType::FavoriteDescending:
+ return i18nc("@label:chooser Sort podcasts by decreasing number of favorites", "Favorite count: descending");
+ case SortType::FavoriteAscending:
+ return i18nc("@label:chooser Sort podcasts by increasing number of favorites", "Favorite count: ascending");
+ case SortType::TitleAscending:
+ return i18nc("@label:chooser Sort podcasts titles alphabetically", "Podcast title: A → Z");
+ case SortType::TitleDescending:
+ return i18nc("@label:chooser Sort podcasts titles in reverse alphabetical order", "Podcast title: Z → A");
+ default:
+ return QString();
+ }
+}
+
+QString FeedsProxyModel::getSortIconName(SortType type) const
+{
+ switch (type) {
+ case SortType::UnreadDescending:
+ case SortType::NewDescending:
+ case SortType::FavoriteDescending:
+ return QStringLiteral("view-sort-descending");
+ case SortType::UnreadAscending:
+ case SortType::NewAscending:
+ case SortType::FavoriteAscending:
+ return QStringLiteral("view-sort-ascending");
+ case SortType::TitleDescending:
+ return QStringLiteral("view-sort-descending-name");
+ case SortType::TitleAscending:
+ return QStringLiteral("view-sort-ascending-name");
+ default:
+ return QString();
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/feedsproxymodel.h
^
|
@@ -7,7 +7,9 @@
#pragma once
#include <QItemSelection>
+#include <QModelIndex>
#include <QSortFilterProxyModel>
+#include <QString>
#include "models/feedsmodel.h"
@@ -18,12 +20,46 @@
Q_OBJECT
public:
+ enum SortType {
+ UnreadDescending,
+ UnreadAscending,
+ NewDescending,
+ NewAscending,
+ FavoriteDescending,
+ FavoriteAscending,
+ TitleAscending,
+ TitleDescending,
+ };
+ Q_ENUM(SortType)
+
+ Q_PROPERTY(QString searchFilter READ searchFilter WRITE setSearchFilter NOTIFY searchFilterChanged)
+ Q_PROPERTY(SortType sortType READ sortType WRITE setSortType NOTIFY sortTypeChanged)
+
explicit FeedsProxyModel(QObject *parent = nullptr);
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;
+ bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
+
+ QString searchFilter() const;
+ SortType sortType() const;
+
+ void setSearchFilter(const QString &searchString);
+ void setSortType(SortType type);
+
+ Q_INVOKABLE QString getSortName(SortType type) const;
+ Q_INVOKABLE QString getSortIconName(SortType type) const;
Q_INVOKABLE QItemSelection createSelection(int rowa, int rowb);
+Q_SIGNALS:
+ void searchFilterChanged();
+ void sortTypeChanged();
+
private:
FeedsModel *m_feedsModel;
+
+ QString m_searchFilter;
+ SortType m_currentSort = SortType::UnreadDescending;
};
+
+Q_DECLARE_METATYPE(FeedsProxyModel::SortType)
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/queuemodel.cpp
^
|
@@ -39,6 +39,11 @@
Q_EMIT timeLeftChanged();
qCDebug(kastsQueueModel) << "Removed entry at pos" << pos;
});
+ connect(&DataManager::instance(), &DataManager::queueSorted, this, [this]() {
+ beginResetModel();
+ endResetModel();
+ qCDebug(kastsQueueModel) << "Queue was sorted";
+ });
// Connect positionChanged to make sure that the remaining playing time in
// the queue header is up-to-date
connect(&AudioManager::instance(), &AudioManager::positionChanged, this, [this](qint64 position) {
@@ -91,6 +96,16 @@
return format.formatDuration(timeLeft() / rate);
}
+QString QueueModel::getSortName(AbstractEpisodeProxyModel::SortType type)
+{
+ return AbstractEpisodeProxyModel::getSortName(type);
+}
+
+QString QueueModel::getSortIconName(AbstractEpisodeProxyModel::SortType type)
+{
+ return AbstractEpisodeProxyModel::getSortIconName(type);
+}
+
void QueueModel::updateInternalState()
{
// nothing to do; DataManager already has the updated data.
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/models/queuemodel.h
^
|
@@ -6,7 +6,6 @@
#pragma once
-#include <QHash>
#include <QItemSelection>
#include <QModelIndex>
#include <QObject>
@@ -14,15 +13,16 @@
#include <QVariant>
#include "models/abstractepisodemodel.h"
+#include "models/abstractepisodeproxymodel.h"
class QueueModel : public AbstractEpisodeModel
{
Q_OBJECT
+public:
Q_PROPERTY(int timeLeft READ timeLeft NOTIFY timeLeftChanged)
Q_PROPERTY(QString formattedTimeLeft READ formattedTimeLeft NOTIFY timeLeftChanged)
-public:
static QueueModel &instance()
{
static QueueModel _instance;
@@ -35,6 +35,9 @@
int timeLeft() const;
QString formattedTimeLeft() const;
+ Q_INVOKABLE static QString getSortName(AbstractEpisodeProxyModel::SortType type);
+ Q_INVOKABLE static QString getSortIconName(AbstractEpisodeProxyModel::SortType type);
+
Q_INVOKABLE QItemSelection createSelection(int rowa, int rowb);
public Q_SLOTS:
|
[-]
[+]
|
Added |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/networkconnectionmanager.cpp
^
|
@@ -0,0 +1,130 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Bart De Vries <bart@mogwai.be>
+ *
+ * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+ */
+
+#include "networkconnectionmanager.h"
+#include "networkconnectionmanagerlogging.h"
+
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+#include <QNetworkInformation>
+#endif
+
+#include "settingsmanager.h"
+
+NetworkConnectionManager::NetworkConnectionManager(QObject *parent)
+ : QObject(parent)
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ , m_networkStatus(SolidExtras::NetworkStatus())
+#endif
+{
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ m_backendAvailable = QNetworkInformation::loadDefaultBackend();
+
+ if (m_backendAvailable) {
+ connect(QNetworkInformation::instance(), &QNetworkInformation::reachabilityChanged, this, [this]() {
+ Q_EMIT feedUpdatesAllowedChanged();
+ Q_EMIT episodeDownloadsAllowedChanged();
+ Q_EMIT imageDownloadsAllowedChanged();
+ Q_EMIT streamingAllowedChanged();
+ });
+ connect(QNetworkInformation::instance(), &QNetworkInformation::isMeteredChanged, this, [this]() {
+ Q_EMIT feedUpdatesAllowedChanged();
+ Q_EMIT episodeDownloadsAllowedChanged();
+ Q_EMIT imageDownloadsAllowedChanged();
+ Q_EMIT streamingAllowedChanged();
+ });
+ }
+#else
+ connect(&m_networkStatus, &SolidExtras::NetworkStatus::connectivityChanged, this, [this]() {
+ Q_EMIT feedUpdatesAllowedChanged();
+ Q_EMIT episodeDownloadsAllowedChanged();
+ Q_EMIT imageDownloadsAllowedChanged();
+ Q_EMIT streamingAllowedChanged();
+ });
+ connect(&m_networkStatus, &SolidExtras::NetworkStatus::meteredChanged, this, [this]() {
+ Q_EMIT feedUpdatesAllowedChanged();
+ Q_EMIT episodeDownloadsAllowedChanged();
+ Q_EMIT imageDownloadsAllowedChanged();
+ Q_EMIT streamingAllowedChanged();
+ });
+#endif
+
+ connect(SettingsManager::self(), &SettingsManager::allowMeteredFeedUpdatesChanged, this, &NetworkConnectionManager::feedUpdatesAllowedChanged);
+ connect(SettingsManager::self(), &SettingsManager::allowMeteredEpisodeDownloadsChanged, this, &NetworkConnectionManager::episodeDownloadsAllowedChanged);
+ connect(SettingsManager::self(), &SettingsManager::allowMeteredImageDownloadsChanged, this, &NetworkConnectionManager::imageDownloadsAllowedChanged);
+ connect(SettingsManager::self(), &SettingsManager::allowMeteredStreamingChanged, this, &NetworkConnectionManager::streamingAllowedChanged);
+}
+
+bool NetworkConnectionManager::feedUpdatesAllowed() const
+{
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ bool allowed = true;
+ if (m_backendAvailable) {
+ allowed = (QNetworkInformation::instance()->reachability() != QNetworkInformation::Reachability::Disconnected
+ && (!QNetworkInformation::instance()->isMetered() || SettingsManager::self()->allowMeteredFeedUpdates()));
+ }
+#else
+ bool allowed = (m_networkStatus.connectivity() != SolidExtras::NetworkStatus::No
+ && (m_networkStatus.metered() != SolidExtras::NetworkStatus::Yes || SettingsManager::self()->allowMeteredFeedUpdates()));
+#endif
+
+ qCDebug(kastsNetworkConnectionManager) << "FeedUpdatesAllowed()" << allowed;
+
+ return allowed;
+}
+
+bool NetworkConnectionManager::episodeDownloadsAllowed() const
+{
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ bool allowed = true;
+ if (m_backendAvailable) {
+ allowed = (QNetworkInformation::instance()->reachability() != QNetworkInformation::Reachability::Disconnected
+ && (!QNetworkInformation::instance()->isMetered() || SettingsManager::self()->allowMeteredEpisodeDownloads()));
+ }
+#else
+ bool allowed = (m_networkStatus.connectivity() != SolidExtras::NetworkStatus::No
+ && (m_networkStatus.metered() != SolidExtras::NetworkStatus::Yes || SettingsManager::self()->allowMeteredEpisodeDownloads()));
+#endif
+
+ qCDebug(kastsNetworkConnectionManager) << "EpisodeDownloadsAllowed()" << allowed;
+
+ return allowed;
+}
+
+bool NetworkConnectionManager::imageDownloadsAllowed() const
+{
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ bool allowed = true;
+ if (m_backendAvailable) {
+ allowed = (QNetworkInformation::instance()->reachability() != QNetworkInformation::Reachability::Disconnected
+ && (!QNetworkInformation::instance()->isMetered() || SettingsManager::self()->allowMeteredImageDownloads()));
+ }
+#else
+ bool allowed = (m_networkStatus.connectivity() != SolidExtras::NetworkStatus::No
+ && (m_networkStatus.metered() != SolidExtras::NetworkStatus::Yes || SettingsManager::self()->allowMeteredImageDownloads()));
+#endif
+
+ qCDebug(kastsNetworkConnectionManager) << "ImageDownloadsAllowed()" << allowed;
+
+ return allowed;
+}
+
+bool NetworkConnectionManager::streamingAllowed() const
+{
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ bool allowed = true;
+ if (m_backendAvailable) {
+ allowed = (QNetworkInformation::instance()->reachability() != QNetworkInformation::Reachability::Disconnected
+ && (!QNetworkInformation::instance()->isMetered() || SettingsManager::self()->allowMeteredStreaming()));
+ }
+#else
+ bool allowed = (m_networkStatus.connectivity() != SolidExtras::NetworkStatus::No
+ && (m_networkStatus.metered() != SolidExtras::NetworkStatus::Yes || SettingsManager::self()->allowMeteredStreaming()));
+#endif
+
+ qCDebug(kastsNetworkConnectionManager) << "StreamingAllowed()" << allowed;
+
+ return allowed;
+}
|
[-]
[+]
|
Added |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/networkconnectionmanager.h
^
|
@@ -0,0 +1,50 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Bart De Vries <bart@mogwai.be>
+ *
+ * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+ */
+
+#pragma once
+
+#include <QObject>
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+#include <solidextras/networkstatus.h>
+#endif
+
+class NetworkConnectionManager : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(bool feedUpdatesAllowed READ feedUpdatesAllowed NOTIFY feedUpdatesAllowedChanged)
+ Q_PROPERTY(bool episodeDownloadsAllowed READ episodeDownloadsAllowed NOTIFY episodeDownloadsAllowedChanged)
+ Q_PROPERTY(bool imageDownloadsAllowed READ imageDownloadsAllowed NOTIFY imageDownloadsAllowedChanged)
+ Q_PROPERTY(bool streamingAllowed READ streamingAllowed NOTIFY streamingAllowedChanged)
+
+public:
+ static NetworkConnectionManager &instance()
+ {
+ static NetworkConnectionManager _instance;
+ return _instance;
+ }
+
+ [[nodiscard]] bool feedUpdatesAllowed() const;
+ [[nodiscard]] bool episodeDownloadsAllowed() const;
+ [[nodiscard]] bool imageDownloadsAllowed() const;
+ [[nodiscard]] bool streamingAllowed() const;
+
+Q_SIGNALS:
+ void feedUpdatesAllowedChanged();
+ void episodeDownloadsAllowedChanged();
+ void imageDownloadsAllowedChanged();
+ void streamingAllowedChanged();
+
+private:
+ NetworkConnectionManager(QObject *parent = nullptr);
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ SolidExtras::NetworkStatus m_networkStatus;
+#else
+ bool m_backendAvailable = false;
+#endif
+};
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/ChapterListDelegate.qml
^
|
@@ -9,7 +9,6 @@
import QtQuick.Layouts 1.14
import org.kde.kirigami 2.14 as Kirigami
-import org.kde.kasts.solidextras 1.0
import org.kde.kmediasession 1.0
import org.kde.kasts 1.0
@@ -21,8 +20,7 @@
property var entry: undefined
property var overlay: undefined
- property bool streamingAllowed: (NetworkStatus.connectivity !== NetworkStatus.No && (SettingsManager.allowMeteredStreaming || NetworkStatus.metered !== NetworkStatus.Yes))
- property bool streamingButtonVisible: entry != undefined && entry.enclosure && (entry.enclosure.status !== Enclosure.Downloaded) && streamingAllowed && (SettingsManager.prioritizeStreaming || AudioManager.entry === entry)
+ property bool streamingButtonVisible: entry != undefined && entry.enclosure && (entry.enclosure.status !== Enclosure.Downloaded) && NetworkConnectionManager.streamingAllowed && (SettingsManager.prioritizeStreaming || AudioManager.entry === entry)
text: model.title
subtitle: model.formattedStart
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/ConnectionCheckAction.qml
^
|
@@ -9,7 +9,6 @@
import QtQuick.Layouts 1.14
import org.kde.kirigami 2.19 as Kirigami
-import org.kde.kasts.solidextras 1.0
import org.kde.kasts 1.0
@@ -19,7 +18,7 @@
closePolicy: Kirigami.Dialog.CloseOnEscape | Kirigami.Dialog.CloseOnPressOutside
property string headingText: i18n("Podcast updates are currently not allowed on metered connections")
- property bool condition: SettingsManager.allowMeteredFeedUpdates
+ property bool condition: NetworkConnectionManager.feedUpdatesAllowed
// Function to be overloaded where this is instantiated with another purpose
// than refreshing all feeds
@@ -45,7 +44,7 @@
// this is the function that should be called if the action should be
// triggered conditionally (on the basis that the condition is passed)
function run() {
- if (NetworkStatus.metered !== NetworkStatus.Yes || condition) {
+ if (condition) {
action();
} else {
overlay.open();
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/Desktop/DesktopPlayerControls.qml
^
|
@@ -116,7 +116,7 @@
Controls.ToolTip.visible: hovered
Controls.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
- Controls.ToolTip.text: i18n("Seek Backward")
+ Controls.ToolTip.text: i18n("Seek backward")
}
Controls.ToolButton {
id: playButton
@@ -135,7 +135,7 @@
Controls.ToolTip.visible: hovered
Controls.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
- Controls.ToolTip.text: i18n("Seek Forward")
+ Controls.ToolTip.text: i18n("Seek forward")
}
Controls.ToolButton {
icon.name: "media-skip-forward"
@@ -144,7 +144,7 @@
Controls.ToolTip.visible: hovered
Controls.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
- Controls.ToolTip.text: i18n("Skip Forward")
+ Controls.ToolTip.text: i18n("Skip forward")
}
Controls.ToolButton {
id: playbackRateButton
@@ -169,7 +169,7 @@
Controls.ToolTip.visible: hovered
Controls.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
- Controls.ToolTip.text: i18n("Playback Rate: ") + AudioManager.playbackRate.toFixed(2) + "x"
+ Controls.ToolTip.text: i18n("Playback rate:") + " " + AudioManager.playbackRate.toFixed(2) + "x"
}
}
@@ -228,7 +228,7 @@
Controls.ToolTip {
visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
- text: i18nc("@action:button", "Show Chapter List")
+ text: i18nc("@action:button", "Show chapter list")
}
}
@@ -240,7 +240,7 @@
Controls.ToolTip {
visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
- text: i18nc("@action:button", "Show Episode Info")
+ text: i18nc("@action:button", "Show episode info")
}
}
@@ -252,7 +252,7 @@
Controls.ToolTip {
visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
- text: i18nc("@action:button", "Open Sleep Timer Settings")
+ text: i18nc("@action:button", "Open sleep timer settings")
}
}
}
@@ -267,7 +267,7 @@
Controls.ToolTip {
visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
- text: i18nc("@action:button", "Open Volume Settings")
+ text: i18nc("@action:button", "Open volume settings")
}
onClicked: {
if (volumePopup.visible) {
@@ -311,7 +311,7 @@
Controls.ToolTip {
visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
- text: i18nc("@action:button", "Toggle Mute")
+ text: i18nc("@action:button", "Toggle mute")
}
}
}
@@ -328,7 +328,7 @@
Controls.ToolTip {
visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
- text: i18nc("@action:button", "Show More")
+ text: i18nc("@action:button", "Show more")
}
onClicked: {
if (overflowMenu.visible) {
@@ -435,7 +435,7 @@
Controls.Label {
id: text
- text: AudioManager.entry ? AudioManager.entry.adjustedContent(width, font.pixelSize) : i18n("No Track Loaded")
+ text: AudioManager.entry ? AudioManager.entry.adjustedContent(width, font.pixelSize) : i18n("No track loaded")
verticalAlignment: Text.AlignTop
baseUrl: AudioManager.entry ? AudioManager.entry.baseUrl : ""
textFormat: Text.RichText
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/DownloadListPage.qml
^
|
@@ -26,13 +26,22 @@
}
}
- actions.main: Kirigami.Action {
- icon.name: "view-refresh"
- text: i18n("Refresh All Podcasts")
- onTriggered: refreshing = true
+ property list<Kirigami.Action> pageActions: [
+ Kirigami.Action {
+ icon.name: "view-refresh"
+ text: i18n("Refresh All Podcasts")
+ onTriggered: refreshing = true
+ }
+ ]
+
+ Component.onCompleted: {
+ for (var i in episodeList.defaultActionList) {
+ pageActions.push(episodeList.defaultActionList[i]);
+ }
}
- contextualActions: episodeList.defaultActionList
+ // TODO: KF6 replace contextualActions with actions
+ contextualActions: pageActions
GenericEntryListView {
id: episodeList
@@ -45,7 +54,7 @@
width: Kirigami.Units.gridUnit * 20
anchors.centerIn: parent
- text: i18n("No Downloads")
+ text: i18n("No downloads")
}
model: DownloadModel
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/EntryPage.qml
^
|
@@ -19,7 +19,7 @@
property QtObject entry
- title: i18n("Episode Details")
+ title: i18nc("@title", "Episode Details")
padding: 0 // needed to get the inline header to fill the page
@@ -109,7 +109,7 @@
actions: [
Kirigami.Action {
- text: i18n("Open in Browser")
+ text: i18nc("@action:intoolbar Button to open an episode URL in browser", "Open in Browser")
visible: !entry.enclosure
icon.name: "globe"
onTriggered: {
@@ -117,7 +117,7 @@
}
},
Kirigami.Action {
- text: i18n("Download")
+ text: i18nc("@action:intoolbar Button to start episode download", "Download")
visible: entry.enclosure && (entry.enclosure.status === Enclosure.Downloadable || entry.enclosure.status === Enclosure.PartiallyDownloaded)
icon.name: "download"
onTriggered: {
@@ -126,7 +126,7 @@
}
},
Kirigami.Action {
- text: i18n("Cancel Download")
+ text: i18nc("@action:intoolbar Button to cancel ongoing download of episode", "Cancel Download")
visible: entry.enclosure && entry.enclosure.status === Enclosure.Downloading
icon.name: "edit-delete-remove"
onTriggered: {
@@ -134,15 +134,7 @@
}
},
Kirigami.Action {
- text: i18n("Delete Download")
- visible: entry.enclosure && entry.enclosure.status === Enclosure.Downloaded && !entry.queueStatus
- icon.name: "delete"
- onTriggered: {
- entry.enclosure.deleteFile();
- }
- },
- Kirigami.Action {
- text: i18n("Pause")
+ text: i18nc("@action:intoolbar Button to pause the playback of the episode", "Pause")
visible: entry.enclosure && entry.queueStatus && (AudioManager.entry === entry && AudioManager.playbackState === KMediaSession.PlayingState)
icon.name: "media-playback-pause"
onTriggered: {
@@ -150,7 +142,7 @@
}
},
Kirigami.Action {
- text: i18n("Play")
+ text: i18nc("@action:intoolbar Button to start playback of the episode", "Play")
visible: entry.enclosure && entry.enclosure.status === Enclosure.Downloaded && entry.queueStatus && (AudioManager.entry !== entry || AudioManager.playbackState !== KMediaSession.PlayingState)
icon.name: "media-playback-start"
onTriggered: {
@@ -159,8 +151,8 @@
}
},
Kirigami.Action {
- text: i18nc("Action to start playback by streaming the episode rather than downloading it first", "Stream")
- visible: entry.enclosure && entry.enclosure.status !== Enclosure.Downloaded && (AudioManager.entry !== entry || AudioManager.playbackState !== KMediaSession.PlayingState)
+ text: i18nc("@action:intoolbar Action to start playback by streaming the episode rather than downloading it first", "Stream")
+ visible: entry.enclosure && entry.enclosure.status !== Enclosure.Downloaded && NetworkConnectionManager.streamingAllowed && (AudioManager.entry !== entry || AudioManager.playbackState !== KMediaSession.PlayingState)
icon.name: "media-playback-cloud"
onTriggered: {
if (!entry.queueStatus) {
@@ -171,7 +163,7 @@
}
},
Kirigami.Action {
- text: !entry.queueStatus ? i18n("Add to Queue") : i18n("Remove from Queue")
+ text: !entry.queueStatus ? i18nc("@action:intoolbar Button to add an episode to the play queue", "Add to Queue") : i18nc("@action:intoolbar Button to remove an episode from the play queue", "Remove from Queue")
icon.name: !entry.queueStatus ? "media-playlist-append" : "list-remove"
visible: entry.enclosure || entry.queueStatus
onTriggered: {
@@ -187,33 +179,43 @@
}
},
Kirigami.Action {
- text: i18n("Delete Download")
+ text: i18nc("@action:intoolbar Button to remove the downloaded episode audio file", "Delete Download")
icon.name: "delete"
- onTriggered: entry.enclosure.deleteFile();
- visible: entry.enclosure && ((entry.enclosure.status === Enclosure.Downloaded && entry.queueStatus) || entry.enclosure.status === Enclosure.PartiallyDownloaded)
+ visible: entry.enclosure && (entry.enclosure.status === Enclosure.Downloaded || entry.enclosure.status === Enclosure.PartiallyDownloaded)
+ onTriggered: {
+ entry.enclosure.deleteFile();
+ }
},
Kirigami.Action {
- text: i18n("Reset Play Position")
+ text: i18nc("@action:intoolbar Button to reset the play position of an episode to the start", "Reset Play Position")
visible: entry.enclosure && entry.enclosure.playPosition > 1000
onTriggered: entry.enclosure.playPosition = 0
displayHint: Kirigami.DisplayHint.AlwaysHide
},
Kirigami.Action {
- text: entry.read ? i18n("Mark as Unplayed") : i18n("Mark as Played")
+ text: entry.read ? i18nc("@action:intoolbar Button to mark eposide as not played", "Mark as Unplayed") : i18nc("@action:intoolbar Button to mark episode as played", "Mark as Played")
displayHint: Kirigami.DisplayHint.AlwaysHide
onTriggered: {
entry.read = !entry.read
}
},
Kirigami.Action {
- text: entry.new ? i18n("Remove \"New\" Label") : i18n("Label as \"New\"")
+ text: entry.new ? i18nc("@action:intoolbar", "Remove \"New\" Label") : i18nc("@action:intoolbar", "Label as \"New\"")
displayHint: Kirigami.DisplayHint.AlwaysHide
onTriggered: {
entry.new = !entry.new
}
},
Kirigami.Action {
- text: i18n("Open Podcast")
+ text: entry.favorite ? i18nc("@action:intoolbar Button to remove the \"favorite\" property of a podcast episode", "Remove from Favorites") : i18nc("@action:intoolbar Button to add a podcast episode as favorite", "Add to Favorites")
+ icon.name: !entry.favorite ? "starred-symbolic" : "non-starred-symbolic"
+ displayHint: Kirigami.DisplayHint.AlwaysHide
+ onTriggered: {
+ entry.favorite = !entry.favorite
+ }
+ },
+ Kirigami.Action {
+ text: i18nc("@action:intoolbar Button to open the podcast URL in browser", "Open Podcast")
displayHint: Kirigami.DisplayHint.AlwaysHide
onTriggered: page.openPodcast()
}
@@ -283,13 +285,13 @@
Layout.bottomMargin: Kirigami.Units.gridUnit
visible: entry.hasEnclosure
- text: i18n("Copy Episode Download URL")
+ text: i18nc("@action:button", "Copy Episode Download URL")
height: enclosureUrl.height
width: enclosureUrl.height
icon.name: "edit-copy"
onClicked: {
- applicationWindow().showPassiveNotification(i18n("Link copied"));
+ applicationWindow().showPassiveNotification(i18nc("@info:status", "Link Copied"));
enclosureUrl.selectAll();
enclosureUrl.copy();
enclosureUrl.deselect();
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/EpisodeListPage.qml
^
|
@@ -35,37 +35,36 @@
}
}
- actions {
- main: Kirigami.Action {
+ property list<Kirigami.Action> pageActions: [
+ Kirigami.Action {
icon.name: "download"
text: i18n("Downloads")
onTriggered: {
pushPage("DownloadListPage")
}
- }
-
- left: Kirigami.Action {
+ },
+ Kirigami.Action {
+ icon.name: "view-refresh"
+ text: i18n("Refresh All Podcasts")
+ onTriggered: refreshing = true
+ visible: episodeProxyModel.filterType == AbstractEpisodeProxyModel.NoFilter
+ },
+ Kirigami.Action {
id: searchActionButton
icon.name: "search"
- text: i18nc("@action:intoolbar", "Search and Filter")
+ text: i18nc("@action:intoolbar", "Search")
checkable: true
- onToggled: {
- if (!checked) {
- episodeProxyModel.filterType = AbstractEpisodeProxyModel.NoFilter;
- episodeProxyModel.searchFilter = "";
- }
- }
}
+ ]
- right: Kirigami.Action {
- icon.name: "view-refresh"
- text: i18n("Refresh All Podcasts")
- onTriggered: refreshing = true
- visible: episodeProxyModel.filterType == AbstractEpisodeProxyModel.NoFilter
+ Component.onCompleted: {
+ for (var i in episodeList.defaultActionList) {
+ pageActions.push(episodeList.defaultActionList[i]);
}
}
- contextualActions: episodeList.defaultActionList
+ // TODO: KF6 replace contextualActions with actions
+ contextualActions: pageActions
header: Loader {
anchors.right: parent.right
@@ -73,7 +72,7 @@
active: searchActionButton.checked
visible: active
- sourceComponent: SearchFilterBar {
+ sourceComponent: SearchBar {
proxyModel: episodeProxyModel
parentKey: searchActionButton
}
@@ -90,7 +89,7 @@
width: Kirigami.Units.gridUnit * 20
anchors.centerIn: parent
- text: i18n("No Episodes Available")
+ text: i18n("No episodes available")
}
model: EpisodeProxyModel {
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/ErrorList.qml
^
|
@@ -27,7 +27,7 @@
visible: errorList.count == 0
anchors.centerIn: parent
- text: i18n("No Errors Logged")
+ text: i18n("No errors logged")
}
Component {
@@ -63,7 +63,7 @@
opacity: 1
}
Controls.Label {
- text: i18n("Error Code: ") + error.code + (error.message ? " · " + error.message : "")
+ text: i18n("Error code:") + " " + error.code + (error.message ? " · " + error.message : "")
Layout.fillWidth: true
elide: Text.ElideRight
font: Kirigami.Theme.smallFont
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/FeedDetailsPage.qml
^
|
@@ -65,19 +65,14 @@
}
}
- actions.main: Kirigami.Action {
+ // TODO: KF6 replace contextualActions with actions
+ contextualActions: Kirigami.Action {
id: searchActionButton
icon.name: "search"
- text: i18nc("@action:intoolbar", "Search and Filter")
+ text: i18nc("@action:intoolbar", "Search")
checkable: true
enabled: page.feed.entries ? true : false
visible: enabled
- onToggled: {
- if (!checked && page.feed.entries) {
- page.feed.entries.filterType = AbstractEpisodeProxyModel.NoFilter;
- page.feed.entries.searchFilter = "";
- }
- }
}
header: Loader {
@@ -87,7 +82,7 @@
active: searchActionButton.checked
visible: active
- sourceComponent: SearchFilterBar {
+ sourceComponent: SearchBar {
proxyModel: page.feed.entries ? page.feed.entries : emptyListModel
parentKey: searchActionButton
}
@@ -328,7 +323,7 @@
readOnly: true
selectByMouse: !Kirigami.Settings.isMobile
textFormat:TextEdit.RichText
- text: isSubscribed ? i18n("Last Updated: %1", feed.lastUpdated.toLocaleString(Qt.locale(), Locale.ShortFormat)) : ""
+ text: isSubscribed ? i18n("Last updated: %1", feed.lastUpdated.toLocaleString(Qt.locale(), Locale.ShortFormat)) : ""
wrapMode: Text.WordWrap
color: Kirigami.Theme.textColor
}
@@ -363,7 +358,7 @@
width: Kirigami.Units.gridUnit * 20
- text: feed.errorId === 0 ? i18n("No Episodes Available") : i18n("Error (%1): %2", feed.errorId, feed.errorString)
+ text: feed.errorId === 0 ? i18n("No episodes available") : i18n("Error (%1): %2", feed.errorId, feed.errorString)
icon.name: feed.errorId === 0 ? "" : "data-error"
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/FeedListDelegate.qml
^
|
@@ -18,6 +18,7 @@
Controls.ItemDelegate {
id: feedDelegate
+ property var countProperty: (kastsMainWindow.feedSorting === FeedsProxyModel.UnreadDescending || kastsMainWindow.feedSorting === FeedsProxyModel.UnreadAscending) ? feed.unreadEntryCount : ((kastsMainWindow.feedSorting === FeedsProxyModel.NewDescending || kastsMainWindow.feedSorting === FeedsProxyModel.NewAscending) ? feed.newEntryCount : ((kastsMainWindow.feedSorting === FeedsProxyModel.FavoriteDescending || kastsMainWindow.feedSorting === FeedsProxyModel.FavoriteAscending) ? feed.favoriteEntryCount : 0))
property int cardSize: 0
property int cardMargin: 0
property int borderWidth: 1
@@ -170,7 +171,7 @@
Rectangle {
id: countRectangle
- visible: feed.unreadEntryCount > 0
+ visible: countProperty > 0
anchors.top: img.top
anchors.right: img.right
width: actionsButton.width
@@ -181,10 +182,10 @@
Controls.Label {
id: countLabel
- visible: feed.unreadEntryCount > 0
+ visible: countProperty > 0
anchors.centerIn: countRectangle
anchors.margins: Kirigami.Units.smallSpacing
- text: feed.unreadEntryCount
+ text: countProperty
font.bold: true
color: Kirigami.Theme.highlightedTextColor
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/FeedListPage.qml
^
|
@@ -17,7 +17,7 @@
Kirigami.ScrollablePage {
id: subscriptionPage
- title: i18n("Subscriptions")
+ title: i18nc("@title Podcast subscription list page title", "Subscriptions")
LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
LayoutMirroring.childrenInherit: true
@@ -35,36 +35,93 @@
}
}
- actions.main: Kirigami.Action {
- visible: Kirigami.Settings.isMobile
- text: i18n("Discover")
- icon.name: "search"
- onTriggered: {
- applicationWindow().pageStack.push("qrc:/DiscoverPage.qml");
- }
- }
-
- contextualActions: [
+ property list<Kirigami.Action> pageActions: [
+ Kirigami.Action {
+ visible: Kirigami.Settings.isMobile
+ text: i18nc("@action:intoolbar Open the podcast discover page", "Discover")
+ icon.name: "search"
+ onTriggered: {
+ applicationWindow().pageStack.push("qrc:/DiscoverPage.qml");
+ }
+ },
Kirigami.Action {
- text: i18n("Refresh All Podcasts")
+ text: i18nc("@action:intoolbar", "Refresh All Podcasts")
icon.name: "view-refresh"
onTriggered: refreshing = true
},
Kirigami.Action {
- text: i18n("Add Podcast")
+ id: addAction
+ text: i18nc("@action:intoolbar", "Add Podcast…")
icon.name: "list-add"
onTriggered: {
addSheet.open()
}
},
Kirigami.Action {
- text: i18n("Import Podcasts...")
+ id: sortActionRoot
+ icon.name: "view-sort"
+ text: i18nc("@action:intoolbar Open menu with options to sort subscriptions", "Sort")
+
+ tooltip: i18nc("@info:tooltip", "Select how to sort subscriptions")
+
+ property Controls.ActionGroup sortGroup: Controls.ActionGroup { }
+
+ property Instantiator repeater: Instantiator {
+ model: ListModel {
+ id: sortModel
+ // have to use script because i18n doesn't work within ListElement
+ Component.onCompleted: {
+ if (sortActionRoot.visible) {
+ var sortList = [FeedsProxyModel.UnreadDescending,
+ FeedsProxyModel.UnreadAscending,
+ FeedsProxyModel.NewDescending,
+ FeedsProxyModel.NewAscending,
+ FeedsProxyModel.FavoriteDescending,
+ FeedsProxyModel.FavoriteAscending,
+ FeedsProxyModel.TitleAscending,
+ FeedsProxyModel.TitleDescending]
+ for (var i in sortList) {
+ sortModel.append({"name": feedsModel.getSortName(sortList[i]),
+ "iconName": feedsModel.getSortIconName(sortList[i]),
+ "sortType": sortList[i]});
+ }
+ }
+ }
+ }
+
+ Kirigami.Action {
+ visible: sortActionRoot.visible
+ icon.name: model.iconName
+ text: model.name
+ checkable: true
+ checked: kastsMainWindow.feedSorting === model.sortType
+ Controls.ActionGroup.group: sortActionRoot.sortGroup
+
+ onTriggered: {
+ kastsMainWindow.feedSorting = model.sortType;
+ }
+ }
+
+ onObjectAdded: (index, object) => {
+ sortActionRoot.children.push(object);
+ }
+ }
+ },
+ Kirigami.Action {
+ id: searchActionButton
+ icon.name: "search"
+ text: i18nc("@action:intoolbar", "Search")
+ checkable: true
+ },
+ Kirigami.Action {
+ id: importAction
+ text: i18nc("@action:intoolbar", "Import Podcasts…")
icon.name: "document-import"
displayHint: Kirigami.DisplayHint.AlwaysHide
onTriggered: importDialog.open()
},
Kirigami.Action {
- text: i18n("Export Podcasts...")
+ text: i18nc("@action:intoolbar", "Export Podcasts…")
icon.name: "document-export"
displayHint: Kirigami.DisplayHint.AlwaysHide
onTriggered: exportDialog.open()
@@ -75,36 +132,43 @@
// defined above
Component.onCompleted: {
for (var i in feedList.contextualActionList) {
- contextualActions.push(feedList.contextualActionList[i]);
+ pageActions.push(feedList.contextualActionList[i]);
}
}
- AddFeedSheet {
- id: addSheet
- }
+ // TODO: KF6 replace contextualActions with actions
+ contextualActions: pageActions
- Kirigami.PlaceholderMessage {
- visible: feedList.count === 0
-
- width: Kirigami.Units.gridUnit * 20
- anchors.centerIn: parent
+ header: Loader {
+ anchors.right: parent.right
+ anchors.left: parent.left
+
+ active: searchActionButton.checked
+ visible: active
+ sourceComponent: SearchBar {
+ proxyModel: feedsModel
+ parentKey: searchActionButton
+ showSearchFilters: false
+ }
+ }
- text: i18n("No Podcasts Added Yet")
+ AddFeedSheet {
+ id: addSheet
}
FileDialog {
id: importDialog
- title: i18n("Import Podcasts")
+ title: i18nc("@title:window", "Import Podcasts")
folder: StandardPaths.writableLocation(StandardPaths.HomeLocation)
- nameFilters: [i18n("All Files (*)"), i18n("XML Files (*.xml)"), i18n("OPML Files (*.opml)")]
+ nameFilters: [i18nc("@label:listbox File filter option in file dialog", "OPML Files (*.opml)"), i18nc("@label:listbox File filter option in file dialog", "XML Files (*.xml)"), i18nc("@label:listbox File filter option in file dialog", "All Files (*)")]
onAccepted: DataManager.importFeeds(file)
}
FileDialog {
id: exportDialog
- title: i18n("Export Podcasts")
+ title: i18nc("@title:window", "Export Podcasts")
folder: StandardPaths.writableLocation(StandardPaths.HomeLocation)
- nameFilters: [i18n("All Files")]
+ nameFilters: [i18nc("@label:listbox File filter option in file dialog", "OPML Files (*.opml)"), i18nc("@label:listbox File filter option in file dialog", "All Files (*)")]
onAccepted: DataManager.exportFeeds(file)
fileMode: FileDialog.SaveFile
}
@@ -112,9 +176,71 @@
GridView {
id: feedList
currentIndex: -1
- visible: count !== 0
clip: true
+ Kirigami.PlaceholderMessage {
+ id: placeholderMessage
+ visible: feedList.count === 0
+ width: Kirigami.Units.gridUnit * 20
+ anchors.centerIn: parent
+ type: feedsModel.searchFilter === "" ? Kirigami.PlaceholderMessage.Actionable : Kirigami.PlaceholderMessage.Informational
+ text: feedsModel.searchFilter === "" ? i18nc("@info Placeholder message for empty podcast list", "No podcasts added yet") : i18nc("@info Placeholder message for podcast list when no podcast matches the search criteria", "No podcasts found")
+ explanation: feedsModel.searchFilter === "" ? i18nc("@info:tipoftheday", "Get started by adding podcasts:") : null
+
+ readonly property int buttonSize: Math.max(discoverButton.implicitWidth, addButton.implicitWidth, importButton.implicitWidth, syncButton.implicitWidth)
+
+ // These actions are also in the toolbar, but duplicating some here
+ // to give them more descriptive names
+ Controls.Button {
+ id: discoverButton
+ visible: feedsModel.searchFilter === ""
+ Layout.preferredWidth: placeholderMessage.buttonSize
+ Layout.alignment: Qt.AlignHCenter
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/FilterInlineMessage.qml
^
|
@@ -38,6 +38,6 @@
TextMetrics {
id: textMetrics
- text: i18nc("@info:status Name of the filter which is active on the ListView", "Filter Active: %1", proxyModel.filterName)
+ text: i18nc("@info:status Name of the filter which is active on the ListView", "Active filter: %1", proxyModel.filterName)
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/FullScreenImage.qml
^
|
@@ -1,5 +1,4 @@
/**
- * SPDX-FileCopyrightText: 2019 Black Hat <bhat@encom.eu.org>
* SPDX-FileCopyrightText: 2023 Bart De Vries <bart@mogwai.be>
*
* SPDX-License-Identifier: GPL-3.0-only
@@ -10,198 +9,28 @@
import QtQuick.Layouts 1.14
import org.kde.kirigami 2.19 as Kirigami
+import org.kde.kirigamiaddons.labs.components 1.0 as Addons
-Controls.Popup {
+Addons.AlbumMaximizeComponent {
id: root
required property var image
required property QtObject loader
property string description: undefined
- property int imageWidth: -1
- property int imageHeight: -1
-
- width: parent.width
- height: parent.height
-
- parent: Controls.Overlay.overlay
- closePolicy: Controls.Popup.CloseOnEscape
- modal: true
- padding: 0
- background: null
-
- ColumnLayout {
- anchors.fill: parent
- spacing: Kirigami.Units.largeSpacing
-
- Controls.Control {
- Layout.fillWidth: true
-
- contentItem: RowLayout {
- spacing: Kirigami.Units.largeSpacing
-
- Kirigami.ActionToolBar {
- Layout.fillWidth: true
- alignment: Qt.AlignRight
- actions: [
- Kirigami.Action {
- text: i18n("Zoom in")
- icon.name: "zoom-in"
- displayHint: Kirigami.DisplayHint.IconOnly
- onTriggered: {
- imageItem.scaleFactor = imageItem.scaleFactor + 0.25
- if (imageItem.scaleFactor > 3) {
- imageItem.scaleFactor = 3
- }
- }
- },
- Kirigami.Action {
- text: i18n("Zoom out")
- icon.name: "zoom-out"
- displayHint: Kirigami.DisplayHint.IconOnly
- onTriggered: {
- imageItem.scaleFactor = imageItem.scaleFactor - 0.25
- if (imageItem.scaleFactor < 0.25) {
- imageItem.scaleFactor = 0.25
- }
- }
- },
- Kirigami.Action {
- text: i18n("Rotate left")
- icon.name: "image-rotate-left-symbolic"
- displayHint: Kirigami.DisplayHint.IconOnly
- onTriggered: imageItem.rotationAngle = imageItem.rotationAngle - 90
-
- },
- Kirigami.Action {
- text: i18n("Rotate right")
- icon.name: "image-rotate-right-symbolic"
- displayHint: Kirigami.DisplayHint.IconOnly
- onTriggered: imageItem.rotationAngle = imageItem.rotationAngle + 90
-
- },
- Kirigami.Action {
- text: i18n("Close")
- icon.name: "dialog-close"
- displayHint: Kirigami.DisplayHint.IconOnly
- onTriggered: root.close()
- }
- ]
- }
- }
-
- background: Rectangle {
- color: Kirigami.Theme.alternateBackgroundColor
- }
-
- Kirigami.Separator {
- anchors {
- left: parent.left
- right: parent.right
- bottom: parent.bottom
- }
- height: 1
- }
- }
-
- Item {
- id: imageContainer
- Layout.fillWidth: true
- Layout.fillHeight: true
- clip: true
- focus: true
-
- MouseArea {
- anchors.fill: parent
- onClicked: root.close()
- }
-
- AnimatedImage {
- id: imageItem
-
- property var scaleFactor: 1
- property int rotationAngle: 0
- property var rotationInsensitiveWidth: Math.min(root.imageWidth > 0 ? root.imageWidth : sourceSize.width, imageContainer.width - Kirigami.Units.largeSpacing * 2)
- property var rotationInsensitiveHeight: Math.min(root.imageHeight > 0 ? root.imageHeight : sourceSize.height, imageContainer.height - Kirigami.Units.largeSpacing * 2)
-
- anchors.centerIn: parent
- width: rotationAngle % 180 === 0 ? rotationInsensitiveWidth : rotationInsensitiveHeight
- height: rotationAngle % 180 === 0 ? rotationInsensitiveHeight : rotationInsensitiveWidth
- fillMode: Image.PreserveAspectFit
- clip: true
- source: root.image
-
- MouseArea {
- anchors.centerIn: parent
- width: parent.paintedWidth
- height: parent.paintedHeight
- }
-
- Behavior on width {
- NumberAnimation {duration: Kirigami.Units.longDuration; easing.type: Easing.InOutCubic}
- }
- Behavior on height {
- NumberAnimation {duration: Kirigami.Units.longDuration; easing.type: Easing.InOutCubic}
- }
-
- transform: [
- Rotation {
- origin.x: imageItem.width / 2
- origin.y: imageItem.height / 2
- angle: imageItem.rotationAngle
-
- Behavior on angle {
- RotationAnimation {duration: Kirigami.Units.longDuration; easing.type: Easing.InOutCubic}
- }
- },
- Scale {
- origin.x: imageItem.width / 2
- origin.y: imageItem.height / 2
- xScale: imageItem.scaleFactor
- yScale: imageItem.scaleFactor
-
- Behavior on xScale {
- NumberAnimation {duration: Kirigami.Units.longDuration; easing.type: Easing.InOutCubic}
- }
- Behavior on yScale {
- NumberAnimation {duration: Kirigami.Units.longDuration; easing.type: Easing.InOutCubic}
- }
- }
- ]
- }
+ property list<Addons.AlbumModelItem> mymodel: [
+ Addons.AlbumModelItem {
+ type: Addons.AlbumModelItem.Image
+ source: image
+ // tempSource: "path/to/tempSource"
+ caption: description
}
+ ]
- Controls.Control {
- Layout.fillWidth: true
- visible: root.description
-
- contentItem: Controls.Label {
- Layout.leftMargin: Kirigami.Units.largeSpacing
- wrapMode: Text.WordWrap
-
- text: root.description
-
- font.weight: Font.Bold
- }
-
- background: Rectangle {
- color: Kirigami.Theme.alternateBackgroundColor
- }
-
- Kirigami.Separator {
- anchors {
- left: parent.left
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/GenericEntryDelegate.qml
^
|
@@ -11,7 +11,6 @@
import QtQml.Models 2.15
import org.kde.kirigami 2.14 as Kirigami
-import org.kde.kasts.solidextras 1.0
import org.kde.kmediasession 1.0
import org.kde.kasts 1.0
@@ -32,15 +31,13 @@
property bool selected: false
property int row: model ? model.row : -1
- property bool streamingAllowed: (NetworkStatus.connectivity !== NetworkStatus.No && SettingsManager.prioritizeStreaming && (SettingsManager.allowMeteredStreaming || NetworkStatus.metered !== NetworkStatus.Yes))
-
property bool showRemoveFromQueueButton: entry ? (!entry.enclosure && entry.queueStatus) : false
- property bool showDownloadButton: entry ? ((!isDownloads || entry.enclosure.status === Enclosure.PartiallyDownloaded) && entry.enclosure && (entry.enclosure.status === Enclosure.Downloadable || entry.enclosure.status === Enclosure.PartiallyDownloaded) && (!streamingAllowed || isDownloads) && !(AudioManager.entry === entry && AudioManager.playbackState === KMediaSession.PlayingState)) : false
+ property bool showDownloadButton: entry ? ((!isDownloads || entry.enclosure.status === Enclosure.PartiallyDownloaded) && entry.enclosure && (entry.enclosure.status === Enclosure.Downloadable || entry.enclosure.status === Enclosure.PartiallyDownloaded) && (!NetworkConnectionManager.streamingAllowed || isDownloads) && !(AudioManager.entry === entry && AudioManager.playbackState === KMediaSession.PlayingState)) : false
property bool showCancelDownloadButton: entry ? (entry.enclosure && entry.enclosure.status === Enclosure.Downloading) : false
property bool showDeleteDownloadButton: entry ? (isDownloads && entry.enclosure && entry.enclosure.status === Enclosure.Downloaded) : false
property bool showAddToQueueButton: entry ? (!isDownloads && !entry.queueStatus && entry.enclosure && entry.enclosure.status === Enclosure.Downloaded) : false
property bool showPlayButton: entry ? (!isDownloads && entry.queueStatus && entry.enclosure && (entry.enclosure.status === Enclosure.Downloaded) && (AudioManager.entry !== entry || AudioManager.playbackState !== KMediaSession.PlayingState)) : false
- property bool showStreamingPlayButton: entry ? (!isDownloads && entry.enclosure && (entry.enclosure.status !== Enclosure.Downloaded && entry.enclosure.status !== Enclosure.Downloading && streamingAllowed) && (AudioManager.entry !== entry || AudioManager.playbackState !== KMediaSession.PlayingState)) : false
+ property bool showStreamingPlayButton: entry ? (!isDownloads && entry.enclosure && (entry.enclosure.status !== Enclosure.Downloaded && entry.enclosure.status !== Enclosure.Downloading && NetworkConnectionManager.streamingAllowed) && (AudioManager.entry !== entry || AudioManager.playbackState !== KMediaSession.PlayingState)) : false
property bool showPauseButton: entry ? (!isDownloads && entry.queueStatus && entry.enclosure && (AudioManager.entry === entry && AudioManager.playbackState === KMediaSession.PlayingState)) : false
@@ -183,13 +180,20 @@
Kirigami.Icon {
Layout.maximumHeight: 0.8 * supertitle.implicitHeight
Layout.maximumWidth: 0.8 * supertitle.implicitHeight
+ source: "starred-symbolic"
+ visible: entry ? (entry.favorite) : false
+ opacity: 0.7
+ }
+ Kirigami.Icon {
+ Layout.maximumHeight: 0.8 * supertitle.implicitHeight
+ Layout.maximumWidth: 0.8 * supertitle.implicitHeight
source: "source-playlist"
visible: entry ? (!isQueue && entry.queueStatus) : false
opacity: 0.7
}
Controls.Label {
id: supertitle
- text: entry ? ((!isQueue && entry.queueStatus ? "· " : "") + entry.updated.toLocaleDateString(Qt.locale(), Locale.NarrowFormat) + (entry.enclosure ? ( entry.enclosure.size !== 0 ? " · " + entry.enclosure.formattedSize : "") : "" )) : ""
+ text: entry ? (((!isQueue && entry.queueStatus) || entry.favorite ? "· " : "") + entry.updated.toLocaleDateString(Qt.locale(), Locale.NarrowFormat) + (entry.enclosure ? ( entry.enclosure.size !== 0 ? " · " + entry.enclosure.formattedSize : "") : "" )) : ""
Layout.fillWidth: true
elide: Text.ElideRight
font: Kirigami.Theme.smallFont
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/GenericEntryListView.qml
^
|
@@ -121,9 +121,113 @@
}
}
+
// For lack of a better place, we put generic entry list actions here so
// they can be re-used across the different ListViews.
- property var selectAllAction: Kirigami.Action {
+
+ readonly property var sortAction: Kirigami.Action {
+ id: sortActionRoot
+ visible: !isDownloads
+ enabled: visible
+ icon.name: "view-sort"
+ text: i18nc("@action:intoolbar Open menu with options to sort episodes", "Sort")
+
+ tooltip: i18nc("@info:tooltip", "Select how to sort episodes")
+
+ property Controls.ActionGroup sortGroup: Controls.ActionGroup { }
+
+ property Instantiator repeater: Instantiator {
+ model: ListModel {
+ id: sortModel
+ // have to use script because i18n doesn't work within ListElement
+ Component.onCompleted: {
+ if (sortActionRoot.visible) {
+ var sortList = [AbstractEpisodeProxyModel.DateDescending,
+ AbstractEpisodeProxyModel.DateAscending]
+ for (var i in sortList) {
+ sortModel.append({"name": listView.model.getSortName(sortList[i]),
+ "iconName": listView.model.getSortIconName(sortList[i]),
+ "sortType": sortList[i]});
+ }
+ }
+ }
+ }
+
+ Kirigami.Action {
+ visible: sortActionRoot.visible
+ icon.name: model.iconName
+ text: model.name
+ checkable: !isQueue
+ checked: !isQueue && (listView.model.sortType === model.sortType)
+ Controls.ActionGroup.group: isQueue ? null : sortActionRoot.sortGroup
+
+ onTriggered: {
+ if (isQueue) {
+ DataManager.sortQueue(model.sortType);
+ } else {
+ listView.model.sortType = model.sortType;
+ }
+ }
+ }
+
+ onObjectAdded: (index, object) => {
+ sortActionRoot.children.push(object);
+ }
+ }
+ }
+
+ readonly property var filterAction: Kirigami.Action {
+ id: filterActionRoot
+ visible: !isDownloads && !isQueue
+ enabled: visible
+ icon.name: "view-filter"
+ text: i18nc("@action:intoolbar Button to open menu to filter episodes based on their status (played, new, etc.)", "Filter")
+
+ tooltip: i18nc("@info:tooltip", "Filter episodes by status")
+
+ property Controls.ActionGroup filterGroup: Controls.ActionGroup { }
+
+
+ property Instantiator repeater: Instantiator {
+ model: ListModel {
+ id: filterModel
+ // have to use script because i18n doesn't work within ListElement
+ Component.onCompleted: {
+ if (filterActionRoot.visible) {
+ var filterList = [AbstractEpisodeProxyModel.NoFilter,
+ AbstractEpisodeProxyModel.ReadFilter,
+ AbstractEpisodeProxyModel.NotReadFilter,
+ AbstractEpisodeProxyModel.NewFilter,
+ AbstractEpisodeProxyModel.NotNewFilter,
+ AbstractEpisodeProxyModel.FavoriteFilter,
+ AbstractEpisodeProxyModel.NotFavoriteFilter]
+ for (var i in filterList) {
+ filterModel.append({"name": listView.model.getFilterName(filterList[i]),
+ "filterType": filterList[i]});
+ }
+ }
+ }
+ }
+
+ Kirigami.Action {
+ visible: filterActionRoot.visible
+ text: model.name
+ checkable: true
+ checked: listView.model.filterType === model.filterType
+ Controls.ActionGroup.group: filterActionRoot.filterGroup
+
+ onTriggered: {
+ listView.model.filterType = model.filterType;
+ }
+ }
+
+ onObjectAdded: (index, object) => {
+ filterActionRoot.children.push(object);
+ }
+ }
+ }
+
+ readonly property var selectAllAction: Kirigami.Action {
icon.name: "edit-select-all"
text: i18n("Select All")
visible: true
@@ -132,7 +236,7 @@
}
}
- property var selectNoneAction: Kirigami.Action {
+ readonly property var selectNoneAction: Kirigami.Action {
icon.name: "edit-select-none"
text: i18n("Deselect All")
visible: listView.selectionModel.hasSelection
@@ -141,7 +245,7 @@
}
}
- property var addToQueueAction: Kirigami.Action {
+ readonly property var addToQueueAction: Kirigami.Action {
text: i18n("Add to Queue")
icon.name: "media-playlist-append"
visible: listView.selectionModel.hasSelection && !listView.isQueue && (singleSelectedEntry ? !singleSelectedEntry.queueStatus : true)
@@ -151,7 +255,7 @@
}
}
- property var removeFromQueueAction: Kirigami.Action {
+ readonly property var removeFromQueueAction: Kirigami.Action {
text: i18n("Remove from Queue")
icon.name: "list-remove"
visible: listView.selectionModel.hasSelection && (singleSelectedEntry ? singleSelectedEntry.queueStatus : true)
@@ -161,7 +265,7 @@
}
}
- property var markPlayedAction: Kirigami.Action {
+ readonly property var markPlayedAction: Kirigami.Action {
text: i18n("Mark as Played")
visible: listView.selectionModel.hasSelection && (singleSelectedEntry ? !singleSelectedEntry.read : true)
onTriggered: {
@@ -169,7 +273,7 @@
}
}
- property var markNotPlayedAction: Kirigami.Action {
+ readonly property var markNotPlayedAction: Kirigami.Action {
text: i18n("Mark as Unplayed")
visible: listView.selectionModel.hasSelection && (singleSelectedEntry ? singleSelectedEntry.read : true)
onTriggered: {
@@ -177,7 +281,7 @@
}
}
- property var markNewAction: Kirigami.Action {
+ readonly property var markNewAction: Kirigami.Action {
text: i18n("Label as \"New\"")
visible: listView.selectionModel.hasSelection && (singleSelectedEntry ? !singleSelectedEntry.new : true)
onTriggered: {
@@ -185,7 +289,7 @@
}
}
- property var markNotNewAction: Kirigami.Action {
+ readonly property var markNotNewAction: Kirigami.Action {
text: i18n("Remove \"New\" Label")
visible: listView.selectionModel.hasSelection && (singleSelectedEntry ? singleSelectedEntry.new : true)
onTriggered: {
@@ -193,7 +297,25 @@
}
}
- property var downloadEnclosureAction: Kirigami.Action {
+ readonly property var markFavoriteAction: Kirigami.Action {
+ text: i18nc("@action:intoolbar Button to add a podcast episode as favorite", "Add to Favorites")
+ icon.name: "starred-symbolic"
+ visible: listView.selectionModel.hasSelection && (singleSelectedEntry ? !singleSelectedEntry.favorite : true)
+ onTriggered: {
+ DataManager.bulkMarkFavoriteByIndex(true, selectionForContextMenu);
+ }
+ }
+
+ readonly property var markNotFavoriteAction: Kirigami.Action {
+ text: i18nc("@action:intoolbar Button to remove the \"favorite\" property of a podcast episode", "Remove from Favorites")
+ icon.name: "non-starred-symbolic"
+ visible: listView.selectionModel.hasSelection && (singleSelectedEntry ? singleSelectedEntry.favorite : true)
+ onTriggered: {
+ DataManager.bulkMarkFavoriteByIndex(false, selectionForContextMenu);
+ }
+ }
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/GlobalSearchField.qml
^
|
@@ -93,7 +93,7 @@
anchors.fill: parent
visible: searchListView.count === 0
- text: i18nc("@info Placeholder text in search box", "No Search Results")
+ text: i18nc("@info Placeholder text in search box", "No search results")
}
Kirigami.Action {
@@ -144,11 +144,11 @@
Repeater {
model: searchSettingsModel
- Controls.CheckBox {
- padding: Kirigami.Units.smallSpacing
+ Controls.MenuItem {
text: model.name
+ checkable: true
checked: model.checked
- onToggled: {
+ onTriggered: {
if (checked) {
proxyModel.searchFlags = proxyModel.searchFlags | model.searchFlag;
} else {
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/ImageWithFallback.qml
^
|
@@ -52,8 +52,8 @@
anchors.fill: parent
source: root.imageSource
fillMode: root.imageFillMode
- sourceSize.width: root.imageResize ? width * Screen.devicePixelRatio : undefined
- sourceSize.height: root.imageResize ? height * Screen.devicePixelRatio : undefined
+ sourceSize.width: root.imageResize ? width * Screen.devicePixelRatio : 0
+ sourceSize.height: root.imageResize ? height * Screen.devicePixelRatio : 0
asynchronous: true
mipmap: root.mipmap
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/Mobile/BottomToolbar.qml
^
|
@@ -49,10 +49,7 @@
text: i18n("Settings")
checked: "SettingsPage" === kastsMainWindow.currentPage
onTriggered: {
- applicationWindow().pageStack.clear()
- applicationWindow().pageStack.push("qrc:/SettingsPage.qml", {}, {
- title: i18n("Settings")
- })
+ pushPage("SettingsPage")
}
}
]
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/Mobile/MobilePlayerControls.qml
^
|
@@ -154,7 +154,7 @@
}
Controls.Label {
- text: AudioManager.entry ? AudioManager.entry.feed.name : i18n("No Podcast Title")
+ text: AudioManager.entry ? AudioManager.entry.feed.name : i18n("No podcast title")
elide: Text.ElideRight
Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: parent.width
@@ -186,7 +186,7 @@
Controls.Label {
id: text
Layout.fillWidth: true
- text: AudioManager.entry ? AudioManager.entry.adjustedContent(width, font.pixelSize) : i18n("No Track Loaded")
+ text: AudioManager.entry ? AudioManager.entry.adjustedContent(width, font.pixelSize) : i18n("No track loaded")
verticalAlignment: Text.AlignTop
baseUrl: AudioManager.entry ? AudioManager.entry.baseUrl : ""
textFormat: Text.RichText
@@ -220,7 +220,7 @@
width: parent.width
anchors.centerIn: parent
- text: i18n("No chapters found.")
+ text: i18n("No chapters found")
}
ListView {
@@ -342,7 +342,7 @@
Controls.ToolTip {
visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
- text: i18nc("@action:button", "Open Volume Settings")
+ text: i18nc("@action:button", "Open volume settings")
}
onClicked: {
if (volumePopup.visible) {
@@ -372,7 +372,7 @@
Controls.ToolTip {
visible: parent.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
- text: i18nc("@action:button", "Toggle Mute")
+ text: i18nc("@action:button", "Toggle mute")
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/PlaybackRateCustomizerDialog.qml
^
|
@@ -97,7 +97,7 @@
onClicked: rateSlider.value = Math.max(0.0, rateSlider.value - 0.05)
Controls.ToolTip.visible: hovered
Controls.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
- Controls.ToolTip.text: i18nc("@action:button", "Decrease Playback Rate")
+ Controls.ToolTip.text: i18nc("@action:button", "Decrease playback rate")
}
Controls.Slider {
@@ -116,7 +116,7 @@
onClicked: rateSlider.value = Math.min(3.0, rateSlider.value + 0.05)
Controls.ToolTip.visible: hovered
Controls.ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
- Controls.ToolTip.text: i18nc("@action:button", "Increase Playback Rate")
+ Controls.ToolTip.text: i18nc("@action:button", "Increase playback rate")
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/QueuePage.qml
^
|
@@ -32,13 +32,22 @@
}
}
- actions.main: Kirigami.Action {
- icon.name: "view-refresh"
- text: i18nc("@action:intoolbar", "Refresh All Podcasts")
- onTriggered: refreshing = true
+ readonly property list<Kirigami.Action> pageActions: [
+ Kirigami.Action {
+ icon.name: "view-refresh"
+ text: i18nc("@action:intoolbar", "Refresh All Podcasts")
+ onTriggered: refreshing = true
+ }
+ ]
+
+ Component.onCompleted: {
+ for (var i in queueList.defaultActionList) {
+ pageActions.push(queueList.defaultActionList[i]);
+ }
}
- contextualActions: queueList.defaultActionList
+ // TODO: KF6 replace contextualActions with actions
+ contextualActions: pageActions
GenericEntryListView {
id: queueList
|
[-]
[+]
|
Added |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/SearchBar.qml
^
|
@@ -0,0 +1,141 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Bart De Vries <bart@mogwai.be>
+ *
+ * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+ */
+
+import QtQuick 2.14
+import QtQuick.Controls 2.14 as Controls
+import QtQuick.Layouts 1.14
+import org.kde.kirigami 2.19 as Kirigami
+
+import org.kde.kasts 1.0
+
+Controls.Control {
+ id: searchFilterBar
+
+ required property var proxyModel
+ required property var parentKey
+ property bool showSearchFilters: true
+
+ leftPadding: Kirigami.Units.largeSpacing + Kirigami.Units.smallSpacing
+ rightPadding: Kirigami.Units.largeSpacing
+ topPadding: Kirigami.Units.smallSpacing
+ bottomPadding: Kirigami.Units.smallSpacing
+
+ background: Rectangle {
+ Kirigami.Theme.inherit: false
+ Kirigami.Theme.colorSet: Kirigami.Theme.Header
+ color: Kirigami.Theme.backgroundColor
+
+ Kirigami.Separator {
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ }
+ }
+
+ contentItem: Kirigami.SearchField {
+ Layout.fillWidth: true
+ id: searchField
+ placeholderText: i18nc("@label:textbox Placeholder text for episode search field", "Search episodes…")
+ focus: true
+ autoAccept: false
+ onAccepted: {
+ proxyModel.searchFilter = searchField.text;
+ }
+
+ Kirigami.Action {
+ id: searchSettingsButton
+ visible: showSearchFilters
+ enabled: visible
+ icon.name: "settings-configure"
+ text: i18nc("@action:intoolbar", "Advanced Search Options")
+
+ onTriggered: {
+ if (searchSettingsMenu.visible) {
+ searchSettingsMenu.dismiss();
+ } else {
+ searchSettingsMenu.popup(searchSettingsButton);
+ }
+ }
+ }
+ Component.onCompleted: {
+ // rightActions are defined from right-to-left
+ // if we want to insert the settings action as the rightmost, then it
+ // must be defined as first action, which means that we need to save the
+ // default clear action and push that as a second action
+ var origAction = searchField.rightActions[0];
+ searchField.rightActions[0] = searchSettingsButton;
+ searchField.rightActions.push(origAction);
+ }
+
+ Keys.onEscapePressed: {
+ proxyModel.searchFilter = "";
+ parentKey.checked = false;
+ event.accepted = true;
+ }
+ Keys.onReturnPressed: {
+ accepted();
+ event.accepted = true;
+ }
+ }
+
+ Component.onCompleted: {
+ searchField.forceActiveFocus();
+ }
+
+ ListModel {
+ id: searchSettingsModel
+
+ function reload() {
+ clear();
+ if (showSearchFilters) {
+ var searchList = [AbstractEpisodeProxyModel.TitleFlag,
+ AbstractEpisodeProxyModel.ContentFlag,
+ AbstractEpisodeProxyModel.FeedNameFlag]
+ for (var i in searchList) {
+ searchSettingsModel.append({"name": proxyModel.getSearchFlagName(searchList[i]),
+ "searchFlag": searchList[i],
+ "checked": proxyModel.searchFlags & searchList[i]});
+ }
+ }
+ }
+
+ Component.onCompleted: {
+ reload();
+ }
+ }
+
+ Controls.Menu {
+ id: searchSettingsMenu
+
+ title: i18nc("@title:menu", "Search Preferences")
+
+ Controls.Label {
+ padding: Kirigami.Units.smallSpacing
+ text: i18nc("@title:group Group of fields in which can be searched", "Search in:")
+ }
+
+ Repeater {
+ model: searchSettingsModel
+
+ Controls.MenuItem {
+ text: model.name
+ checkable: true
+ checked: model.checked
+ onTriggered: {
+ if (checked) {
+ proxyModel.searchFlags = proxyModel.searchFlags | model.searchFlag;
+ } else {
+ proxyModel.searchFlags = proxyModel.searchFlags & ~model.searchFlag;
+ }
+ }
+ }
+ }
+
+ onOpened: {
+ searchSettingsModel.reload();
+ }
+ }
+}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/Settings/GeneralSettingsPage.qml
^
|
@@ -109,7 +109,7 @@
MobileForm.FormComboBoxDelegate {
id: selectAudioBackend
- text: i18nc("Label for setting to select audio playback backend", "Select Audio Backend")
+ text: i18nc("Label for setting to select audio playback backend", "Select audio backend")
textRole: "text"
valueRole: "value"
@@ -139,7 +139,7 @@
MobileForm.FormCheckDelegate {
id: showTimeLeft
- Kirigami.FormData.label: i18nc("Label for settings related to the play time, e.g. whether the total track time is shown or a countdown of the remaining play time", "Play Time:")
+ Kirigami.FormData.label: i18nc("Label for settings related to the play time, e.g. whether the total track time is shown or a countdown of the remaining play time", "Play time:")
checked: SettingsManager.toggleRemainingTime
text: i18n("Show time left instead of total track time")
onToggled: {
@@ -166,6 +166,40 @@
SettingsManager.save();
}
}
+ MobileForm.FormDelegateSeparator {
+ below: prioritizeStreaming
+ above: skipForwardStep
+ }
+ MobileForm.FormTextDelegate {
+ id: skipForwardStep
+ text: i18nc("@label:spinbox", "Skip forward interval (in seconds)")
+ trailing :
+ Controls.SpinBox {
+ Layout.rightMargin: Kirigami.Units.gridUnit
+ value: SettingsManager.skipForward
+ from: 1
+ to: 300
+ onValueModified: {
+ SettingsManager.skipForward = value;
+ SettingsManager.save();
+ }
+ }
+ }
+ MobileForm.FormTextDelegate {
+ id: skipBackwardInterval
+ text: i18nc("@label:spinbox", "Skip backward interval (in seconds)")
+ trailing :
+ Controls.SpinBox {
+ Layout.rightMargin: Kirigami.Units.gridUnit
+ value: SettingsManager.skipBackward
+ from: 1
+ to: 300
+ onValueModified: {
+ SettingsManager.skipBackward = value;
+ SettingsManager.save();
+ }
+ }
+ }
}
}
@@ -243,9 +277,9 @@
text: i18n("Played episode behavior")
textRole: "text"
valueRole: "value"
- model: [{"text": i18n("Do Not Delete"), "value": 0},
- {"text": i18n("Delete Immediately"), "value": 1},
- {"text": i18n("Delete at Next Startup"), "value": 2}]
+ model: [{"text": i18n("Do not delete"), "value": 0},
+ {"text": i18n("Delete immediately"), "value": 1},
+ {"text": i18n("Delete at next startup"), "value": 2}]
Component.onCompleted: currentIndex = indexOfValue(SettingsManager.autoDeleteOnPlayed)
onActivated: {
SettingsManager.autoDeleteOnPlayed = currentValue;
@@ -253,7 +287,25 @@
}
}
- MobileForm.FormDelegateSeparator { above: episodeBehavior; below: resetPositionOnPlayed }
+ MobileForm.FormDelegateSeparator { above: episodeBehavior; below: markAsPlayedGracePeriod }
+
+ MobileForm.FormTextDelegate {
+ id: markAsPlayedGracePeriod
+ text: i18nc("@label:spinbox", "Mark episodes as played when the given time is remaining (in seconds)")
+ textItem.wrapMode: Text.Wrap
+ trailing: Controls.SpinBox {
+ Layout.rightMargin: Kirigami.Units.gridUnit
+ value: SettingsManager.markAsPlayedBeforeEnd
+ from: 0
+ to: 300
+ onValueModified: {
+ SettingsManager.markAsPlayedBeforeEnd = value;
+ SettingsManager.save();
+ }
+ }
+ }
+
+ MobileForm.FormDelegateSeparator { above: markAsPlayedGracePeriod; below: resetPositionOnPlayed }
MobileForm.FormCheckDelegate {
id: resetPositionOnPlayed
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/Settings/SettingsPage.qml
^
|
@@ -14,31 +14,38 @@
actions: [
Kirigami.SettingAction {
text: i18n("General")
+ actionName: "General"
icon.name: ":/logo.svg"
page: "qrc:/GeneralSettingsPage.qml"
},
Kirigami.SettingAction {
text: i18n("Storage")
+ actionName: "Storage"
icon.name: "drive-harddisk-symbolic"
page: "qrc:/StorageSettingsPage.qml"
},
Kirigami.SettingAction {
text: i18n("Network")
+ actionName: "Network"
icon.name: "network-connect"
page: "qrc:/NetworkSettingsPage.qml"
},
Kirigami.SettingAction {
+ id: synchronizationSettingsAction
text: i18n("Synchronization")
+ actionName: "Synchronization"
icon.name: "state-sync"
page: "qrc:/SynchronizationSettingsPage.qml"
},
Kirigami.SettingAction {
text: i18n("Error Log")
+ actionName: "Error Log"
icon.name: "error"
page: "qrc:/ErrorListPage.qml"
},
Kirigami.SettingAction {
text: i18n("About")
+ actionName: "About"
icon.name: "documentinfo"
page: "qrc:/AboutPage.qml"
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/Settings/StorageSettingsPage.qml
^
|
@@ -47,7 +47,7 @@
trailing: Controls.Button {
Layout.leftMargin: Kirigami.Units.largeSpacing
icon.name: "document-open-folder"
- text: i18n("Select folder...")
+ text: i18n("Select Folder…")
enabled: !defaultStoragePath.checked
onClicked: storagePathDialog.open()
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/SleepTimerDialog.qml
^
|
@@ -56,7 +56,7 @@
Controls.Label {
opacity: (timerActive) ? 1 : 0.5
Layout.bottomMargin: Kirigami.Units.largeSpacing
- text: i18n("Remaining Time: %1", AudioManager.formattedRemainingSleepTime)
+ text: i18n("Remaining time: %1", AudioManager.formattedRemainingSleepTime)
}
RowLayout {
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/qml/main.qml
^
|
@@ -12,13 +12,12 @@
import Qt.labs.settings 1.0
import org.kde.kirigami 2.20 as Kirigami
-import org.kde.kasts.solidextras 1.0
import org.kde.kasts 1.0
Kirigami.ApplicationWindow {
id: kastsMainWindow
- title: "Kasts"
+ title: i18n("Kasts")
width: Kirigami.Settings.isMobile ? 360 : 800
height: Kirigami.Settings.isMobile ? 660 : 600
@@ -44,6 +43,7 @@
}
property var lastFeed: ""
property string currentPage: ""
+ property int feedSorting: FeedsProxyModel.UnreadDescending
property bool isWidescreen: kastsMainWindow.width > kastsMainWindow.height
@@ -62,10 +62,17 @@
}
}
function pushPage(page) {
- pageStack.clear();
- pageStack.layers.clear();
- pageStack.push(getPage(page));
- currentPage = page;
+ if (page === "SettingsPage") {
+ pageStack.layers.clear()
+ pageStack.pushDialogLayer("qrc:/SettingsPage.qml", {}, {
+ title: i18n("Settings")
+ })
+ } else {
+ pageStack.clear();
+ pageStack.layers.clear();
+ pageStack.push(getPage(page));
+ currentPage = page;
+ }
}
Settings {
@@ -79,6 +86,7 @@
property var desktopHeight
property int headerSize: Kirigami.Units.gridUnit * 5
property alias lastOpenedPage: kastsMainWindow.currentPage
+ property alias feedSorting: kastsMainWindow.feedSorting
}
function saveWindowLayout() {
@@ -117,38 +125,42 @@
// Refresh feeds on startup if allowed
// NOTE: refresh+sync on startup is handled in Sync and not here, since it
// requires credentials to be loaded before starting a refresh+sync
- if (NetworkStatus.connectivity != NetworkStatus.No && (SettingsManager.allowMeteredFeedUpdates || NetworkStatus.metered !== NetworkStatus.Yes)) {
+ if (NetworkConnectionManager.feedUpdatesAllowed) {
if (SettingsManager.refreshOnStartup && !(SettingsManager.syncEnabled && SettingsManager.syncWhenUpdatingFeeds)) {
Fetcher.fetchAll();
}
}
}
- globalDrawer: sidebar.item
- Loader {
- id: sidebar
- active: !Kirigami.Settings.isMobile || kastsMainWindow.isWidescreen
- sourceComponent: Kirigami.OverlayDrawer {
- id: drawer
- modal: false
- closePolicy: Controls.Popup.NoAutoClose
- edge: Qt.application.layoutDirection === Qt.RightToLeft ? Qt.RightEdge : Qt.LeftEdge
-
- readonly property real pinnedWidth: Kirigami.Units.gridUnit * 3
- readonly property real widescreenBigWidth: Kirigami.Units.gridUnit * 10
- readonly property int buttonDisplayMode: kastsMainWindow.isWidescreen ? Kirigami.NavigationTabButton.TextBesideIcon : Kirigami.NavigationTabButton.IconOnly
-
- width: kastsMainWindow.isWidescreen ? widescreenBigWidth : pinnedWidth
-
- Kirigami.Theme.colorSet: Kirigami.Theme.Window
- Kirigami.Theme.inherit: false
-
- leftPadding: 0
- rightPadding: 0
- topPadding: 0
- bottomPadding: 0
+ property bool showGlobalDrawer: !Kirigami.Settings.isMobile || kastsMainWindow.isWidescreen
+
+ globalDrawer: showGlobalDrawer ? myGlobalDrawer : null
+
+ property Kirigami.OverlayDrawer myGlobalDrawer: Kirigami.OverlayDrawer {
+ id: drawer
+ modal: false
+ closePolicy: Controls.Popup.NoAutoClose
+ edge: Qt.application.layoutDirection === Qt.RightToLeft ? Qt.RightEdge : Qt.LeftEdge
+
+ readonly property real pinnedWidth: Kirigami.Units.gridUnit * 3
+ readonly property real widescreenBigWidth: Kirigami.Units.gridUnit * 10
+ readonly property int buttonDisplayMode: kastsMainWindow.isWidescreen ? Kirigami.NavigationTabButton.TextBesideIcon : Kirigami.NavigationTabButton.IconOnly
- contentItem: ColumnLayout {
+ width: showGlobalDrawer ? (kastsMainWindow.isWidescreen ? widescreenBigWidth : pinnedWidth) : 0
+
+ Kirigami.Theme.colorSet: Kirigami.Theme.Window
+ Kirigami.Theme.inherit: false
+
+ leftPadding: 0
+ rightPadding: 0
+ topPadding: 0
+ bottomPadding: 0
+
+ contentItem: Loader {
+ id: sidebarColumn
+ active: showGlobalDrawer
+
+ sourceComponent: ColumnLayout {
spacing: 0
Controls.ToolBar {
@@ -245,23 +257,13 @@
checked: currentPage == "SettingsPage"
onClicked: {
checked = false;
- kastsMainWindow.pageStack.layers.clear()
- kastsMainWindow.pageStack.pushDialogLayer("qrc:/SettingsPage.qml", {}, {
- title: i18n("Settings")
- })
+ pushPage("SettingsPage")
}
}
}
}
}
- contextDrawer: Kirigami.ContextDrawer {
- id: contextDrawer
- // make room at the bottom for miniplayer
- handle.anchors.bottomMargin: ( (AudioManager.entry && Kirigami.Settings.isMobile) ? ( footerLoader.item.contentY == 0 ? miniplayerSize : 0 ) : 0 ) + Kirigami.Units.smallSpacing
- handleVisible: Kirigami.Settings.isMobile ? !AudioManager.entry || footerLoader.item.contentY === 0 : false
- }
-
// Implement slots for MPRIS2 signals
Connections {
target: AudioManager
@@ -428,7 +430,7 @@
id: downloadOverlay
headingText: i18n("Podcast downloads are currently not allowed on metered connections")
- condition: SettingsManager.allowMeteredEpisodeDownloads
+ condition: NetworkConnectionManager.episodeDownloadsAllowed
property var entry: undefined
property var selection: undefined
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/resources.qrc
^
|
@@ -42,9 +42,8 @@
<file alias="SleepTimerDialog.qml">qml/SleepTimerDialog.qml</file>
<file alias="FullScreenImage.qml">qml/FullScreenImage.qml</file>
<file alias="GlobalSearchField.qml">qml/GlobalSearchField.qml</file>
- <file alias="SearchFilterBar.qml">qml/SearchFilterBar.qml</file>
+ <file alias="SearchBar.qml">qml/SearchBar.qml</file>
<file alias="FilterInlineMessage.qml">qml/FilterInlineMessage.qml</file>
- <file>qtquickcontrols2.conf</file>
<file alias="logo.svg">../kasts.svg</file>
<file alias="kasts-tray-light.svg">../icons/kasts-tray-light.svg</file>
<file alias="kasts-tray-dark.svg">../icons/kasts-tray-dark.svg</file>
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/settingsmanager.kcfg
^
|
@@ -75,6 +75,10 @@
</choices>
<default>OnNextStartup</default>
</entry>
+ <entry name="markAsPlayedBeforeEnd" type="Int">
+ <label>Amount of seconds before end of stream that the episode should already be marked as played</label>
+ <default>15</default>
+ </entry>
<entry name="resetPositionOnPlayed" type="Bool">
<label>Reset play position when episode is marked as played</label>
<default>true</default>
@@ -123,6 +127,18 @@
<label>List of user-defined playback rates</label>
<default>50,75,100,125,150,175,200,225,250</default>
</entry>
+ <entry name="skipForward" type="UInt">
+ <label>Skip forward in seconds</label>
+ <min>1</min>
+ <max>300</max>
+ <default>10</default>
+ </entry>
+ <entry name="skipBackward" type="UInt">
+ <label>Skip backward in seconds</label>
+ <min>1</min>
+ <max>300</max>
+ <default>10</default>
+ </entry>
</group>
<group name="Network">
<entry name="allowMeteredFeedUpdates" type="Bool">
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/storagemanager.cpp
^
|
@@ -14,6 +14,7 @@
#include <QDir>
#include <QFile>
#include <QFileInfo>
+#include <QRegularExpression>
#include <QStandardPaths>
#include "enclosure.h"
@@ -65,7 +66,13 @@
qCDebug(kastsStorageManager) << "New storage path will be:" << newPath;
if (oldPath != newPath) {
- QStringList list = {QStringLiteral("enclosures"), QStringLiteral("images")};
+ // make list of dirs to be moved (images/ and enclosures/*/)
+ QStringList list = {QStringLiteral("images")};
+ for (const QString &subdir : QDir(oldPath + QStringLiteral("/enclosures/")).entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
+ list << QStringLiteral("enclosures/") + subdir;
+ }
+ list << QStringLiteral("enclosures");
+
StorageMoveJob *moveJob = new StorageMoveJob(oldPath, newPath, list);
connect(moveJob, &KJob::processedAmountChanged, this, [this, moveJob]() {
m_storageMoveProgress = moveJob->processedAmount(KJob::Files);
@@ -113,23 +120,44 @@
QString StorageManager::enclosureDirPath() const
{
+ return enclosureDirPath(QStringLiteral(""));
+}
+
+QString StorageManager::enclosureDirPath(const QString &feedname) const
+{
QString path = storagePath() + QStringLiteral("/enclosures/");
+
+ if (!feedname.isEmpty()) {
+ path += feedname + QStringLiteral("/");
+ }
+
// Create path if it doesn't exist yet
QFileInfo().absoluteDir().mkpath(path);
return path;
}
-QString StorageManager::enclosurePath(const QString &url) const
+QString StorageManager::enclosurePath(const QString &name, const QString &url, const QString &feedname) const
{
- return enclosureDirPath() + QString::fromStdString(QCryptographicHash::hash(url.toUtf8(), QCryptographicHash::Md5).toHex().toStdString());
+ // Generate filename based on episode name and url hash with feedname as subdirectory
+ QString enclosureFilenameBase = sanitizedFilePath(name) + QStringLiteral(".")
+ + QString::fromStdString(QCryptographicHash::hash(url.toUtf8(), QCryptographicHash::Md5).toHex().toStdString()).left(6);
+
+ QString enclosureFilenameExt = QFileInfo(QUrl::fromUserInput(url).fileName()).suffix();
+
+ QString enclosureFilename = !enclosureFilenameExt.isEmpty() ? enclosureFilenameBase + QStringLiteral(".") + enclosureFilenameExt : enclosureFilenameBase;
+
+ return enclosureDirPath(feedname) + enclosureFilename;
}
qint64 StorageManager::dirSize(const QString &path) const
{
qint64 size = 0;
- QFileInfoList files = QDir(path).entryInfoList(QDir::Files);
+ QFileInfoList files = QDir(path).entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
for (QFileInfo info : files) {
+ if (info.isDir()) {
+ size += dirSize(info.filePath());
+ }
size += info.size();
}
@@ -145,11 +173,11 @@
void StorageManager::clearImageCache()
{
- qDebug() << imageDirPath();
+ qCDebug(kastsStorageManager) << imageDirPath();
QStringList images = QDir(imageDirPath()).entryList(QDir::Files);
- qDebug() << images;
+ qCDebug(kastsStorageManager) << images;
for (QString image : images) {
- qDebug() << image;
+ qCDebug(kastsStorageManager) << image;
QFile(QDir(imageDirPath()).absoluteFilePath(image)).remove();
}
Q_EMIT imageDirSizeChanged();
@@ -179,3 +207,16 @@
{
return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QStringLiteral("/") + username;
}
+
+QString StorageManager::sanitizedFilePath(const QString &path) const
+{
+ // NOTE: Any changes here require a database migration!
+
+ // Only keep alphanumeric ascii characters; this avoid any kind of issues
+ // with the many types of filesystems out there. Then remove excess whitespace
+ // and limit the length of the string.
+ QString newPath = path;
+ newPath = newPath.remove(QRegularExpression(QStringLiteral("[^a-zA-Z0-9 ._()-]"))).simplified().left(maxFilenameLength);
+
+ return newPath.isEmpty() ? QStringLiteral("Noname") : newPath;
+}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/storagemanager.h
^
|
@@ -34,6 +34,8 @@
return _instance;
}
+ static const int maxFilenameLength = 200;
+
QString storagePath() const;
Q_INVOKABLE void setStoragePath(QUrl url);
@@ -41,7 +43,8 @@
QString imagePath(const QString &url) const;
QString enclosureDirPath() const;
- QString enclosurePath(const QString &url) const;
+ QString enclosureDirPath(const QString &feedname) const;
+ QString enclosurePath(const QString &name, const QString &url, const QString &feedname) const;
qint64 enclosureDirSize() const;
qint64 imageDirSize() const;
@@ -53,6 +56,8 @@
QString passwordFilePath(const QString &username) const;
+ QString sanitizedFilePath(const QString &path) const;
+
Q_SIGNALS:
void error(Error::Type type, const QString &url, const QString &id, const int errorId, const QString &errorString, const QString &title);
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/storagemovejob.cpp
^
|
@@ -101,6 +101,13 @@
QFile(QDir(m_from).absoluteFilePath(file)).remove();
qCDebug(kastsStorageMoveJob) << "Removing file" << QDir(m_from).absoluteFilePath(file);
}
+
+ // delete the directories as well
+ for (const QString &item : m_list) {
+ if (!item.isEmpty() && QFileInfo(m_from + QStringLiteral("/") + item).isDir()) {
+ QDir(m_from).rmdir(item);
+ }
+ }
} else {
setError(2);
setErrorText(i18n("An error occurred while copying data"));
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/sync/sync.cpp
^
|
@@ -33,6 +33,7 @@
#include "fetcher.h"
#include "fetchfeedsjob.h"
#include "models/errorlogmodel.h"
+#include "networkconnectionmanager.h"
#include "settingsmanager.h"
#include "storagemanager.h"
#include "sync/gpodder/devicerequest.h"
@@ -48,8 +49,6 @@
#include "sync/syncjob.h"
#include "sync/syncutils.h"
-#include <solidextras/networkstatus.h>
-
using namespace SyncUtils;
Sync::Sync()
@@ -101,9 +100,7 @@
// Now that we have all credentials we can do the initial sync if
// it's enabled in the config. If it's not enabled, then we handle
// the automatic refresh through main.qml
- SolidExtras::NetworkStatus networkStatus;
- if (networkStatus.connectivity() != SolidExtras::NetworkStatus::No
- && (networkStatus.metered() != SolidExtras::NetworkStatus::Yes || SettingsManager::self()->allowMeteredFeedUpdates())) {
+ if (NetworkConnectionManager::instance().feedUpdatesAllowed()) {
if (SettingsManager::self()->refreshOnStartup() && SettingsManager::self()->syncWhenUpdatingFeeds()) {
doRegularSync(true);
}
@@ -483,8 +480,8 @@
passwordFile.fileName(),
QStringLiteral(""),
0,
- i18n("I/O Denied: Cannot save password."),
- i18n("I/O Denied: Cannot save password."));
+ i18n("I/O denied: Cannot save password."),
+ i18n("I/O denied: Cannot save password."));
Q_EMIT passwordSaveFinished(false);
} else {
passwordFile.write(password.toUtf8());
@@ -564,8 +561,8 @@
passwordFile.fileName(),
QStringLiteral(""),
0,
- i18n("I/O Denied: Cannot access password file."),
- i18n("I/O Denied: Cannot access password file."));
+ i18n("I/O denied: Cannot access password file."),
+ i18n("I/O denied: Cannot access password file."));
return QStringLiteral("");
}
@@ -814,9 +811,7 @@
// since this method is supposed to be called automatically, we cannot check
// the network state from the UI, so we have to do it here
- SolidExtras::NetworkStatus networkStatus;
- if (networkStatus.connectivity() == SolidExtras::NetworkStatus::No
- || (networkStatus.metered() == SolidExtras::NetworkStatus::Yes && !SettingsManager::self()->allowMeteredFeedUpdates())) {
+ if (!NetworkConnectionManager::instance().feedUpdatesAllowed()) {
qCDebug(kastsSync) << "Not uploading episode actions on metered connection due to settings";
return;
}
@@ -867,9 +862,9 @@
Entry *entry = DataManager::instance().getEntry(action.id);
if (entry && entry->hasEnclosure()) {
qCDebug(kastsSync) << action.position << action.total << static_cast<qint64>(action.position) << entry->enclosure()->duration()
- << AudioManager::instance().SKIP_TRACK_END / 1000;
- if ((action.position >= action.total - AudioManager::instance().SKIP_TRACK_END / 1000
- || static_cast<qint64>(action.position) >= entry->enclosure()->duration() - AudioManager::instance().SKIP_TRACK_END / 1000)
+ << SettingsManager::self()->markAsPlayedBeforeEnd();
+ if ((action.position >= action.total - SettingsManager::self()->markAsPlayedBeforeEnd()
+ || static_cast<qint64>(action.position) >= entry->enclosure()->duration() - SettingsManager::self()->markAsPlayedBeforeEnd())
&& action.total > 0) {
// Episode has been played
qCDebug(kastsSync) << "mark as played:" << entry->title();
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/sync/syncjob.cpp
^
|
@@ -30,8 +30,6 @@
#include "sync/sync.h"
#include "sync/syncutils.h"
-#include <solidextras/networkstatus.h>
-
using namespace SyncUtils;
SyncJob::SyncJob(SyncStatus syncStatus, GPodder *gpodder, const QString &device, bool forceFetchAll, QObject *parent)
@@ -883,41 +881,41 @@
switch (status) {
case Started:
- return i18nc("Step in Subscription and Episode Syncing Progress", "(Step %1 of %2) Start Syncing", processed, total);
+ return i18nc("Subscription/Episode sync progress step", "(Step %1 of %2) Start sync", processed, total);
break;
case SubscriptionDownload:
- return i18nc("Step in Subscription and Episode Syncing Progress", "(Step %1 of %2) Requesting Remote Subscription Updates", processed, total);
+ return i18nc("Subscription/Episode sync progress step", "(Step %1 of %2) Requesting remote subscription updates", processed, total);
break;
case SubscriptionUpload:
- return i18nc("Step in Subscription and Episode Syncing Progress", "(Step %1 of %2) Uploading Local Subscription Updates", processed, total);
+ return i18nc("Subscription/Episode sync progress step", "(Step %1 of %2) Uploading local subscription updates", processed, total);
break;
case SubscriptionFetch:
- return i18ncp("Step in Subscription and Episode Syncing Progress",
- "(Step %3 of %4) Updated %2 of %1 Podcast",
- "(Step %3 of %4) Updated %2 of %1 Podcasts",
+ return i18ncp("Subscription/Episode sync progress step",
+ "(Step %3 of %4) Updated %2 of %1 podcast",
+ "(Step %3 of %4) Updated %2 of %1 podcasts",
m_feedUpdateTotal,
m_feedUpdateProgress,
processed,
total);
break;
case EpisodeDownload:
- return i18nc("Step in Subscription and Episode Syncing Progress", "(Step %1 of %2) Requesting Remote Episode Updates", processed, total);
+ return i18nc("Subscription/Episode sync progress step", "(Step %1 of %2) Requesting remote episode updates", processed, total);
break;
case ApplyEpisodeActions:
- return i18nc("Step in Subscription and Episode Syncing Progress", "(Step %1 of %2) Applying Remote Episode Changes", processed, total);
+ return i18nc("Subscription/Episode sync progress step", "(Step %1 of %2) Applying remote episode changes", processed, total);
break;
case EpisodeUpload:
- return i18nc("Step in Subscription and Episode Syncing Progress", "(Step %1 of %2) Uploading Local Episode Updates", processed, total);
+ return i18nc("Subscription/Episode sync progress step", "(Step %1 of %2) Uploading local episode updates", processed, total);
break;
case Finished:
- return i18nc("Step in Subscription and Episode Syncing Progress", "(Step %1 of %2) Finished Syncing", processed, total);
+ return i18nc("Subscription/Episode sync progress step", "(Step %1 of %2) Finished sync", processed, total);
break;
case Aborted:
- return i18nc("Step in Subscription and Episode Syncing Progress", "Sync Aborted");
+ return i18nc("Subscription/Episode sync progress step", "Sync aborted");
break;
case Error:
default:
- return i18nc("Step in Subscription and Episode Syncing Progress", "Sync finished with Error");
+ return i18nc("Subscription/Episode sync progress step", "Sync finished with error");
break;
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/updatefeedjob.cpp
^
|
@@ -23,6 +23,7 @@
#include "fetcherlogging.h"
#include "kasts-version.h"
#include "settingsmanager.h"
+#include "storagemanager.h"
using namespace ThreadWeaver;
@@ -69,27 +70,32 @@
if (feed.isNull())
return;
- // First check if this is a newly added feed
+ // First check if this is a newly added feed and get current name and dirname
m_isNewFeed = false;
+ QString oldName, oldDirname;
QSqlQuery query(QSqlDatabase::database(m_url));
- query.prepare(QStringLiteral("SELECT new FROM Feeds WHERE url=:url;"));
+ query.prepare(QStringLiteral("SELECT new, name, dirname FROM Feeds WHERE url=:url;"));
query.bindValue(QStringLiteral(":url"), m_url);
Database::execute(query);
if (query.next()) {
m_isNewFeed = query.value(QStringLiteral("new")).toBool();
+ oldName = query.value(QStringLiteral("name")).toString();
+ oldDirname = query.value(QStringLiteral("dirname")).toString();
} else {
qCDebug(kastsFetcher) << "Feed not found in database" << m_url;
return;
}
- if (m_isNewFeed)
+ if (m_isNewFeed) {
qCDebug(kastsFetcher) << "New feed" << feed->title();
+ }
m_markUnreadOnNewFeed = !(SettingsManager::self()->markUnreadOnNewFeed() == 2);
// Retrieve "other" fields; this will include the "itunes" tags
QMultiMap<QString, QDomElement> otherItems = feed->additionalProperties();
- query.prepare(QStringLiteral("UPDATE Feeds SET name=:name, image=:image, link=:link, description=:description, lastUpdated=:lastUpdated WHERE url=:url;"));
+ query.prepare(QStringLiteral(
+ "UPDATE Feeds SET name=:name, image=:image, link=:link, description=:description, lastUpdated=:lastUpdated, dirname=:dirname WHERE url=:url;"));
query.bindValue(QStringLiteral(":name"), feed->title());
query.bindValue(QStringLiteral(":url"), m_url);
query.bindValue(QStringLiteral(":link"), feed->link());
@@ -110,6 +116,23 @@
image = QUrl(m_url).adjusted(QUrl::RemovePath).toString() + image;
query.bindValue(QStringLiteral(":image"), image);
+ // if the title has changed, we need to rename the corresponding enclosure
+ // download directory name and move the files
+ m_dirname = oldDirname;
+ if (oldName != feed->title() || oldDirname.isEmpty() || m_isNewFeed) {
+ QString generatedDirname = generateFeedDirname(feed->title());
+ if (generatedDirname != oldDirname) {
+ m_dirname = generatedDirname;
+ QString enclosurePath = StorageManager::instance().enclosureDirPath();
+ if (QDir(enclosurePath + oldDirname).exists()) {
+ QDir().rename(enclosurePath + oldDirname, enclosurePath + m_dirname);
+ } else {
+ QDir().mkpath(enclosurePath + m_dirname);
+ }
+ }
+ }
+ query.bindValue(QStringLiteral(":dirname"), m_dirname);
+
// Do the actual database UPDATE of this feed
Database::execute(query);
@@ -210,7 +233,7 @@
qCDebug(kastsFetcher) << "Updated feed details:" << feed->title();
// TODO: Only emit signal if the details have really changed
- Q_EMIT feedDetailsUpdated(m_url, feed->title(), image, feed->link(), feed->description(), current);
+ Q_EMIT feedDetailsUpdated(m_url, feed->title(), image, feed->link(), feed->description(), current, m_dirname);
if (m_abort)
return;
@@ -359,7 +382,7 @@
// the first one is probably the podcast author's preferred version
// TODO: handle more than one enclosure?
if (entry->enclosures().count() > 0) {
- isUpdateDependencies = isUpdateDependencies | processEnclosure(entry->enclosures()[0], entry);
+ isUpdateDependencies = isUpdateDependencies | processEnclosure(entry->enclosures()[0], entryDetails, currentEntry);
}
return isNewEntry | isUpdateEntry | isUpdateDependencies; // this is a new or updated entry, or an enclosure, chapter or author has been changed/added
@@ -402,7 +425,7 @@
return isNewAuthor | isUpdateAuthor;
}
-bool UpdateFeedJob::processEnclosure(Syndication::EnclosurePtr enclosure, Syndication::ItemPtr entry)
+bool UpdateFeedJob::processEnclosure(Syndication::EnclosurePtr enclosure, const EntryDetails &newEntry, const EntryDetails &oldEntry)
{
bool isNewEnclosure = true;
bool isUpdateEnclosure = false;
@@ -410,7 +433,7 @@
// check against existing enclosures already in database
for (const EnclosureDetails &enclosureDetails : (m_enclosures + m_newEnclosures)) {
- if (enclosureDetails.id == entry->id()) {
+ if (enclosureDetails.id == newEntry.id) {
isNewEnclosure = false;
currentEnclosure = enclosureDetails;
}
@@ -418,7 +441,7 @@
EnclosureDetails enclosureDetails;
enclosureDetails.feed = m_url;
- enclosureDetails.id = entry->id();
+ enclosureDetails.id = newEntry.id;
enclosureDetails.duration = enclosure->duration();
enclosureDetails.size = enclosure->length();
enclosureDetails.title = enclosure->title();
@@ -430,14 +453,32 @@
if (!isNewEnclosure) {
if ((currentEnclosure.url != enclosureDetails.url) || (currentEnclosure.title != enclosureDetails.title)
|| (currentEnclosure.type != enclosureDetails.type)) {
- qCDebug(kastsFetcher) << "enclosure details have been updated for:" << entry->id();
+ qCDebug(kastsFetcher) << "enclosure details have been updated for:" << newEntry.id;
isUpdateEnclosure = true;
m_updateEnclosures += enclosureDetails;
} else {
- qCDebug(kastsFetcher) << "enclosure details are unchanged:" << entry->id();
+ qCDebug(kastsFetcher) << "enclosure details are unchanged:" << newEntry.id;
+ }
+
+ // Check if entry title or enclosure URL has changed
+ if (newEntry.title != oldEntry.title) {
+ QString oldFilename = StorageManager::instance().enclosurePath(oldEntry.title, currentEnclosure.url, m_dirname);
+ QString newFilename = StorageManager::instance().enclosurePath(newEntry.title, enclosureDetails.url, m_dirname);
+
+ if (oldFilename != newFilename) {
+ if (currentEnclosure.url == enclosureDetails.url) {
+ // If entry title has changed but URL is still the same, the existing enclosure needs to be renamed
+ QFile::rename(oldFilename, newFilename);
+ } else {
+ // If enclosure URL has changed, the old enclosure needs to be deleted
+ if (QFile(oldFilename).exists()) {
+ QFile(oldFilename).remove();
+ }
+ }
+ }
}
} else {
- qCDebug(kastsFetcher) << "this is a new enclosure:" << entry->id();
+ qCDebug(kastsFetcher) << "this is a new enclosure:" << newEntry.id;
m_newEnclosures += enclosureDetails;
}
@@ -490,7 +531,7 @@
// new entries
writeQuery.prepare(
- QStringLiteral("INSERT INTO Entries VALUES (:feed, :id, :title, :content, :created, :updated, :link, :read, :new, :hasEnclosure, :image);"));
+ QStringLiteral("INSERT INTO Entries VALUES (:feed, :id, :title, :content, :created, :updated, :link, :read, :new, :hasEnclosure, :image, :favorite);"));
for (const EntryDetails &entryDetails : m_newEntries) {
writeQuery.bindValue(QStringLiteral(":feed"), entryDetails.feed);
writeQuery.bindValue(QStringLiteral(":id"), entryDetails.id);
@@ -503,6 +544,7 @@
writeQuery.bindValue(QStringLiteral(":read"), entryDetails.read);
writeQuery.bindValue(QStringLiteral(":new"), entryDetails.isNew);
writeQuery.bindValue(QStringLiteral(":image"), entryDetails.image);
+ writeQuery.bindValue(QStringLiteral(":favorite"), false);
Database::execute(writeQuery);
}
@@ -652,6 +694,29 @@
}
}
+QString UpdateFeedJob::generateFeedDirname(const QString &name) const
+{
+ // Generate directory name for enclosures based on feed name
+ // NOTE: Any changes here require a database migration!
+ QString dirBaseName = StorageManager::instance().sanitizedFilePath(name);
+ QString dirName = dirBaseName;
+
+ QStringList dirNameList;
+ QSqlQuery query(QSqlDatabase::database(m_url));
+ query.prepare(QStringLiteral("SELECT name FROM Feeds;"));
+ while (query.next()) {
+ dirNameList << query.value(QStringLiteral("name")).toString();
+ }
+
+ // Check for duplicate names in database and on filesystem
+ int numDups = 1; // Minimum to append is " (1)" if file already exists
+ while (dirNameList.contains(dirName) || QDir(StorageManager::instance().enclosureDirPath() + dirName).exists()) {
+ dirName = QStringLiteral("%1 (%2)").arg(dirBaseName, QString::number(numDups));
+ numDups++;
+ }
+ return dirName;
+}
+
void UpdateFeedJob::abort()
{
m_abort = true;
|
[-]
[+]
|
Changed |
_service:tar_git:kasts-23.08.0+git1.tar.xz/upstream/src/updatefeedjob.h
^
|
@@ -76,7 +76,8 @@
const QString &image,
const QString &link,
const QString &description,
- const QDateTime &lastUpdated);
+ const QDateTime &lastUpdated,
+ const QString &dirname);
void feedUpdated(const QString &url);
void entryAdded(const QString &feedurl, const QString &id);
void entryUpdated(const QString &feedurl, const QString &id);
@@ -88,13 +89,15 @@
void processFeed(Syndication::FeedPtr feed);
bool processEntry(Syndication::ItemPtr entry);
bool processAuthor(const QString &entryId, const QString &authorName, const QString &authorUri, const QString &authorEmail);
- bool processEnclosure(Syndication::EnclosurePtr enclosure, Syndication::ItemPtr entry);
+ bool processEnclosure(Syndication::EnclosurePtr enclosure, const EntryDetails &newEntry, const EntryDetails &oldEntry);
bool processChapter(const QString &entryId, const int &start, const QString &chapterTitle, const QString &link, const QString &image);
void writeToDatabase();
+ QString generateFeedDirname(const QString &name) const;
bool m_abort = false;
QString m_url;
+ QString m_dirname;
QByteArray m_data;
bool m_isNewFeed;
|