Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 10 additions & 21 deletions src/server/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ if (USE_SYSTEM_KF6)
find_package(KF6SyntaxHighlighting REQUIRED)
endif()

list(APPEND LIBS
list(APPEND LIBS
Qt6::Sql Qt6::Network Qt6::Svg Qt6::DBus Qt6::Concurrent Qt6::Quick Qt6::Qml
Qt6::GuiPrivate # for deeper integration with wayland protocols, we need wl_surface
Qt6::QuickDialogs2 Qt6::QuickControls2
${CMARK_LIBRARY} ${CMARK_EXT_LIBRARY}
minizip
OpenSSL::Crypto
wayland-client
OpenSSL::Crypto
wayland-client
qt6keychain
LibXml2::LibXml2
KF6::SyntaxHighlighting
Expand Down Expand Up @@ -102,6 +102,8 @@ set(SRCS
include/favicon/cached-favicon-request.hpp
src/favicon/cached-favicon-request.cpp

include/url-metadata/url-metadata-service.hpp
src/url-metadata/url-metadata-service.cpp

src/command-actions.cpp

Expand All @@ -111,7 +113,7 @@ set(SRCS
src/root-search/shortcuts/shortcut-root-provider.cpp
src/root-search/apps/app-root-provider.hpp
src/root-search/apps/app-root-provider.cpp

src/extension/manager/extension-manager.hpp
src/extension/manager/extension-manager.cpp

Expand All @@ -134,7 +136,7 @@ set(SRCS

src/actions/app/app-actions.hpp
src/actions/app/app-actions.cpp

src/service-registry.cpp

src/services/background-effect/ext-background-effect-v1-manager.cpp
Expand Down Expand Up @@ -182,7 +184,6 @@ set(SRCS

src/lib/crypto.cpp


include/extension/extension-command.hpp

src/extension/extension-action-panel-builder.hpp
Expand All @@ -194,8 +195,6 @@ set(SRCS
include/extension/extension-command.hpp
src/extension/extension-command.cpp



src/ui/omni-painter/omni-painter.hpp
src/ui/omni-painter/omni-painter.cpp

Expand All @@ -216,15 +215,12 @@ set(SRCS

include/command-database.hpp
src/command-database.cpp

src/ui/image/url.hpp

src/ui/image/url.hpp

include/create-quicklink-command.hpp

src/builtin_icon.cpp


src/extend/accessory-model.cpp
src/extend/action-shortcut-parser.cpp
src/extend/action-model.cpp
Expand All @@ -243,14 +239,11 @@ set(SRCS

src/image-fetcher.hpp


src/command.hpp


src/vicinae.hpp
src/vicinae.cpp


${EXTRA_PATH}/extension-boilerplate/boilerplate.qrc

./icons/icons.qrc
Expand Down Expand Up @@ -314,7 +307,6 @@ set(SRCS

src/cli/server.cpp


src/utils/utils.cpp

src/services/file-chooser/abstract-file-chooser.hpp
Expand All @@ -327,15 +319,13 @@ set(SRCS
src/services/root-item-manager/root-item-manager.hpp
src/services/root-item-manager/root-item-manager.cpp
src/services/root-item-manager/visit-tracker.cpp

src/services/app-service/app-service.hpp
src/services/app-service/app-service.cpp

src/services/emoji-service/emoji-service.hpp
src/services/emoji-service/emoji-service.cpp



src/services/calculator-service/calculator-service.hpp
src/services/calculator-service/calculator-service.cpp

Expand Down Expand Up @@ -405,7 +395,6 @@ set(SRCS

src/overlay-controller/overlay-controller.hpp


src/lib/zip/unzip.cpp
src/lib/data-uri/data-uri.cpp
src/lib/pid-file/pid-file.cpp
Expand Down Expand Up @@ -692,7 +681,6 @@ if (UNIX AND NOT APPLE)

wayland_generate_protocol("wlr-data-control-unstable-v1")
endif()


qt_add_executable(${TARGET} ${SRCS})

Expand Down Expand Up @@ -733,6 +721,7 @@ set(VICINAE_QML_FILES
src/qml/qml/SearchableDropdown.qml
src/qml/qml/ClipboardHistoryView.qml
src/qml/qml/ClipboardFilterAccessory.qml
src/qml/qml/LinkPreview.qml
src/qml/qml/DetailPanel.qml
src/qml/qml/MetadataBar.qml
src/qml/qml/AlertDialog.qml
Expand Down
1 change: 1 addition & 0 deletions src/server/database/clipboard/migrations.qrc
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<RCC>
<qresource prefix="database/clipboard">
<file>migrations/001_init.sql</file>
<file>migrations/002_add_url_metadata.sql</file>
</qresource>
</RCC>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
ALTER TABLE selection ADD COLUMN og_title TEXT;
ALTER TABLE selection ADD COLUMN og_description TEXT;
ALTER TABLE selection ADD COLUMN og_image TEXT;
46 changes: 46 additions & 0 deletions src/server/include/url-metadata/url-metadata-service.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#pragma once
#include <QObject>
#include <QString>
#include <QUrl>
#include <optional>
#include <unordered_map>
#include <vector>

class QNetworkReply;

class UrlMetadataService : public QObject {
Q_OBJECT

public:
struct UrlMetadata {
std::optional<QString> ogTitle;
std::optional<QString> ogDescription;
std::optional<QString> ogImage;
};

explicit UrlMetadataService(QObject *parent = nullptr);
~UrlMetadataService() override;

void fetchMetadata(const QString &selectionId, const QUrl &url);

signals:
void metadataReady(const QString &selectionId, const QString &ogTitle, const QString &ogDescription,
const QString &ogImage);

private:
static constexpr size_t MAX_CACHE_SIZE = 200;
static constexpr qint64 MAX_BUFFER_SIZE = 64 * 1024;
static constexpr int TIMEOUT_MS = 10000;

static UrlMetadata parseMetaTags(const QByteArray &html);
void abortAll();

struct InFlightRequest {
QNetworkReply *reply;
QByteArray buffer;
std::vector<QString> selectionIds;
};

std::unordered_map<QString, InFlightRequest> m_inFlight;
std::unordered_map<QString, UrlMetadata> m_cache;
};
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ ClipboardHistoryController::ClipboardHistoryController(ClipboardService *clipboa
&ClipboardHistoryController::handleClipboardChanged);
connect(clipboard, &ClipboardService::selectionUpdated, this,
&ClipboardHistoryController::handleClipboardChanged);
connect(clipboard, &ClipboardService::selectionMetadataUpdated, this,
&ClipboardHistoryController::handleClipboardChanged);
}

void ClipboardHistoryController::setFilter(const QString &query) {
Expand Down
10 changes: 8 additions & 2 deletions src/server/src/qml/clipboard-history-model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,16 @@ QVariant ClipboardHistoryModel::data(const QModelIndex &index, int role) const {

QString ClipboardHistoryModel::itemId(int, int i) const { return m_entries[i].id; }

QString ClipboardHistoryModel::itemTitle(int, int i) const { return m_entries[i].textPreview; }
QString ClipboardHistoryModel::itemTitle(int, int i) const {
const auto &entry = m_entries[i];
if (entry.ogTitle && !entry.ogTitle->isEmpty()) return *entry.ogTitle;
return entry.textPreview;
}

QString ClipboardHistoryModel::itemSubtitle(int, int i) const {
auto dt = QDateTime::fromSecsSinceEpoch(m_entries[i].updatedAt);
const auto &entry = m_entries[i];
if (entry.ogDescription && !entry.ogDescription->isEmpty()) return *entry.ogDescription;
auto dt = QDateTime::fromSecsSinceEpoch(entry.updatedAt);
return getRelativeTimeString(dt);
}

Expand Down
9 changes: 9 additions & 0 deletions src/server/src/qml/clipboard-history-view-host.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,10 +165,16 @@ void ClipboardHistoryViewHost::handleDataRetrieved(int totalCount) {
void ClipboardHistoryViewHost::loadDetail(const ClipboardHistoryEntry &entry) {
m_detailTextContent.clear();
m_detailImageSource.clear();
m_detailOgTitle.clear();
m_detailOgDescription.clear();
m_detailOgImageUrl.clear();
m_hasDetailError = false;
m_detailErrorTitle.clear();
m_detailErrorDescription.clear();

m_detailOgTitle = entry.ogTitle.value_or(QString());
m_detailOgDescription = entry.ogDescription.value_or(QString());
m_detailOgImageUrl = entry.ogImage.value_or(QString());
m_detailMimeType = entry.mimeType;
m_detailSize = formatSize(entry.size);
m_detailCopiedAt = QDateTime::fromSecsSinceEpoch(entry.updatedAt).toString();
Expand Down Expand Up @@ -268,6 +274,9 @@ void ClipboardHistoryViewHost::clearDetail() {
m_hasDetailError = false;
m_detailTextContent.clear();
m_detailImageSource.clear();
m_detailOgTitle.clear();
m_detailOgDescription.clear();
m_detailOgImageUrl.clear();
m_detailMimeType.clear();
m_detailSize.clear();
m_detailCopiedAt.clear();
Expand Down
9 changes: 9 additions & 0 deletions src/server/src/qml/clipboard-history-view-host.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ class ClipboardHistoryViewHost : public ViewHostBase {
Q_PROPERTY(QString detailEncryptionIcon READ detailEncryptionIcon NOTIFY detailChanged)
Q_PROPERTY(QString detailErrorTitle READ detailErrorTitle NOTIFY detailChanged)
Q_PROPERTY(QString detailErrorDescription READ detailErrorDescription NOTIFY detailChanged)
Q_PROPERTY(QString detailOgTitle READ detailOgTitle NOTIFY detailChanged)
Q_PROPERTY(QString detailOgDescription READ detailOgDescription NOTIFY detailChanged)
Q_PROPERTY(QString detailOgImageUrl READ detailOgImageUrl NOTIFY detailChanged)

public:
explicit ClipboardHistoryViewHost();
Expand Down Expand Up @@ -60,6 +63,9 @@ class ClipboardHistoryViewHost : public ViewHostBase {
QString detailEncryptionIcon() const { return m_detailEncryptionIcon; }
QString detailErrorTitle() const { return m_detailErrorTitle; }
QString detailErrorDescription() const { return m_detailErrorDescription; }
QString detailOgTitle() const { return m_detailOgTitle; }
QString detailOgDescription() const { return m_detailOgDescription; }
QString detailOgImageUrl() const { return m_detailOgImageUrl; }

signals:
void itemCountTextChanged();
Expand Down Expand Up @@ -96,6 +102,9 @@ class ClipboardHistoryViewHost : public ViewHostBase {
QString m_detailEncryptionIcon;
QString m_detailErrorTitle;
QString m_detailErrorDescription;
QString m_detailOgTitle;
QString m_detailOgDescription;
QString m_detailOgImageUrl;

std::unique_ptr<QTemporaryFile> m_tmpFile;
};
Loading
Loading