/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef ARCHIVEMODEL_H #define ARCHIVEMODEL_H #include #include #include #include #include #include #include "smtreemodel.h" class ArchiveCollector; class ArchiveModel : public SmTreeModel { Q_OBJECT public: enum CustomRoles { NameRole = Qt::UserRole + 1, GenericIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, CountRole = Qt::UserRole + 8 }; enum Fields { Name = 0, GenericId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4, Favorite = 5, Subtitle = 6, Count = 7 }; enum MetadataFields { ReleaseYear = 0, Source = 1, Subject = 2, ReleaseGroup = 3, EncoderOpts = 4, Comment = 5, Passes = 6, Added = 7 }; enum { MetadataNumFields = 8 }; enum Order { SeriesName, Actor, Genre, Local, FavoriteOrder, NoOrder }; enum { NumFields = 8 }; enum NodeType { SeriesNode = 1, SeriesPartNode = 2, GenreNode = 4, ActorNode = 8, AllNodes = 15 }; explicit ArchiveModel(const QStringList &headers, QObject *parent = 0); virtual ~ArchiveModel(); virtual Qt::ItemFlags flags(const QModelIndex &index) const; virtual Qt::DropActions supportedDragActions() const; const QStringList availableOrders() const; const QHash availableOrdersHash() const { return mAvailableOrders; } virtual QVariant data(const QModelIndex &index, int role) const; virtual bool setData(const QModelIndex &idx, const QVariant &value, int role); virtual bool removeNode(const QModelIndex &idx); QStringList indexToPath(const QModelIndex &idx) const; QModelIndexList pathToIndex(const QStringList &path) const; QSet seriesPartIds(const QModelIndex &idx) const; QStringList actors(const QSet &partIds) const; QStringList allActors() const; void setActors(int partId, const QStringList &actors); QStringList genres(const QSet &genreIds) const; QStringList allGenres() const; void setGenres(int partId, const QStringList &genres); QList metadataList(int partId) const; void setMetadata(int partId, const QList &data); bool setPartNo(int partId, int newPartId, const QString &subtitle); bool setFavorite(int partId, bool favorite); void addFiles(int partId, const QStringList files); void removeFiles(const QList fileIds); bool deleteSeriesPart(int partId); bool deleteSeries(int seriesId); bool addSeriesPart(int partno, QString subtitle, const QModelIndex &parent); int seriesPartIdFromMd5(const QString &md5); signals: void needRefresh(); void databaseError(const QString &error); void message(const QString &msg); void windowTitle(const QString &title); public slots: void setOrder(int order); void setOrder(const QString &order); void refresh(); void readConfig(); void setWindowTitle(); private slots: void collectorFinished(QObject *thread); private: void emitDatabaseError(const QSqlError &e); void writeCache(int o, SmTreeItem *rItem); void writeRecursive(SmTreeItem *start, QDataStream &stream); void writeItem(SmTreeItem *item, QDataStream &stream); SmTreeItem *readCache(int o); SmTreeItem *readItem(QDataStream &stream) const; const QString cacheFile(int o) const; QSqlDatabase mDb; QHash mAvailableOrders; QList mCollectors; QHash mNodeIcons; QMutex mCacheMx; QMutex mRootAccessMx; int mOrder; }; class ArchiveFilesModel : public SmTreeModel { Q_OBJECT public: enum CustomRoles { ExpansionRole = Qt::UserRole + 1, SeriesPartIdRole = Qt::UserRole + 2, FilenameRole = Qt::UserRole + 3, Md5SumRole = Qt::UserRole + 4, SizeRole = Qt::UserRole + 5, DvdNoRole = Qt::UserRole + 6, FileTypeRole = Qt::UserRole + 7, FileNumberRole = Qt::UserRole + 8, QualityRole = Qt::UserRole + 9, FileIdRole = Qt::UserRole + 10, SizeDurRole = Qt::UserRole + 11, FullPathRole = Qt::UserRole + 12, SeriesNameRole = Qt::UserRole + 13, SeriesPartRole = Qt::UserRole + 14, SubtitleRole = Qt::UserRole + 15 }; enum Fields { Expansion = 0, SeriesPartId = 1, Filename = 2, Md5Sum = 3, Size = 4, DvdNo = 5, FileType = 6, FileNumber = 7, Quality = 8, FileId = 9, SizeDur = 10, FullPath = 11, SeriesName = 12, SeriesPart = 13, Subtitle = 14 }; enum { NumFields = 15 }; explicit ArchiveFilesModel(const QStringList &headers, QObject *parent = 0); virtual QVariant data(const QModelIndex &index, int role) const; virtual bool setData(const QModelIndex &idx, const QVariant &value, int role); virtual Qt::ItemFlags flags(const QModelIndex &index) const; int nextDvd() const; bool isMovie(const QModelIndex &idx) const; void populate(const QSet &seriesPartIds); QStringList filesForSeriespart(int seriesPartId) const; void updateSeriesPartForFile(const QString &md5sum, int newSeriesPart); quint64 totalDuration() const { return mTotalDuration; } quint64 totalSize() const { return mTotalSize; } int movieFilesCount() const { return mTotalMovies; } int otherFilesCount() const { return mTotalOthers; } static bool hasFile(const QString &md5); static bool setDvdNo(const QString &md5, int dvdno); public slots: void refresh(); void readConfig(); private: QSet mSeriesPartIds; QHash mRoleDbColumnMap; QSqlDatabase mDb; quint64 mTotalSize; quint64 mTotalDuration; int mTotalMovies; int mTotalOthers; }; class ArchiveCollector : public QThread { Q_OBJECT public: explicit ArchiveCollector(int numFields, int order, QObject *parent = 0); SmTreeItem *rootItem(); int sortOrder() const { return mSortOrder; } void setCancelled(bool cancel); bool isCancelled() const { return mCancelled; } signals: void message(const QString message); protected: virtual void run(); private: SmTreeItem *copyRecursive(SmTreeItem *item, SmTreeItem *parent); void populateBySeriesName(); void populateByGenre(); void populateByActor(); void populateByLocal(); void populateByFavorite(); void fetchChildren(SmTreeItem *parent); void fetchSeries(const QVariant &id, SmTreeItem *parent); void fetchParts(const QVariant &id, SmTreeItem *parent); bool checkCancelled(); QSqlDatabase mDb; SmTreeItem *mRootItem; QMutex mAccessMx; QMutex mCancelledMx; int mNumFields; int mSortOrder; bool mCancelled; }; #endif // ARCHIVEMODEL_H