mirror of
https://github.com/KDE/kasts.git
synced 2024-12-19 03:54:11 +01:00
f861f4e802
This implements the gpodder API from scratch. It turned out that libmygpo-qt has several critical bugs, and there's no response to pull requests upstream. So using that library was not an option. The implementation into kasts consists of the following: - Can sync with gpodder.net or with a nextcloud server that has the nextcloud-gpodder app installed. (This app is mostly API compatible with gpodder.) - Passwords are stored using qtkeychain. If the keychain is unavailable it will fallback to file. - It syncs podcast subscriptions and episode play positions, including marking episodes as played. Episodes that have a non-zero play position will be added to the queue automatically. - It will check for a metered connection before syncing. This is coupled to the allowMeteredFeedUpdates setting. - Full synchronization can be performed either manually (from the settings page) or through automatic triggers: on startup and/or on feed refresh. - There is an additional possibility to trigger quick upload-only syncs to make sure that the local changes are immediately uploaded to the server (if the connection allows). This will trigger when subscriptions are added or removed, when the pause/play button is toggled or an episode is marked as played. - This implements a few safeguards to avoid having multiple feed URLS pointing to the same underlying feed (e.g. http vs https). This solves part of #17 Solves #13
109 lines
2.8 KiB
C++
109 lines
2.8 KiB
C++
/**
|
|
* SPDX-FileCopyrightText: 2021 Bart De Vries <bart@mogwai.be>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
*/
|
|
|
|
#include <KLocalizedString>
|
|
#include <QDateTime>
|
|
#include <QObject>
|
|
#include <QString>
|
|
|
|
#include "datamanager.h"
|
|
#include "entry.h"
|
|
#include "error.h"
|
|
#include "feed.h"
|
|
|
|
Error::Error(const Type type, const QString url, const QString id, const int code, const QString message, const QDateTime date, const QString title)
|
|
: QObject(nullptr)
|
|
{
|
|
this->type = type;
|
|
this->url = url;
|
|
this->id = id;
|
|
this->code = code;
|
|
this->message = message;
|
|
this->date = date;
|
|
this->m_title = title;
|
|
}
|
|
|
|
QString Error::title() const
|
|
{
|
|
QString title = m_title;
|
|
if (title.isEmpty()) {
|
|
if (!id.isEmpty()) {
|
|
if (DataManager::instance().getEntry(id))
|
|
title = DataManager::instance().getEntry(id)->title();
|
|
} else if (!url.isEmpty()) {
|
|
if (DataManager::instance().getFeed(url))
|
|
title = DataManager::instance().getFeed(url)->name();
|
|
}
|
|
}
|
|
return title;
|
|
}
|
|
|
|
QString Error::description() const
|
|
{
|
|
switch (type) {
|
|
case Error::Type::FeedUpdate:
|
|
return i18n("Podcast Update Error");
|
|
case Error::Type::MediaDownload:
|
|
return i18n("Media Download Error");
|
|
case Error::Type::MeteredNotAllowed:
|
|
return i18n("Update Not Allowed on Metered Connection");
|
|
case Error::Type::InvalidMedia:
|
|
return i18n("Invalid Media File");
|
|
case Error::Type::DiscoverError:
|
|
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");
|
|
default:
|
|
return QString();
|
|
}
|
|
}
|
|
|
|
int Error::typeToDb(Error::Type type)
|
|
{
|
|
switch (type) {
|
|
case Error::Type::FeedUpdate:
|
|
return 0;
|
|
case Error::Type::MediaDownload:
|
|
return 1;
|
|
case Error::Type::MeteredNotAllowed:
|
|
return 2;
|
|
case Error::Type::InvalidMedia:
|
|
return 3;
|
|
case Error::Type::DiscoverError:
|
|
return 4;
|
|
case Error::Type::StorageMoveError:
|
|
return 5;
|
|
case Error::Type::SyncError:
|
|
return 6;
|
|
default:
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
Error::Type Error::dbToType(int value)
|
|
{
|
|
switch (value) {
|
|
case 0:
|
|
return Error::Type::FeedUpdate;
|
|
case 1:
|
|
return Error::Type::MediaDownload;
|
|
case 2:
|
|
return Error::Type::MeteredNotAllowed;
|
|
case 3:
|
|
return Error::Type::InvalidMedia;
|
|
case 4:
|
|
return Error::Type::DiscoverError;
|
|
case 5:
|
|
return Error::Type::StorageMoveError;
|
|
case 6:
|
|
return Error::Type::SyncError;
|
|
default:
|
|
return Error::Type::Unknown;
|
|
}
|
|
}
|