Initial implementation of qobuz-qt

- Rust backend (qobuz-backend static lib): Qobuz API client (reqwest/tokio),
  Symphonia audio decoder, CPAL audio output, extern "C" FFI bridge
- Qt 6 frontend mirroring spotify-qt layout: toolbar with playback controls,
  left library dock, central track list, right search panel
- Auth: email/password login with MD5-signed requests; session token persisted
  via QSettings
- Playback: double-click a track → Rust fetches stream URL → Symphonia decodes
  → CPAL outputs to default audio device
- Dark Fusion palette matching spotify-qt feel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
joren
2026-03-23 23:34:23 +01:00
commit 9402dca7ed
40 changed files with 3963 additions and 0 deletions

40
src/list/tracks.hpp Normal file
View File

@@ -0,0 +1,40 @@
#pragma once
#include "../model/tracklistmodel.hpp"
#include "../backend/qobuzbackend.hpp"
#include <QTreeView>
#include <QJsonArray>
#include <QJsonObject>
namespace List
{
/// Track list view — mirrors the spotify-qt List::Tracks widget.
/// Displays a flat list of tracks for a playlist, album, search result, etc.
class Tracks : public QTreeView
{
Q_OBJECT
public:
explicit Tracks(QobuzBackend *backend, QWidget *parent = nullptr);
void loadTracks(const QJsonArray &tracks);
void loadAlbum(const QJsonObject &album);
void loadPlaylist(const QJsonObject &playlist);
void loadSearchTracks(const QJsonArray &tracks);
void setCurrentTrackId(qint64 id);
signals:
void playTrackRequested(qint64 trackId);
private:
TrackListModel *m_model = nullptr;
QobuzBackend *m_backend = nullptr;
qint64 m_currentTrackId = 0;
void onDoubleClicked(const QModelIndex &index);
void onContextMenu(const QPoint &pos);
void resizeColumnsToContent();
};
}