00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef ITUNESDBTRACK_H
00024 #define ITUNESDBTRACK_H
00025
00026 #include <qcstring.h>
00027 #include <qdatetime.h>
00028 #include <qlist.h>
00029 #include <qvaluevector.h>
00030
00031 #include "utils.h"
00032 #include "listitem.h"
00033
00034 namespace itunesdb {
00035
00036
00042 class Track : public ListItem {
00043
00044 friend class ItunesDBParser;
00045 friend class ItunesDBWriter;
00046
00047 public:
00048
00049 Track( Q_UINT32 trackID = 0 );
00050
00051 virtual ~Track();
00052
00057 Q_UINT32 getID() const;
00058
00063 const QString & getAlbum() const;
00064
00069 const QString & getArtist() const;
00070
00071 QString getPlainArtistName() const;
00072
00077 const QString& getCategory() const;
00078
00083 const QString & getComment() const;
00084
00089 const QString & getTitle() const;
00090
00095 const QString & getGenre() const;
00096
00103 const QString & getPathInfo() const;
00104
00109 const QString & getComposer() const;
00110
00114 const QString & getEqualizerSetting() const;
00115
00119 const QString& getDescription() const;
00120
00124 const QString& getGrouping() const;
00125
00126 const QString& getFileFormatDesc() const;
00127
00132 Q_UINT64 getDBID() const;
00133
00138 unsigned char getRating() const;
00139
00144 Q_UINT32 getLastModified() const;
00145
00150 Q_UINT32 getFileSize() const;
00151
00156 Q_UINT32 getTrackLength() const;
00157
00162 Q_UINT32 getTrackNumber() const;
00163
00168 Q_UINT32 getTrackCount() const;
00169
00174 Q_UINT32 getYear() const;
00175
00180 Q_UINT32 getBitrate() const;
00181
00186 Q_UINT32 getSamplerate() const;
00187
00192 Q_UINT32 getVolumeAdjust() const;
00193
00198 Q_UINT32 getPlayCount() const;
00199
00203 Q_UINT32 getLastPlayed() const;
00204
00209 Q_UINT32 getCdNumber() const;
00210
00215 Q_UINT32 getCdCount() const;
00216
00221 Q_UINT32 getDateAdded() const { return date_added; }
00222
00223 Q_UINT32 getStartTime() const { return mStartTime; }
00224 Q_UINT32 getStopTime() const { return mStopTime; }
00225 Q_UINT32 getSoundCheck() const { return mSoundCheck; }
00226
00227 unsigned char getVbrFlag() const;
00228
00229 Q_UINT32 getFileFormatCode() const { return file_format_code; }
00230 Q_UINT32 getReleaseDate() const { return date_released; }
00231 unsigned char getMediaType() const { return type; }
00232 unsigned char getCompilationFlag() const { return compilation; }
00233
00234 unsigned char isChecked() const { return checked; }
00235
00236 Q_UINT16 getBPM() const;
00237
00238 virtual void setDBID( Q_UINT64 id );
00239
00244 virtual void setAlbum( const QString& album );
00245
00250 virtual void setArtist( const QString& artist );
00251
00256 virtual void setCategory( const QString& category );
00257
00263 virtual void setPathInfo( const QString& encodedpath );
00264
00269 virtual void setComment( const QString& comment );
00270
00271 virtual void setCompilationFlag( unsigned char isCompilation );
00272
00277 virtual void setDescription( const QString& description_txt );
00278
00283 virtual void setGrouping( const QString& grouping );
00284
00289 virtual void setGenre( const QString& genre );
00290
00295 virtual void setTitle( const QString& title );
00296
00301 virtual void setFileFormatDesc( const QString& fdesc );
00302
00307 virtual void setComposer( const QString& composer );
00308
00313 virtual void setEqualizerSetting( const QString& eqSetting );
00314
00319 virtual void setTrackNumber( Q_UINT32 tracknumber );
00320
00325 virtual void setTrackCount( Q_UINT32 numtracks );
00326
00331 virtual void setVolumeAdjust( Q_UINT32 newVolumeAdjust );
00332
00337 virtual void setYear( Q_UINT32 newYear );
00338
00343 virtual void setStartTime( Q_UINT32 startTime );
00344
00349 virtual void setStopTime( Q_UINT32 stopTime );
00350
00355 virtual void setSoundCheck( Q_UINT32 soundCheck );
00356
00361 void setRating(unsigned char rating);
00362
00367 void setLastPlayed(Q_UINT32 lastplayed);
00368
00373 void setPlayCount(Q_UINT32 newPlaycount);
00374
00379 void setBPM( Q_UINT32 bpm ) { beatsPerMinute = bpm; }
00380
00385 QString getFileExtension() const;
00386
00391 virtual void setFileExtension( const QString& fileextension );
00392
00398 template <class TrackMetaSource>
00399 void readFrom( TrackMetaSource& provider ) {
00400
00401 setAlbum( provider.getAlbum() );
00402 setArtist( provider.getArtist() );
00403 setBPM( provider.getBPM() );
00404 setCategory( provider.getCategory() );
00405 setComment( provider.getComment() );
00406 setCompilationFlag( provider.getCompilationFlag() );
00407 setComposer( provider.getComposer() );
00408 setDescription( provider.getDescription() );
00409 setGrouping( provider.getGrouping() );
00410 setEqualizerSetting( provider.getEqualizerSetting() );
00411 setFileFormatDesc( provider.getFileFormatDesc() );
00412 setGenre( provider.getGenre() );
00413 setTitle( provider.getTitle() );
00414 setTrackCount( provider.getTrackCount() );
00415 setTrackNumber( provider.getTrackNumber() );
00416 setVolumeAdjust( provider.getVolumeAdjust() );
00417 setYear( provider.getYear() );
00418
00419
00420 setLastPlayed( provider.getLastPlayed() );
00421 setPlayCount( provider.getPlayCount() );
00422 setRating( provider.getRating() );
00423 numcds = provider.getCdCount();
00424 cdnum = provider.getCdNumber();
00425 file_format_code = provider.getFileFormatCode();
00426 type = provider.getMediaType();
00427 tracklen = provider.getTrackLength();
00428 vbr = provider.getVbrFlag();
00429 bitrate = provider.getBitrate();
00430 samplerate = provider.getSamplerate();
00431 setStartTime( provider.getStartTime() );
00432 setStopTime( provider.getStopTime() );
00433 setSoundCheck( provider.getSoundCheck() );
00434
00435
00436 file_size = provider.getFileSize();
00437 lastmodified = provider.getLastModified();
00438
00439 doneAddingData();
00440 }
00441
00442 void setRecentlyPlayed( bool playedRecently = true ) { m_recentlyPlayed = playedRecently; }
00443 bool recentlyPlayed() const { return m_recentlyPlayed; }
00444
00445 protected:
00446
00447 virtual QDataStream & writeToStream( QDataStream & outstream );
00448 virtual QDataStream & readFromStream( QDataStream & instream, bool * ok = NULL );
00449
00450 void writeData( QByteArray& data ) const;
00451
00455 virtual void doneAddingData();
00456
00457 Q_UINT32 id;
00458
00459
00460 Q_UINT32 lastmodified;
00461 Q_UINT32 file_size;
00462 Q_UINT32 tracklen;
00463 Q_UINT32 tracknum;
00464 Q_UINT32 numtracks;
00465 Q_UINT32 year;
00466 Q_UINT32 bitrate;
00467 Q_UINT32 samplerate;
00468 Q_UINT32 volumeadjust;
00469 Q_UINT32 playcount;
00470 Q_UINT32 last_played_at;
00471 Q_UINT32 cdnum;
00472 Q_UINT32 numcds;
00473 Q_UINT32 file_format_code;
00474 Q_UINT32 date_added;
00475 Q_UINT32 date_released;
00476
00477 Q_UINT32 mStartTime;
00478 Q_UINT32 mStopTime;
00479 Q_UINT32 mSoundCheck;
00480
00481 unsigned char rating;
00482 unsigned char vbr;
00483 unsigned char type;
00484 unsigned char compilation;
00485
00486 Q_UINT64 dbid;
00487 Q_UINT8 checked;
00488 Q_UINT8 app_rating;
00489 Q_UINT16 beatsPerMinute;
00490 Q_UINT16 mArtworkCount;
00491 Q_UINT16 unk9;
00492
00493
00494
00495 private:
00496
00497 bool m_recentlyPlayed;
00498 uint m_plainArtistNameStartIdx;
00499 };
00500
00520 class TrackComparator {
00521 public:
00522 virtual ~TrackComparator() {}
00523 virtual int compare( const itunesdb::Track& track1, const itunesdb::Track& track2 ) = 0;
00524 };
00525
00526 typedef QTPOD_SHARED_PTR_IMPL_DEF<TrackComparator> TrackComparatorPtr;
00527 typedef QTPOD_SHARED_PTR_IMPL_DEF<const TrackComparator> ConstTrackComparatorPtr;
00528
00532 class TrackComparators {
00533 class KeepOrder;
00534 class ByTitle;
00535 class ByArtist;
00536 class ByAlbum;
00537 class ByGenre;
00538 class ByCategory;
00539 class ByComment;
00540 class ByComposer;
00541 class ByEqualizerSetting;
00542 class ByDescriptionTxt;
00543 class ByGrouping;
00544 class ByBitrate;
00545 class ByFiletype;
00546 class ByTimeModified;
00547 class ByTrackNumber;
00548 class BySize;
00549 class ByTrackLength;
00550 class ByYear;
00551 class BySampleRate;
00552 class ByDateAdded;
00553 class ByPlaycount;
00554 class ByLastPlayed;
00555 class ByRating;
00556 class ByCdNumber;
00557 class ByReleaseDate;
00558 class ByBPM;
00559
00560 public:
00561
00565 static TrackComparatorPtr KEEP_ORDER;
00566
00570 static TrackComparatorPtr BY_TITLE;
00571
00575 static TrackComparatorPtr BY_ARTISTONLY;
00576
00580 static TrackComparatorPtr BY_ALBUMONLY;
00581
00585 static TrackComparatorPtr BY_GENREONLY;
00586
00590 static TrackComparatorPtr BY_CATEGORY;
00591
00595 static TrackComparatorPtr BY_COMMENT;
00596
00600 static TrackComparatorPtr BY_COMPOSERONLY;
00601
00605 static TrackComparatorPtr BY_EQSETTING;
00606
00610 static TrackComparatorPtr BY_DESCRIPTIONTXT;
00611
00615 static TrackComparatorPtr BY_GROUPING;
00616
00620 static TrackComparatorPtr BY_BITRATE;
00621
00625 static TrackComparatorPtr BY_FILETYPE;
00626
00630 static TrackComparatorPtr BY_TIMEMODIFIED;
00631
00635 static TrackComparatorPtr BY_TRACKNUMBER;
00636
00640 static TrackComparatorPtr BY_SIZE;
00641
00645 static TrackComparatorPtr BY_TRACKLENGTH;
00646
00650 static TrackComparatorPtr BY_YEAR;
00651
00655 static TrackComparatorPtr BY_SAMPLERATE;
00656
00661 static TrackComparatorPtr BY_DATEADDED;
00662
00667 static TrackComparatorPtr BY_RECENTLYADDED;
00668
00672 static TrackComparatorPtr BY_PLAYCOUNTONLY;
00673
00677 static TrackComparatorPtr BY_LASTPLAYED;
00678
00682 static TrackComparatorPtr BY_LASTPLAYED_REVERSE;
00683
00687 static TrackComparatorPtr BY_RATING;
00688
00692 static TrackComparatorPtr BY_CDNUMBER;
00693
00697 static TrackComparatorPtr BY_RELEASEDATE;
00698
00702 static TrackComparatorPtr BY_BPM;
00703
00707 static TrackComparatorPtr BY_ALBUM;
00708
00712 static TrackComparatorPtr BY_ARTIST;
00713
00717 static TrackComparatorPtr BY_GENRE;
00718
00722 static TrackComparatorPtr BY_COMPOSER;
00723
00727 static TrackComparatorPtr BY_PLAYCOUNT;
00728
00729
00733 class ReverseComparator : public TrackComparator {
00734 TrackComparatorPtr m_delegate;
00735 public:
00739 ReverseComparator( const TrackComparatorPtr& comparator ) : m_delegate( comparator ) {}
00740 virtual ~ReverseComparator() {}
00741 virtual int compare( const itunesdb::Track& track1, const itunesdb::Track& track2 ) {
00742 return m_delegate->compare( track2, track1 );
00743 }
00744 };
00745
00746
00751 class ComposingComparator : public TrackComparator {
00752 typedef QValueVector<TrackComparatorPtr> ComparatorPtrVector;
00753 ComparatorPtrVector m_comparators;
00754 public:
00755 ComposingComparator() {}
00756
00761 ComposingComparator( TrackComparator * first ) {
00762 if ( first ) {
00763 m_comparators.append( TrackComparatorPtr( first ) );
00764 }
00765 }
00766
00770 ComposingComparator( TrackComparatorPtr first ) {
00771 if ( first ) {
00772 m_comparators.append( first );
00773 }
00774 }
00775 virtual ~ComposingComparator() {}
00776
00780 ComposingComparator * add( TrackComparatorPtr next ) {
00781 if ( next ) {
00782 m_comparators.append( next );
00783 }
00784 return this;
00785 }
00786
00791 ComposingComparator * add( TrackComparator * next ) {
00792 if ( next ) {
00793 m_comparators.append( TrackComparatorPtr( next ) );
00794 }
00795 return this;
00796 }
00797 virtual int compare( const itunesdb::Track& track1, const itunesdb::Track& track2 );
00798 };
00799
00803 static TrackComparatorPtr createPtr( TrackComparator * comparator );
00804 };
00805
00806
00837 class TrackPredicate {
00838 public:
00839 virtual ~TrackPredicate() {}
00840
00845 virtual bool operator () ( const Track& ) = 0;
00846 };
00847
00848
00849 typedef QTPOD_SHARED_PTR_IMPL_DEF<TrackPredicate> TrackPredicatePtr;
00850 typedef QTPOD_SHARED_PTR_IMPL_DEF<const TrackPredicate> ConstTrackPredicatePtr;
00851
00852
00856 class TrackPredicates {
00857 public:
00858
00864 class ByArtist : public TrackPredicate {
00865 public:
00869 ByArtist( const QString& artist ) : _artist_( artist ) {}
00870 virtual ~ByArtist() {}
00871
00875 bool operator () (const Track& track) {
00876 return _artist_.compare( track.getArtist() ) == 0;
00877 }
00878 private:
00879 const QString _artist_;
00880 };
00881
00882
00888 class ByAlbum : public TrackPredicate {
00889 public:
00893 ByAlbum(const QString& artist, const QString & album)
00894 : _artist_( artist ), _album_( album ) {}
00895 virtual ~ByAlbum() {}
00896
00900 bool operator () (const Track& track) {
00901 bool result = true;
00902 if ( !_artist_.isEmpty() ) {
00903 result = _artist_.compare( track.getArtist() ) == 0;
00904 }
00905 return result && _album_.compare( track.getAlbum() ) == 0;
00906 }
00907 private:
00908 const QString _artist_;
00909 const QString _album_;
00910 };
00911
00912
00919 class ByFullInfo : public TrackPredicate {
00920 public:
00924 ByFullInfo( const QString& artist, const QString& album, const QString& title, Q_UINT32 trackNum = 0 )
00925 : m_artist( artist ), m_album( album ), m_title( title ), m_trackNum( trackNum ) {}
00926 virtual ~ByFullInfo() {}
00927
00928 bool operator () (const Track& track) {
00929 return m_artist.compare( track.getArtist() ) == 0 &&
00930 m_album.compare( track.getAlbum() ) == 0 &&
00931 m_title.compare( track.getTitle() ) == 0 &&
00932 ( m_trackNum == track.getTrackNumber() || m_trackNum == 0 );
00933 }
00934 private:
00935 const QString& m_artist;
00936 const QString& m_album;
00937 const QString& m_title;
00938 Q_UINT32 m_trackNum;
00939 };
00940
00941
00947 class Contains : public TrackPredicate {
00948 public:
00952 Contains( const QString& someString, bool caseSensitive )
00953 : m_someString( someString ), m_caseSensitive( caseSensitive ) {}
00954 virtual ~Contains() {}
00955
00959 bool operator () ( const Track& track ) {
00960 QString sBuffer( track.getArtist() + track.getAlbum() + track.getTitle() + track.getComposer() );
00961 return sBuffer.contains( m_someString, m_caseSensitive );
00962 }
00963 private:
00964 const QString m_someString;
00965 bool m_caseSensitive;
00966 };
00967
00968
00969 class TrackPtrPredicate {
00970 TrackPredicate & delegate;
00971 public:
00972 TrackPtrPredicate( TrackPredicate& predicate ) : delegate( predicate ) {}
00973 ~TrackPtrPredicate() {}
00974 bool operator() ( const Track * track ) {
00975 if ( !track ) {
00976 return false;
00977 }
00978 return delegate( *track );
00979 }
00980 };
00981 };
00982
00983
00987 class TrackPtrList : public QList<itunesdb::Track> {
00988 TrackComparatorPtr m_comparator;
00989 public:
00990
00994 TrackPtrList();
00995 virtual ~TrackPtrList();
00996
01002 void setComparator( const TrackComparatorPtr& comparator );
01003
01007 const TrackComparatorPtr& getComparator() const;
01008
01014 void setComparator( TrackComparator * comparator );
01015
01019 virtual int compareItems( QPtrCollection::Item s1, QPtrCollection::Item s2 );
01020
01024 bool hasDirtyTracks();
01025
01030 bool hasRecentlyPlayedTracks();
01031
01035 bool removeAllRefs( itunesdb::Track * track );
01036
01040 TrackPtrList * getTracksBy( TrackPredicate& predicate, itunesdb::TrackPtrList& buffer ) const;
01041
01049 Track * findFirstTrackBy( TrackPredicate& predicate ) const;
01050
01054 template <class JavaLikeTrackIterator>
01055 void addAll( JavaLikeTrackIterator trackIter ) {
01056 while ( trackIter.hasNext() ) {
01057 append( trackIter.next() );
01058 }
01059 }
01060 };
01061
01062 }
01063
01064 #endif