track.h

00001  /*****************************************************************************
00002  *   Copyright (C) 2004 by Michael Schulze                                    *
00003  *   mike.s@genion.de                                                         *
00004  *                                                                            *
00005  *  The code contained in this file is free software; you can redistribute    *
00006  *  it and/or modify it under the terms of the GNU Lesser General Public      *
00007  *  License as published by the Free Software Foundation; either version      *
00008  *  2.1 of the License, or (at your option) any later version.                *
00009  *                                                                            *
00010  *  This file is distributed in the hope that it will be useful,              *
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of            *
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
00013  *  Lesser General Public License for more details.                           *
00014  *                                                                            *
00015  *  You should have received a copy of the GNU Lesser General Public          *
00016  *  License along with this code; if not, write to the Free Software          *
00017  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *
00018  *                                                                            *
00019  *  iTunes and iPod are trademarks of Apple                                   *
00020  *                                                                            *
00021  *  This product is not supported/written/published by Apple!                 *
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         // Album specific stuff
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         // Track related technical stuff
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         // Resource related technical stuff
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     // attributes
00460     Q_UINT32 lastmodified;    // last modified date
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;       // rating 0 lowest 100 highest
00482     unsigned char vbr;          // vbr=1, cbr=0
00483     unsigned char type;         // mp3=1, aac+audible=0
00484     unsigned char compilation;  // iscompiltaion=1, 0 otherwise
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     // TODO implement podcast flag (together with the whole rest)
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 };  // TrackComparators
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     };  // ByArtist
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     };  // ByFullInfo
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     };  // Contains
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 };  // TrackPredicates
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 }   // namespace itunesdb
01063 
01064 #endif

Generated on Tue Dec 12 16:39:27 2006 for libqtpod.kdevelop by  doxygen 1.5.1