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