1 /****************************************************************************************
2  * Copyright (c) 2009 Nikolaj Hald Nielsen <nhn@kde.org>                                *
3  *                                                                                      *
4  * This program is free software; you can redistribute it and/or modify it under        *
5  * the terms of the GNU General Public License as published by the Free Software        *
6  * Foundation; either version 2 of the License, or (at your option) any later           *
7  * version.                                                                             *
8  *                                                                                      *
9  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
10  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
11  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
12  *                                                                                      *
13  * You should have received a copy of the GNU General Public License along with         *
14  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
15  ****************************************************************************************/
16 
17 #ifndef TIMECODEMETA_H
18 #define TIMECODEMETA_H
19 
20 #include "core/meta/Meta.h"
21 #include "core/meta/TrackEditor.h"
22 
23 
24 namespace Meta {
25 
26     class TimecodeTrack;
27     class TimecodeAlbum;
28     class TimecodeArtist;
29     class TimecodeGenre;
30     class TimecodeComposer;
31     class TimecodeYear;
32 
33     typedef AmarokSharedPointer<TimecodeTrack> TimecodeTrackPtr;
34     typedef AmarokSharedPointer<TimecodeArtist> TimecodeArtistPtr;
35     typedef AmarokSharedPointer<TimecodeAlbum> TimecodeAlbumPtr;
36     typedef AmarokSharedPointer<TimecodeGenre> TimecodeGenrePtr;
37     typedef AmarokSharedPointer<TimecodeComposer> TimecodeComposerPtr;
38     typedef AmarokSharedPointer<TimecodeYear> TimecodeYearPtr;
39 
40 
41 class TimecodeTrack : public Track, public TrackEditor
42 {
43 public:
44     TimecodeTrack( const QString &name, const QUrl &url, qint64 start, qint64 end );
45     ~TimecodeTrack() override;
46 
47     QString name() const override;
48 
49     QUrl playableUrl() const override;
50     QString uidUrl() const override;
51     QString prettyUrl() const override;
52     QString notPlayableReason() const override;
53 
54     AlbumPtr album() const override;
55     ArtistPtr artist() const override;
56     GenrePtr genre() const override;
57     ComposerPtr composer() const override;
58     YearPtr year() const override;
59 
60     qreal bpm() const override;
61     QString comment() const override;
62     qint64 length() const override;
63     int filesize() const override;
64     int sampleRate() const override;
65     int bitrate() const override;
66     int trackNumber() const override;
67     int discNumber() const override;
68     QString type() const override;
69 
70     bool hasCapabilityInterface( Capabilities::Capability::Type type ) const override;
71     Capabilities::Capability *createCapabilityInterface( Capabilities::Capability::Type type ) override;
72 
73     TrackEditorPtr editor() override;
74 
75     // TrackEditor methods
76     void setAlbum( const QString &newAlbum ) override;
77     void setAlbumArtist( const QString &newAlbumArtist ) override;
78     void setArtist( const QString &newArtist ) override;
79     void setComposer( const QString &newComposer ) override;
80     void setGenre( const QString &newGenre ) override;
81     void setYear( int newYear ) override;
82     void setTitle( const QString &newTitle ) override;
83     void setComment( const QString &newComment ) override;
84     void setTrackNumber( int newTrackNumber ) override;
85     void setDiscNumber( int newDiscNumber ) override;
86     void setBpm( const qreal newBpm ) override;
87 
88     void beginUpdate() override;
89     void endUpdate() override;
90 
91     //TimecodeTrack specific methods
92     void setAlbum( const TimecodeAlbumPtr &album );
93     void setArtist( const TimecodeArtistPtr &artist );
94     void setComposer( const TimecodeComposerPtr &composer );
95     void setGenre( const TimecodeGenrePtr &genre );
96     void setYear( const TimecodeYearPtr &year );
97 
98     qint64 start();
99     qint64 end();
100 
101 
102 private:
103     //TimecodeCollection *m_collection;
104 
105     TimecodeArtistPtr m_artist;
106     TimecodeAlbumPtr m_album;
107     TimecodeGenrePtr m_genre;
108     TimecodeComposerPtr m_composer;
109     TimecodeYearPtr m_year;
110 
111     QString m_name;
112     QString m_type;
113     qint64 m_start;
114     qint64 m_end;
115     qint64 m_length;
116     qreal m_bpm;
117     int m_trackNumber;
118     int m_discNumber;
119     QString m_comment;
120     QString m_displayUrl;
121     QUrl m_playableUrl;
122 
123     int m_updatedFields;
124     QMap<int, QString> m_fields;
125 
126     enum
127     {
128         ALBUM_UPDATED       = 1 << 0,
129         ARTIST_UPDATED      = 1 << 1,
130         COMPOSER_UPDATED    = 1 << 2,
131         GENRE_UPDATED       = 1 << 3,
132         YEAR_UPDATED        = 1 << 4,
133         TITLE_UPDATED       = 1 << 5,
134         COMMENT_UPDATED     = 1 << 6,
135         TRACKNUMBER_UPDATED = 1 << 7,
136         DISCNUMBER_UPDATED  = 1 << 8,
137         BPM_UPDATED         = 1 << 9
138     };
139 };
140 
141 class TimecodeArtist : public Meta::Artist
142 {
143 public:
144     explicit TimecodeArtist( const QString &name );
145     ~TimecodeArtist() override;
146 
147     QString name() const override;
148 
149     TrackList tracks() override;
150 
151     virtual AlbumList albums();
152 
153     bool operator==( const Meta::Artist &other ) const override
154     {
155         return name() == other.name();
156     }
157 
158     //TimecodeArtist specific methods
159     void addTrack( const TimecodeTrackPtr &track );
160 
161 private:
162     QString m_name;
163     TrackList m_tracks;
164 };
165 
166 class TimecodeAlbum : public QObject, public Meta::Album
167 {
168 Q_OBJECT
169 public:
170     explicit TimecodeAlbum( const QString &name );
171     ~TimecodeAlbum() override;
172 
173     QString name() const override;
174 
175     bool isCompilation() const override;
176     bool hasAlbumArtist() const override;
177     ArtistPtr albumArtist() const override;
178     TrackList tracks() override;
179 
180     QImage image( int size = 0 ) const override;
181     bool canUpdateImage() const override;
182     void setImage( const QImage &image ) override;
183 
184     bool hasCapabilityInterface( Capabilities::Capability::Type type ) const override;
185     Capabilities::Capability* createCapabilityInterface( Capabilities::Capability::Type type ) override;
186 
187     //TimecodeAlbum specific methods
188     void addTrack( const TimecodeTrackPtr &track );
189     void setAlbumArtist( const TimecodeArtistPtr &artist );
190 
191     bool operator==( const Meta::Album &other ) const override
192     {
193         return name() == other.name();
194     }
195 
196 private:
197     QString m_name;
198     TrackList m_tracks;
199     bool m_isCompilation;
200     TimecodeArtistPtr m_albumArtist;
201 
202     QImage m_cover;
203 };
204 
205 class TimecodeGenre : public Meta::Genre
206 {
207 public:
208     explicit TimecodeGenre( const QString &name );
209     ~TimecodeGenre() override;
210 
211     QString name() const override;
212 
213     TrackList tracks() override;
214 
215     bool operator==( const Meta::Genre &other ) const override
216     {
217         return name() == other.name();
218     }
219 
220     //TimecodeGenre specific methods
221     void addTrack( const TimecodeTrackPtr &track );
222 
223 private:
224     QString m_name;
225     TrackList m_tracks;
226 };
227 
228 class TimecodeComposer : public Meta::Composer
229 {
230 public:
231     explicit TimecodeComposer( const QString &name );
232     ~TimecodeComposer() override;
233 
234     QString name() const override;
235 
236     TrackList tracks() override;
237 
238     bool operator==( const Meta::Composer &other ) const override
239     {
240         return name() == other.name();
241     }
242 
243     //TimecodeComposer specific methods
244     void addTrack( const TimecodeTrackPtr &track );
245 
246 private:
247     QString m_name;
248     TrackList m_tracks;
249 };
250 
251 class TimecodeYear : public Meta::Year
252 {
253 public:
254     explicit TimecodeYear( const QString &name );
255     ~TimecodeYear() override;
256 
257     QString name() const override;
258 
259     TrackList tracks() override;
260 
261     bool operator==( const Meta::Year &other ) const override
262     {
263         return name() == other.name();
264     }
265 
266     //TimecodeYear specific methods
267     void addTrack( const TimecodeTrackPtr &track );
268 
269 private:
270     QString m_name;
271     TrackList m_tracks;
272 };
273 
274 }
275 #endif
276