File indexing completed on 2024-05-19 04:49:13
0001 /**************************************************************************************** 0002 * Copyright (c) 2009 Alejandro Wainzinger <aikawarazuni@gmail.com> * 0003 * * 0004 * This program is free software; you can redistribute it and/or modify it under * 0005 * the terms of the GNU General Public License as published by the Free Software * 0006 * Foundation; either version 2 of the License, or (at your option) any later * 0007 * version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0010 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0011 * PARTICULAR PURPOSE. See the GNU General Public License for more details. * 0012 * * 0013 * You should have received a copy of the GNU General Public License along with * 0014 * this program. If not, see <http://www.gnu.org/licenses/>. * 0015 ****************************************************************************************/ 0016 0017 #ifndef MEDIADEVICEMETA_H 0018 #define MEDIADEVICEMETA_H 0019 0020 #include "core/meta/Meta.h" 0021 #include "core/meta/Statistics.h" 0022 #include "core/support/Debug.h" 0023 #include "core-impl/collections/mediadevicecollection/support/mediadevicecollection_export.h" 0024 0025 #include <QList> 0026 #include <QMultiMap> 0027 #include <QPointer> 0028 0029 namespace Collections { 0030 class MediaDeviceCollection; 0031 } 0032 0033 0034 namespace Handler { class ArtworkCapability; } 0035 0036 namespace Meta 0037 { 0038 0039 class MediaDeviceTrack; 0040 class MediaDeviceAlbum; 0041 class MediaDeviceArtist; 0042 class MediaDeviceGenre; 0043 class MediaDeviceComposer; 0044 class MediaDeviceYear; 0045 0046 typedef AmarokSharedPointer<MediaDeviceTrack> MediaDeviceTrackPtr; 0047 typedef AmarokSharedPointer<MediaDeviceArtist> MediaDeviceArtistPtr; 0048 typedef AmarokSharedPointer<MediaDeviceAlbum> MediaDeviceAlbumPtr; 0049 typedef AmarokSharedPointer<MediaDeviceGenre> MediaDeviceGenrePtr; 0050 typedef AmarokSharedPointer<MediaDeviceComposer> MediaDeviceComposerPtr; 0051 typedef AmarokSharedPointer<MediaDeviceYear> MediaDeviceYearPtr; 0052 0053 typedef QList<MediaDeviceTrackPtr> MediaDeviceTrackList; 0054 0055 class MEDIADEVICECOLLECTION_EXPORT MediaDeviceTrack : public Meta::Track, public Statistics 0056 { 0057 public: 0058 explicit MediaDeviceTrack( Collections::MediaDeviceCollection *collection ); 0059 ~MediaDeviceTrack() override; 0060 0061 QString name() const override; 0062 0063 QUrl playableUrl() const override; 0064 QString uidUrl() const override; 0065 QString prettyUrl() const override; 0066 QString notPlayableReason() const override; 0067 0068 bool isEditable() const; 0069 0070 AlbumPtr album() const override; 0071 ArtistPtr artist() const override; 0072 GenrePtr genre() const override; 0073 ComposerPtr composer() const override; 0074 YearPtr year() const override; 0075 0076 virtual void setAlbum ( const QString &newAlbum ); 0077 virtual void setAlbumArtist( const QString &newAlbumArtist ); 0078 virtual void setArtist ( const QString &newArtist ); 0079 virtual void setGenre ( const QString &newGenre ); 0080 virtual void setComposer ( const QString &newComposer ); 0081 virtual void setYear ( int newYear ); 0082 0083 virtual QString title() const; 0084 virtual void setTitle( const QString &newTitle ); 0085 0086 QString comment() const override; 0087 virtual void setComment ( const QString &newComment ); 0088 0089 qint64 length() const override; 0090 0091 void setFileSize( int newFileSize ); 0092 int filesize() const override; 0093 0094 int bitrate() const override; 0095 virtual void setBitrate( int newBitrate ); 0096 0097 int sampleRate() const override; 0098 virtual void setSamplerate( int newSamplerate ); 0099 0100 qreal bpm() const override; 0101 virtual void setBpm( const qreal newBpm ); 0102 0103 int trackNumber() const override; 0104 virtual void setTrackNumber ( int newTrackNumber ); 0105 0106 int discNumber() const override; 0107 virtual void setDiscNumber ( int newDiscNumber ); 0108 0109 qreal replayGain( ReplayGainTag mode ) const override; 0110 /* Set the track replay gain (other types unsupported) */ 0111 void setReplayGain( qreal newReplayGain ); 0112 0113 QString type() const override; 0114 void prepareToPlay() override; 0115 0116 bool inCollection() const override; 0117 Collections::Collection* collection() const override; 0118 0119 TrackEditorPtr editor() override; 0120 StatisticsPtr statistics() override; 0121 0122 // Meta::Statistics methods 0123 double score() const override; 0124 void setScore ( double newScore ) override; 0125 0126 int rating() const override; 0127 void setRating ( int newRating ) override; 0128 0129 QDateTime lastPlayed() const override; 0130 void setLastPlayed( const QDateTime &newTime ) override; 0131 0132 // firstPlayed() not available in any media device 0133 0134 int playCount() const override; 0135 void setPlayCount( const int newCount ) override; 0136 0137 //MediaDeviceTrack specific methods 0138 0139 // These methods are for Handler 0140 void setAlbum( MediaDeviceAlbumPtr album ); 0141 void setArtist( MediaDeviceArtistPtr artist ); 0142 void setComposer( MediaDeviceComposerPtr composer ); 0143 void setGenre( MediaDeviceGenrePtr genre ); 0144 void setYear( MediaDeviceYearPtr year ); 0145 0146 void setType( const QString & type ); 0147 0148 void setLength( qint64 length ); 0149 void setPlayableUrl( const QUrl &url) { m_playableUrl = url; } 0150 0151 /** 0152 * Notifies observers about changes to metadata, one of the observers is media 0153 * device handler which writes the changes back to the device. 0154 */ 0155 void commitChanges(); 0156 0157 private: 0158 QPointer<Collections::MediaDeviceCollection> m_collection; 0159 0160 MediaDeviceArtistPtr m_artist; 0161 MediaDeviceAlbumPtr m_album; 0162 MediaDeviceGenrePtr m_genre; 0163 MediaDeviceComposerPtr m_composer; 0164 MediaDeviceYearPtr m_year; 0165 0166 // For MediaDeviceTrack-specific use 0167 0168 QImage m_image; 0169 0170 QString m_comment; 0171 QString m_name; 0172 QString m_type; 0173 int m_bitrate; 0174 int m_filesize; 0175 qint64 m_length; 0176 int m_discNumber; 0177 int m_samplerate; 0178 int m_trackNumber; 0179 int m_playCount; 0180 QDateTime m_lastPlayed; 0181 int m_rating; 0182 qreal m_bpm; 0183 qreal m_replayGain; 0184 QString m_displayUrl; 0185 QUrl m_playableUrl; 0186 }; 0187 0188 class MEDIADEVICECOLLECTION_EXPORT MediaDeviceArtist : public Meta::Artist 0189 { 0190 public: 0191 explicit MediaDeviceArtist( const QString &name ); 0192 ~MediaDeviceArtist() override; 0193 0194 QString name() const override; 0195 0196 TrackList tracks() override; 0197 0198 //MediaDeviceArtist specific methods 0199 virtual void addTrack( MediaDeviceTrackPtr track ); 0200 virtual void remTrack( MediaDeviceTrackPtr track ); 0201 0202 private: 0203 QString m_name; 0204 TrackList m_tracks; 0205 }; 0206 0207 class MEDIADEVICECOLLECTION_EXPORT MediaDeviceAlbum : public Meta::Album 0208 { 0209 public: 0210 MediaDeviceAlbum( Collections::MediaDeviceCollection *collection, const QString &name ); 0211 ~MediaDeviceAlbum() override; 0212 0213 QString name() const override; 0214 0215 bool isCompilation() const override; 0216 void setIsCompilation( bool compilation ); 0217 0218 bool hasAlbumArtist() const override; 0219 ArtistPtr albumArtist() const override; 0220 TrackList tracks() override; 0221 0222 bool hasImage( int size = 0 ) const override; 0223 QImage image( int size = 0 ) const override; 0224 bool canUpdateImage() const override; 0225 void setImage( const QImage &image ) override; 0226 virtual void setImagePath( const QString &path ); 0227 0228 bool hasCapabilityInterface( Capabilities::Capability::Type type ) const override; 0229 Capabilities::Capability* createCapabilityInterface( Capabilities::Capability::Type type ) override; 0230 0231 //MediaDeviceAlbum specific methods 0232 0233 void addTrack( MediaDeviceTrackPtr track ); 0234 void remTrack( MediaDeviceTrackPtr track ); 0235 void setAlbumArtist( MediaDeviceArtistPtr artist ); 0236 0237 private: 0238 QPointer<Collections::MediaDeviceCollection> m_collection; 0239 QPointer<Handler::ArtworkCapability> m_artworkCapability; 0240 0241 QString m_name; 0242 TrackList m_tracks; 0243 bool m_isCompilation; 0244 mutable bool m_hasImagePossibility; 0245 mutable bool m_hasImageChecked; 0246 mutable QImage m_image; 0247 MediaDeviceArtistPtr m_albumArtist; 0248 }; 0249 0250 class MEDIADEVICECOLLECTION_EXPORT MediaDeviceComposer : public Meta::Composer 0251 { 0252 public: 0253 explicit MediaDeviceComposer( const QString &name ); 0254 ~MediaDeviceComposer() override; 0255 0256 QString name() const override; 0257 0258 TrackList tracks() override; 0259 0260 //MediaDeviceComposer specific methods 0261 void addTrack( MediaDeviceTrackPtr track ); 0262 void remTrack( MediaDeviceTrackPtr track ); 0263 0264 private: 0265 QString m_name; 0266 TrackList m_tracks; 0267 }; 0268 0269 class MEDIADEVICECOLLECTION_EXPORT MediaDeviceGenre : public Meta::Genre 0270 { 0271 public: 0272 explicit MediaDeviceGenre( const QString &name ); 0273 ~MediaDeviceGenre() override; 0274 0275 QString name() const override; 0276 0277 TrackList tracks() override; 0278 0279 //MediaDeviceGenre specific methods 0280 void addTrack( MediaDeviceTrackPtr track ); 0281 void remTrack( MediaDeviceTrackPtr track ); 0282 private: 0283 QString m_name; 0284 TrackList m_tracks; 0285 }; 0286 0287 0288 0289 class MEDIADEVICECOLLECTION_EXPORT MediaDeviceYear : public Meta::Year 0290 { 0291 public: 0292 explicit MediaDeviceYear( const QString &name ); 0293 ~MediaDeviceYear() override; 0294 0295 QString name() const override; 0296 0297 TrackList tracks() override; 0298 0299 //MediaDeviceYear specific methods 0300 void addTrack( MediaDeviceTrackPtr track ); 0301 void remTrack( MediaDeviceTrackPtr track ); 0302 0303 private: 0304 QString m_name; 0305 TrackList m_tracks; 0306 }; 0307 0308 } 0309 0310 #endif 0311