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