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