File indexing completed on 2024-04-28 04:49:19

0001 /*
0002  * SPDX-FileCopyrightText: 2020 George Florea Bănuș <georgefb899@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #ifndef MPVOBJECT_H
0008 #define MPVOBJECT_H
0009 
0010 #include <MpvAbstractItem>
0011 
0012 class ChaptersModel;
0013 class PlaylistModel;
0014 class PlaylistProxyModel;
0015 class TracksModel;
0016 class MpvRenderer;
0017 
0018 class MpvItem : public MpvAbstractItem
0019 {
0020     Q_OBJECT
0021     QML_ELEMENT
0022 
0023 public:
0024     explicit MpvItem(QQuickItem *parent = nullptr);
0025     ~MpvItem() = default;
0026 
0027     enum class AsyncIds {
0028         None,
0029         SavePosition,
0030         Screenshot,
0031         TrackList,
0032         ChapterList,
0033         VideoId,
0034     };
0035     Q_ENUM(AsyncIds)
0036 
0037     Q_PROPERTY(PlaylistModel *playlistModel READ playlistModel WRITE setPlaylistModel NOTIFY playlistModelChanged)
0038     PlaylistModel *playlistModel();
0039     void setPlaylistModel(PlaylistModel *model);
0040 
0041     Q_PROPERTY(PlaylistProxyModel *playlistProxyModel READ playlistProxyModel WRITE setPlaylistProxyModel NOTIFY playlistProxyModelChanged)
0042     PlaylistProxyModel *playlistProxyModel();
0043     void setPlaylistProxyModel(PlaylistProxyModel *model);
0044 
0045     Q_PROPERTY(TracksModel *audioTracksModel READ audioTracksModel NOTIFY audioTracksModelChanged)
0046     TracksModel *audioTracksModel() const;
0047 
0048     Q_PROPERTY(TracksModel *subtitleTracksModel READ subtitleTracksModel NOTIFY subtitleTracksModelChanged)
0049     TracksModel *subtitleTracksModel() const;
0050 
0051     Q_PROPERTY(ChaptersModel *chaptersModel READ chaptersModel WRITE setChaptersModel NOTIFY chaptersModelChanged)
0052     ChaptersModel *chaptersModel() const;
0053     void setChaptersModel(ChaptersModel *_chaptersModel);
0054 
0055     /**
0056      * when playlist repeat is turned off the last file in the playlist is reloaded
0057      * this property is used to pause the player
0058      */
0059     Q_PROPERTY(bool isFileReloaded READ isFileReloaded WRITE setIsFileReloaded NOTIFY isFileReloadedChanged)
0060     bool isFileReloaded() const;
0061     void setIsFileReloaded(bool _isFileReloaded);
0062 
0063     Q_PROPERTY(QString mediaTitle READ mediaTitle NOTIFY mediaTitleChanged)
0064     QString mediaTitle();
0065 
0066     Q_PROPERTY(double position READ position WRITE setPosition NOTIFY positionChanged)
0067     double position();
0068     void setPosition(double value);
0069 
0070     Q_PROPERTY(double duration READ duration NOTIFY durationChanged)
0071     double duration();
0072 
0073     Q_PROPERTY(double remaining READ remaining NOTIFY remainingChanged)
0074     double remaining();
0075 
0076     Q_PROPERTY(QString formattedPosition READ formattedPosition NOTIFY positionChanged)
0077     QString formattedPosition() const;
0078 
0079     Q_PROPERTY(QString formattedDuration READ formattedDuration NOTIFY durationChanged)
0080     QString formattedRemaining() const;
0081 
0082     Q_PROPERTY(QString formattedRemaining READ formattedRemaining NOTIFY remainingChanged)
0083     QString formattedDuration() const;
0084 
0085     /**
0086      * cache the watch later time position to be used by the seekToWatchLaterPosition action
0087      * useful when resuming playback is disabled
0088      */
0089     Q_PROPERTY(double watchLaterPosition READ watchLaterPosition WRITE setWatchLaterPosition NOTIFY watchLaterPositionChanged)
0090     double watchLaterPosition() const;
0091     void setWatchLaterPosition(double _watchLaterPosition);
0092 
0093     Q_PROPERTY(double watchPercentage READ watchPercentage WRITE setWatchPercentage NOTIFY watchPercentageChanged)
0094     double watchPercentage();
0095     void setWatchPercentage(double value);
0096 
0097     Q_PROPERTY(bool pause READ pause WRITE setPause NOTIFY pauseChanged)
0098     bool pause();
0099     void setPause(bool value);
0100 
0101     Q_PROPERTY(bool mute READ mute WRITE setMute NOTIFY muteChanged)
0102     bool mute();
0103     void setMute(bool value);
0104 
0105     Q_PROPERTY(int volume READ volume WRITE setVolume NOTIFY volumeChanged)
0106     int volume();
0107     void setVolume(int value);
0108 
0109     Q_PROPERTY(int volumeMax READ volumeMax WRITE setVolumeMax NOTIFY volumeMaxChanged)
0110     int volumeMax();
0111     void setVolumeMax(int value);
0112 
0113     Q_PROPERTY(int chapter READ chapter WRITE setChapter NOTIFY chapterChanged)
0114     int chapter();
0115     void setChapter(int value);
0116 
0117     Q_PROPERTY(int audioId READ audioId WRITE setAudioId NOTIFY audioIdChanged)
0118     int audioId();
0119     void setAudioId(int value);
0120 
0121     Q_PROPERTY(int subtitleId READ subtitleId WRITE setSubtitleId NOTIFY subtitleIdChanged)
0122     int subtitleId();
0123     void setSubtitleId(int value);
0124 
0125     Q_PROPERTY(int secondarySubtitleId READ secondarySubtitleId WRITE setSecondarySubtitleId NOTIFY secondarySubtitleIdChanged)
0126     int secondarySubtitleId();
0127     void setSecondarySubtitleId(int value);
0128 
0129     Q_PROPERTY(int videoWidth READ videoWidth NOTIFY videoWidthChanged)
0130     int videoWidth();
0131 
0132     Q_PROPERTY(int videoHeight READ videoHeight NOTIFY videoHeightChanged)
0133     int videoHeight();
0134 
0135     /**
0136      * Whether the file finished loading and it's safe to start certain events,
0137      * like auto skipping chapters, which otherwise skips wrong chapter due to the multithreaded code
0138      */
0139     Q_PROPERTY(bool finishedLoading READ finishedLoading WRITE setFinishedLoading NOTIFY finishedLoadingChanged)
0140     bool finishedLoading() const;
0141     void setFinishedLoading(bool _finishedLoading);
0142 
0143     Q_PROPERTY(QUrl currentUrl READ currentUrl NOTIFY currentUrlChanged)
0144     QUrl currentUrl() const;
0145 
0146     Q_PROPERTY(bool isReady READ isReady WRITE setIsReady NOTIFY isReadyChanged)
0147     bool isReady() const;
0148     void setIsReady(bool _isReady);
0149 
0150     Q_INVOKABLE void loadFile(const QString &file);
0151     Q_INVOKABLE void userCommand(const QString &commandString);
0152 
0153 Q_SIGNALS:
0154     void audioTracksModelChanged();
0155     void subtitleTracksModelChanged();
0156     void playlistModelChanged();
0157     void playlistProxyModelChanged();
0158     void chaptersModelChanged();
0159     void finishedLoadingChanged();
0160     void playlistTitleChanged();
0161     void playlistUrlChanged();
0162     void isFileReloadedChanged();
0163     void mediaTitleChanged();
0164     void currentUrlChanged();
0165     void watchPercentageChanged();
0166     void positionChanged();
0167     void watchLaterPositionChanged();
0168     void durationChanged();
0169     void remainingChanged();
0170     void pauseChanged();
0171     void muteChanged();
0172     void volumeChanged();
0173     void volumeMaxChanged();
0174     void chapterChanged();
0175     void chapterListChanged();
0176     void audioIdChanged();
0177     void subtitleIdChanged();
0178     void secondarySubtitleIdChanged();
0179     void isReadyChanged();
0180     void fileStarted();
0181     void fileLoaded();
0182     void videoReconfig();
0183     void videoWidthChanged();
0184     void videoHeightChanged();
0185     void syncConfigValue(QString path, QString group, QString key, QVariant value);
0186 
0187     void osdMessage(const QString &text);
0188     void addToRecentFiles(const QUrl &url);
0189 
0190     // signals used for mpris
0191     void raise();
0192     void playNext();
0193     void playPrevious();
0194     void openUri(const QString &uri);
0195 
0196 private:
0197     void initProperties();
0198     void setupConnections();
0199     void onReady();
0200     void onEndFile(const QString &reason);
0201     void onPropertyChanged(const QString &property, const QVariant &value);
0202     void saveTimePosition();
0203     double loadTimePosition();
0204     void resetTimePosition();
0205     void loadTracks(QList<QVariant> tracks);
0206     void onAsyncReply(const QVariant &data, mpv_event event);
0207     void onChapterChanged();
0208     QString md5(const QString &str);
0209 
0210     TracksModel *m_audioTracksModel;
0211     TracksModel *m_subtitleTracksModel;
0212     QList<QVariant> m_subtitleTracks;
0213     QList<QVariant> m_audioTracks;
0214     QList<int> m_secondsWatched;
0215     double m_watchPercentage{0.0};
0216     PlaylistModel *m_playlistModel;
0217     PlaylistProxyModel *m_playlistProxyModel;
0218 
0219     double m_position{0.0};
0220     QString m_formattedPosition;
0221     double m_remaining{0.0};
0222     QString m_formattedRemaining;
0223     double m_duration{0.0};
0224     QString m_formattedDuration;
0225     QString m_mediaTitle;
0226     bool m_pause{false};
0227     bool m_mute{false};
0228     int m_chapter{0};
0229     int m_volume{0};
0230     int m_volumeMax{100};
0231     int m_audioId{0};
0232     int m_subtitleId{0};
0233     int m_secondarySubtitleId{0};
0234     int m_videoWidth{0};
0235     int m_videoHeight{0};
0236     QList<QVariant> m_chaptersList;
0237 
0238     double m_watchLaterPosition{0.0};
0239     bool m_isFileReloaded{false};
0240     bool m_isReady{false};
0241     QUrl m_currentUrl;
0242     ChaptersModel *m_chaptersModel;
0243     bool m_finishedLoading{false};
0244     QString m_watchLaterPath;
0245 };
0246 
0247 #endif // MPVOBJECT_H