mirror of
https://github.com/HenkKalkwater/harbour-sailfin.git
synced 2025-09-04 01:42:44 +00:00
Added Direct Play and websocket improvements
* [backend]: Websocket now automatically tries to reconnect if connection was lost, up to 3 times. * [backend]: Move more playback and resume logic to the backend, to avoid having it in multiple places within the QML. Regression: pausing playback sometimes halts the video player for an unknown reason. * [playback]: Sailfin will try to play without the server transcoding, if possible. * [ui]: added a debug page in the settings
This commit is contained in:
parent
a244c27b1a
commit
7e77abc173
13 changed files with 204 additions and 45 deletions
|
@ -82,6 +82,7 @@ public:
|
|||
Q_PROPERTY(QString userId READ userId NOTIFY userIdChanged)
|
||||
Q_PROPERTY(QJsonObject deviceProfile READ deviceProfile NOTIFY deviceProfileChanged)
|
||||
Q_PROPERTY(QString version READ version)
|
||||
Q_PROPERTY(WebSocket *websocket READ websocket NOTIFY websocketChanged)
|
||||
|
||||
/*QNetworkReply *handleRequest(QString path, QStringList sort, Pagination *pagination,
|
||||
QVariantMap filters, QStringList fields, QStringList expand, QString id);*/
|
||||
|
@ -111,6 +112,7 @@ public:
|
|||
QJsonObject &deviceProfile() { return m_deviceProfile; }
|
||||
QJsonObject &playbackDeviceProfile() { return m_playbackDeviceProfile; }
|
||||
QString version() const;
|
||||
WebSocket *websocket() const { return m_webSocket; }
|
||||
|
||||
/**
|
||||
* @brief Sets the error handler of a reply to this classes default error handler
|
||||
|
@ -146,10 +148,8 @@ signals:
|
|||
|
||||
void userIdChanged(QString userId);
|
||||
|
||||
void itemFetched(const QString &itemId, const QJsonObject &result);
|
||||
void itemFetchFailed(const QString &itemId, const QNetworkReply::NetworkError error);
|
||||
|
||||
void deviceProfileChanged();
|
||||
void websocketChanged(WebSocket *newWebsocket);
|
||||
|
||||
/**
|
||||
* @brief onUserDataChanged Emitted when the user data of an item is changed on the server.
|
||||
|
@ -179,8 +179,6 @@ public slots:
|
|||
*/
|
||||
void deleteSession();
|
||||
|
||||
void fetchItem(const QString &id);
|
||||
|
||||
/**
|
||||
* @brief Shares the capabilities of this device to the server.
|
||||
*/
|
||||
|
|
|
@ -367,6 +367,7 @@ public:
|
|||
Q_PROPERTY(QJsonObject imageTags MEMBER m_imageTags NOTIFY imageTagsChanged)
|
||||
Q_PROPERTY(QStringList backdropImageTags MEMBER m_backdropImageTags NOTIFY backdropImageTagsChanged)
|
||||
Q_PROPERTY(QJsonObject imageBlurHashes MEMBER m_imageBlurHashes NOTIFY imageBlurHashesChanged)
|
||||
Q_PROPERTY(QString mediaType MEMBER m_mediaType READ mediaType NOTIFY mediaTypeChanged)
|
||||
Q_PROPERTY(int width MEMBER m_width NOTIFY widthChanged)
|
||||
Q_PROPERTY(int height MEMBER m_height NOTIFY heightChanged)
|
||||
|
||||
|
@ -406,6 +407,7 @@ public:
|
|||
void setRecursiveItemCount(int newRecursiveItemCount) { m_recursiveItemCount = newRecursiveItemCount; emit recursiveItemCountChanged(newRecursiveItemCount); }
|
||||
int childCount() const { return m_childCount.value_or(-1); }
|
||||
void setChildCount(int newChildCount) { m_childCount = newChildCount; emit childCountChanged(newChildCount); }
|
||||
QString mediaType() const { return m_mediaType; }
|
||||
|
||||
//QQmlListProperty<MediaStream> mediaStreams() { return toReadOnlyQmlListProperty<MediaStream>(m_mediaStreams); }
|
||||
//QList<QObject *> mediaStreams() { return *reinterpret_cast<QList<QObject *> *>(&m_mediaStreams); }
|
||||
|
@ -460,6 +462,7 @@ signals:
|
|||
void imageTagsChanged();
|
||||
void backdropImageTagsChanged();
|
||||
void imageBlurHashesChanged();
|
||||
void mediaTypeChanged(const QString &newMediaType);
|
||||
void widthChanged(int newWidth);
|
||||
void heightChanged(int newHeight);
|
||||
|
||||
|
@ -520,6 +523,7 @@ protected:
|
|||
QJsonObject m_imageTags;
|
||||
QStringList m_backdropImageTags;
|
||||
QJsonObject m_imageBlurHashes;
|
||||
QString m_mediaType;
|
||||
int m_width;
|
||||
int m_height;
|
||||
|
||||
|
|
|
@ -65,6 +65,7 @@ public:
|
|||
Q_PROPERTY(int subtitleIndex MEMBER m_subtitleIndex NOTIFY subtitleIndexChanged)
|
||||
Q_PROPERTY(bool resumePlayback MEMBER m_resumePlayback NOTIFY resumePlaybackChanged)
|
||||
Q_PROPERTY(QObject* mediaPlayer READ mediaPlayer WRITE setMediaPlayer NOTIFY mediaPlayerChanged)
|
||||
Q_PROPERTY(PlayMethod playMethod READ playMethod NOTIFY playMethodChanged)
|
||||
|
||||
Item *item() const { return m_item; }
|
||||
void setItem(Item *newItem);
|
||||
|
@ -75,6 +76,7 @@ public:
|
|||
void setMediaPlayer(QObject *qmlMediaPlayer);
|
||||
|
||||
QString streamUrl() const { return m_streamUrl; }
|
||||
PlayMethod playMethod() const { return m_playMethod; }
|
||||
signals:
|
||||
void itemChanged(Item *newItemId);
|
||||
void streamUrlChanged(const QString &newStreamUrl);
|
||||
|
@ -83,6 +85,7 @@ signals:
|
|||
void subtitleIndexChanged(int subtitleIndex);
|
||||
void mediaPlayerChanged(QObject *newMediaPlayer);
|
||||
void resumePlaybackChanged(bool newResumePlayback);
|
||||
void playMethodChanged(PlayMethod newPlayMethod);
|
||||
|
||||
public slots:
|
||||
void updatePlaybackInfo();
|
||||
|
@ -103,7 +106,7 @@ private:
|
|||
qint64 m_oldPosition = 0;
|
||||
qint64 m_stopPosition = 0;
|
||||
QMediaPlayer::State m_oldState = QMediaPlayer::StoppedState;
|
||||
PlayMethod m_playMethod;
|
||||
PlayMethod m_playMethod = Transcode;
|
||||
QObject *m_qmlMediaPlayer = nullptr;
|
||||
QMediaPlayer * m_mediaPlayer = nullptr;
|
||||
bool m_resumePlayback = true;
|
||||
|
|
|
@ -58,7 +58,12 @@ public:
|
|||
KeepAlive,
|
||||
UserDataChanged
|
||||
};
|
||||
Q_PROPERTY(QAbstractSocket::SocketState state READ state NOTIFY stateChanged)
|
||||
Q_ENUM(MessageType)
|
||||
|
||||
QAbstractSocket::SocketState state() const {
|
||||
return m_webSocket.state();
|
||||
}
|
||||
public slots:
|
||||
void open();
|
||||
private slots:
|
||||
|
@ -67,14 +72,18 @@ private slots:
|
|||
void onDisconnected();
|
||||
|
||||
void sendKeepAlive();
|
||||
void onWebsocketStateChanged(QAbstractSocket::SocketState newState) { emit stateChanged(newState); }
|
||||
signals:
|
||||
void commandReceived(QString arts, QVariantMap args);
|
||||
void stateChanged(QAbstractSocket::SocketState newState);
|
||||
|
||||
protected:
|
||||
ApiClient *m_apiClient;
|
||||
QWebSocket m_webSocket;
|
||||
|
||||
QTimer m_keepAliveTimer;
|
||||
QTimer m_retryTimer;
|
||||
int m_reconnectAttempt = 0;
|
||||
|
||||
|
||||
void setupKeepAlive(int data);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue