20#ifndef JELLYFIN_API_MODEL
21#define JELLYFIN_API_MODEL
26#include <QAbstractListModel>
29#include <QFutureWatcher>
32#include <QJsonDocument>
34#include <QtConcurrent/QtConcurrent>
36#include <QQmlParserStatus>
69 Q_INTERFACES(QQmlParserStatus)
91 Q_INVOKABLE
virtual void reload() {};
133 if (this->m_status != newStatus) {
134 this->m_status = newStatus;
136 if (this->m_status == ViewModel::ModelStatus::Ready) {
171 loadMore(ViewModel::ModelStatus::Loading);
178 loadMore(ViewModel::ModelStatus::LoadingMore);
208template <
class T,
class R>
211 qDebug() <<
"extractRecords not implemented for type " <<
typeid(
R).name();
218 qDebug() <<
"extractTotalRecourdCount not implemented for type " <<
typeid(
R).name();
225 qDebug() <<
"setRequestLimit not implemented for type " <<
typeid(P).name();
235 qDebug() <<
"setRequestStartIndex not implemented for type " <<
typeid(P).name();
239#ifndef JELLYFIN_APIMODEL_CPP
241extern template void setRequestLimit(Loader::GetUserViewsParams ¶ms,
int limit);
248extern template void setRequestLimit(Loader::GetLatestMediaParams ¶ms,
int limit);
251extern template void setRequestLimit(Loader::GetItemsParams ¶ms,
int limit);
254extern template void setRequestLimit(Loader::GetResumeItemsParams ¶ms,
int limit);
257extern template void setRequestLimit(Loader::GetPublicUsersParams ¶ms,
int limit);
260extern template void setRequestLimit(Loader::GetNextUpParams ¶ms,
int limit);
263extern template void setRequestLimit(Loader::GetAlbumArtistsParams ¶ms,
int limit);
266extern template void setRequestLimit(Loader::GetLiveTvChannelsParams ¶ms,
int limit);
281template <
class T,
class D,
class R,
class P>
300 && suggestedModelStatus == ViewModel::ModelStatus::LoadingMore) {
307 if (suggestedModelStatus == ViewModel::ModelStatus::LoadingMore && this->
m_explicitLimitSet) {
336 if (totalRecordCount < 0) {
337 totalRecordCount = records.size();
340 models.reserve(records.size());
343 for (
int i = 0; i < records.size(); i++) {
344 models.append(
new T(records[i],
m_loader->apiClient()));
346 this->
setStatus(ViewModel::ModelStatus::Ready);
352 }
catch(QException &e) {
353 qWarning() <<
"Error while loading data: " << e.what();
354 this->
setStatus(ViewModel::ModelStatus::Error);
360 this->
setStatus(ViewModel::ModelStatus::Error);
369 : QAbstractListModel (parent) {}
381 if (oldLoader !=
nullptr) {
383 disconnect(oldLoader,
nullptr,
this,
nullptr);
387 virtual void reload() = 0;
439 int rowCount(
const QModelIndex &index)
const override {
440 if (!index.isValid())
return m_array.size();
445 QSharedPointer<T>
at(
int index)
const {
return m_array.at(index); }
453 void insert(
int index, QSharedPointer<T>
object) {
454 Q_ASSERT(index >= 0 && index <=
size());
455 this->beginInsertRows(QModelIndex(), index, index);
457 this->endInsertRows();
464 this->beginInsertRows(QModelIndex(), index, index + objects.size() - 1);
466 this->endInsertRows();
470 return m_array.mid(pos, length);
474 Q_ASSERT(index <
size());
475 this->beginRemoveRows(QModelIndex(), index, index);
477 this->endRemoveRows();
481 this->beginRemoveRows(QModelIndex(), from ,
m_array.size());
482 while (
m_array.size() != from) {
485 this->endRemoveRows();
489 int idx =
m_array.indexOf(
object);
496 this->beginResetModel();
498 this->endResetModel();
509 if (parent.isValid())
return false;
510 if (
m_loader ==
nullptr)
return false;
513 virtual void fetchMore(
const QModelIndex &parent)
override {
514 if (parent.isValid())
return;
526 if (castedLoader !=
nullptr) {
533 qWarning() <<
"Somehow set a BaseModelLoader on ApiModel instead of a ModelLoader<T>";
550 std::pair<QList<T*>,
int> result =
m_loader->result();
551 if (result.second == -1) {
553 }
else if (result.second ==
m_array.size()) {
555 for (
auto it = result.first.begin(); it != result.first.end(); it++) {
556 append(QSharedPointer<T>(*it));
558 }
else if (result.second <
m_array.size()){
561 for (
auto it = result.first.begin(); it != result.first.end(); it++) {
562 append(QSharedPointer<T>(*it));
566 qWarning() <<
"Retrieved data from loader at position bigger than size()";
570 QMetaObject::Connection m_futureWatcherConnection;
An Api client for Jellyfin. Handles requests and authentication.
Definition apiclient.h:90
void removeAt(int index)
Definition apimodel.h:473
virtual bool canFetchMore(const QModelIndex &parent) const override
Definition apimodel.h:508
void clear() override
Definition apimodel.h:495
void removeUntilEnd(int from)
Definition apimodel.h:480
QList< QSharedPointer< T > > m_array
Definition apimodel.h:545
void loadingFinished() override
Definition apimodel.h:548
void setLoader(BaseModelLoader *newLoader)
Definition apimodel.h:524
ApiModel(QObject *parent=nullptr)
Creates a new basemodel.
Definition apimodel.h:434
int rowCount(const QModelIndex &index) const override
Definition apimodel.h:439
void append(QList< QSharedPointer< T > > &objects)
Definition apimodel.h:462
void removeOne(QSharedPointer< T > object)
Definition apimodel.h:488
QList< T * > mid(int pos, int length=-1)
Definition apimodel.h:469
void append(QSharedPointer< T > object)
Definition apimodel.h:460
int size() const
Definition apimodel.h:449
void insert(int index, QSharedPointer< T > object)
Definition apimodel.h:453
const QList< QSharedPointer< T > > & toList()
Definition apimodel.h:501
void reload() override
Definition apimodel.h:537
virtual void fetchMore(const QModelIndex &parent) override
Definition apimodel.h:513
BaseModelLoader * loader() const override
Definition apimodel.h:520
QSharedPointer< T > at(int index) const
Definition apimodel.h:445
ModelLoader< T > * m_loader
Definition apimodel.h:546
void disconnectOldLoader(BaseModelLoader *oldLoader)
Definition apimodel.h:380
virtual void reload()=0
Definition apimodel.cpp:93
virtual void loadingFinished()=0
BaseApiModel(QObject *parent=nullptr)
Definition apimodel.h:368
BaseModelLoader * loader
Definition apimodel.h:371
virtual void setLoader(BaseModelLoader *newLoader)
Definition apimodel.h:374
void modelShouldClear()
Emitted when the model should clear itself.
int limit() const
Definition apimodel.h:81
int m_totalRecordCount
Definition apimodel.h:125
int m_limit
Definition apimodel.h:123
void setLimit(int newLimit)
Definition apimodel.cpp:65
bool m_isBeingParsed
Definition apimodel.h:116
BaseModelLoader(QObject *parent=nullptr)
Definition apimodel.cpp:37
int limit
Definition apimodel.h:75
int m_startIndex
Definition apimodel.h:124
void limitChanged(int newLimit)
ApiClient * apiClient
Definition apimodel.h:73
virtual void classBegin() override
Definition apimodel.cpp:40
bool m_needsAuthentication
Definition apimodel.h:119
void setAutoReload(bool newAutoReload)
Definition apimodel.cpp:71
bool autoReload
Definition apimodel.h:76
ViewModel::ModelStatus status() const
Definition apimodel.h:86
const int DEFAULT_LIMIT
Definition apimodel.h:127
Jellyfin::ViewModel::ModelStatusClass::Value status
Definition apimodel.h:74
bool m_explicitLimitSet
Definition apimodel.h:126
void emitItemsLoaded()
Definition apimodel.h:129
void autoReloadIfNeeded()
Definition apimodel.cpp:49
virtual Q_INVOKABLE void reload()
Clears and reloads the model.
Definition apimodel.h:91
void apiClientChanged(ApiClient *newApiClient)
void emitModelShouldClear()
Definition apimodel.h:128
void autoReloadChanged(bool newAutoReload)
bool m_autoReload
Definition apimodel.h:118
ViewModel::ModelStatus m_status
Definition apimodel.h:131
virtual void componentComplete() override
Definition apimodel.cpp:44
void setApiClient(ApiClient *newApiClient)
Definition apimodel.cpp:56
void setStatus(ViewModel::ModelStatus newStatus)
Definition apimodel.h:132
bool m_manualLimitSet
Definition apimodel.h:120
virtual bool canReload() const
Determines if this model is able to reload.
Definition apimodel.cpp:82
ApiClient * m_apiClient
Definition apimodel.h:117
bool autoReload() const
Definition apimodel.h:83
void loaderError(QString error)
Definition apimodel.h:358
QScopedPointer< Support::Loader< QList< DTO::UserDto >, Jellyfin::Loader::GetPublicUsersParams > > m_loader
Definition apimodel.h:327
Jellyfin::Loader::GetPublicUsersParams m_parameters
Definition apimodel.h:328
void loaderReady()
Definition apimodel.h:330
void loadMore(ViewModel::ModelStatus suggestedModelStatus) override
Loads data from the given offset with a maximum count of limit. The itemsLoaded() signal is emitted w...
Definition apimodel.h:290
LoaderModelLoader(Support::Loader< R, P > *loader, QObject *parent=nullptr)
Definition apimodel.h:284
Definition apimodel.h:158
virtual bool canLoadMore() const
Definition apimodel.h:181
virtual void loadMore(ViewModel::ModelStatus suggestedStatus)=0
Loads data from the given offset with a maximum count of limit. The itemsLoaded() signal is emitted w...
void reload() override
Clears and reloads the model.
Definition apimodel.h:164
void loadMore()
Definition apimodel.h:174
std::pair< QList< T * >, int > m_result
Definition apimodel.h:202
std::pair< QList< T * >, int > && result()
Holds the result. Moves it result to the caller and therefore can be only called once when the itemsL...
Definition apimodel.h:191
ModelLoader(QObject *parent=nullptr)
Definition apimodel.h:160
void error(QString message=QString())
Emitted when an error has occurred during loading and no result is available.
void ready()
Emitted when data was successfully loaded.
Definition mediaplayer2.h:20
Definition activitylog.h:45
Definition accessschedule.h:128
Contains all types exposed to QML.
ModelStatusClass::Value ModelStatus
Definition modelstatus.h:44
QList< T > extractRecords(const R &result)
Definition apimodel.h:209
void setRequestLimit(P ¶meters, int limit)
Definition apimodel.h:222
int extractTotalRecordCount(const R &result)
Definition apimodel.h:216
bool setRequestStartIndex(P ¶meters, int startIndex)
Definition apimodel.h:232
void writeRequestTypesFile R(File headerFile, File implementationFile, R endpoints) if(is(ElementType!R
Definition openapigenerator.d:279
Q_DECLARE_LOGGING_CATEGORY(jellyfinWebSocket)