#include <stdio.h>
#include <qfile.h>
#include <qstringlist.h>
#include <qobject.h>
#include "listtests.h"
#include "ipod.h"
#define RECENTLYPLAYEDTITLE "KPOD:Recently Played"
#define RECENTLYSKIPPEDTITLE "KPOD:Recently Skipped"
#define RECENTLYADDEDTITLE "KPOD:Recently added"
#define FAVORITES "KPOD:Most Played"
#define NEVERPLAYEDBEFORETITLE "KPOD:Never Played Before"
#define HIGHESTRATEDLIST "KPOD:Highest Rated"
using namespace itunesdb;
void ListTests::createRecentlyPlayedList( ITunesDB& itunesdb ) {
printf( "creating new smart playlist: %s\n", RECENTLYPLAYEDTITLE );
ITunesDBPlaylist * recentlyPlayed = itunesdb.createNewPlaylist( RECENTLYPLAYEDTITLE );
recentlyPlayed->setSortOrder( Playlist::SORTORDER_TIME_PLAYED );
SmartPlaylistRuleSet& ruleSet = recentlyPlayed->enableSmartPlaylist();
ruleSet.addInTheLastRule( FIELD_LASTPLAYED, false, -2, IN_THE_LAST_WEEKS );
ruleSet.setLimits( LIMIT_SORT_LASTPLAYED, LIMIT_TYPE_SONGS, 30 );
ruleSet.setMatchAnyFlag( true );
ruleSet.setLiveUpdateFlag( true );
if ( !itunesdb.addPlaylist( recentlyPlayed ) ) {
delete recentlyPlayed;
}
}
void ListTests::createRecentlySkippedList( ITunesDB& itunesdb ) {
printf( "creating new smart playlist: %s\n", RECENTLYSKIPPEDTITLE );
ITunesDBPlaylist * recentlySkipped = itunesdb.createNewPlaylist( RECENTLYSKIPPEDTITLE );
recentlySkipped->setSortOrder( Playlist::SORTORDER_TIME_PLAYED );
SmartPlaylistRuleSet& ruleSet = recentlySkipped->enableSmartPlaylist();
ruleSet.addInTheLastRule( FIELD_LAST_SKIPPED, false, -2, IN_THE_LAST_WEEKS );
ruleSet.setLimits( LIMIT_SORT_LASTPLAYED, LIMIT_TYPE_SONGS, 30 );
ruleSet.setMatchAnyFlag( true );
ruleSet.setLiveUpdateFlag( true );
if ( !itunesdb.addPlaylist( recentlySkipped ) ) {
delete recentlySkipped;
}
}
void ListTests::createTop25List( ITunesDB& itunesdb ) {
printf( "creating new smart playlist: %s\n", FAVORITES );
ITunesDBPlaylist * favorites = itunesdb.createNewPlaylist( FAVORITES );
favorites->setSortOrder( ITunesDBPlaylist::SORTORDER_PLAYCOUNT );
SmartPlaylistRuleSet& ruleSet = favorites->enableSmartPlaylist();
ruleSet.addUIntRule( itunesdb::FIELD_PLAYCOUNT, itunesdb::ACTION_GREATER_THAN, 0, 0 );
ruleSet.setLimits( LIMIT_SORT_PLAYCOUNT, LIMIT_TYPE_SONGS, 25 );
ruleSet.setLiveUpdateFlag( true );
if ( !itunesdb.addPlaylist( favorites ) ) {
delete favorites;
}
}
void ListTests::createNeverPlayedBeforeList( ITunesDB& itunesdb ) {
printf( "creating new smart playlist: %s\n", NEVERPLAYEDBEFORETITLE );
ITunesDBPlaylist * neverplayed = itunesdb.createNewPlaylist( NEVERPLAYEDBEFORETITLE );
neverplayed->setSortOrder( itunesdb::Playlist::SORTORDER_TIME_ADDED );
SmartPlaylistRuleSet& ruleSet = neverplayed->enableSmartPlaylist();
ruleSet.setMatchAnyFlag( false );
ruleSet.addUIntRule( FIELD_LASTPLAYED, ACTION_IS_UINT, 0, 0 );
ruleSet.addUIntRule( FIELD_LAST_SKIPPED, ACTION_IS_UINT, 0, 0 );
ruleSet.setLimits( LIMIT_SORT_RECENTLYADDED, LIMIT_TYPE_SONGS, 50, true );
ruleSet.setLiveUpdateFlag( true );
if ( !itunesdb.addPlaylist( neverplayed ) ) {
delete neverplayed;
}
}
void ListTests::createHighestRated( ITunesDB& itunesdb ) {
printf( "creating new smart playlist: %s\n", HIGHESTRATEDLIST );
ITunesDBPlaylist * highestrated = itunesdb.createNewPlaylist( HIGHESTRATEDLIST );
highestrated->setSortOrder( itunesdb::Playlist::SORTORDER_RANDOM );
SmartPlaylistRuleSet& ruleSet = highestrated->enableSmartPlaylist();
ruleSet.setMatchAnyFlag( false );
ruleSet.addUIntRule( itunesdb::FIELD_RATING, ACTION_IS_UINT, 100, 100 );
ruleSet.setLiveUpdateFlag( true );
if ( !itunesdb.addPlaylist( highestrated ) ) {
delete highestrated;
}
}
void ListTests::createNewestAdditionsList( ITunesDB& itunesdb ) {
printf( "creating new smart playlist: %s\n", RECENTLYADDEDTITLE );
ITunesDBPlaylist * recentlyAdded = itunesdb.createNewPlaylist( RECENTLYADDEDTITLE );
recentlyAdded->setSortOrder( itunesdb::Playlist::SORTORDER_ARTIST );
SmartPlaylistRuleSet& ruleSet = recentlyAdded->enableSmartPlaylist();
ruleSet.addInTheLastRule( FIELD_DATEADDED, false, -2, IN_THE_LAST_WEEKS );
ruleSet.setLiveUpdateFlag( true );
if ( !itunesdb.addPlaylist( recentlyAdded ) ) {
delete recentlyAdded;
}
}
void ListTests::printSortedBy( ITunesDBPlaylist& playlist, Playlist::Sortorder order ) {
Playlist::Sortorder origOrder = playlist.getSortOrder();
playlist.setSortOrder( order );
Playlist::Iterator trackIter = playlist.getElements();
while( trackIter.hasNext() ) {
Track * track = playlist.getTrack( *trackIter.next() );
if ( track ) {
fprintf( stdout, "\t%s\t\t%d,%d\t\t%s\t\t%s\n",
track->getArtist().ascii(), track->getPlayCount(), track->getSkipCount(), track->getAlbum().ascii(), track->getTitle().ascii() );
} else {
fprintf( stdout, "\ttrack not found\n" );
}
}
playlist.setSortOrder( origOrder );
}
void ListTests::printTracksByArtist( const ITunesDB& itunesdb ) {
QStringList artistlist;
if( !itunesdb.getArtists( artistlist ) ) {
printf("NO ARTISTS!!!!");
}
for( QStringList::iterator artistiterator = artistlist.begin(); artistiterator!= artistlist.end(); ++artistiterator ) {
printf("%s\n", (*artistiterator).ascii());
QStringList albums;
if( ! itunesdb.getAlbumsByArtist( *artistiterator, albums ) ) {
printf("ARTIST NOT FOUND!!!");
} else {
QStringList::iterator albumiterator = albums.begin();
for( ; albumiterator != albums.end(); ++albumiterator) {
TrackPtrList album;
itunesdb.getAlbum( *artistiterator, *albumiterator, album );
album.sort();
printf("\t%s (%d)%s\n", (*albumiterator).ascii(), album.count(), album.hasRecentlyPlayedTracks() ? " played recently" : "");
TrackPtrList::Iterator trackiterator = album.iterator();
while ( trackiterator.hasNext() ) {
itunesdb::Track * track = trackiterator.next();
QDateTime added;
added.setTime_t( track->getDateAdded(), Qt::UTC );
QDateTime played;
played.setTime_t( track->getLastPlayed(), Qt::UTC );
printf("\t\t%d - %s - played %s, added %s\n",
track->getTrackNumber(), track->getTitle().ascii(),
played.toString().ascii(), added.toString().ascii() );
}
}
printf("\tall Tracks ...\n");
TrackPtrList artisttracks;
itunesdb.getTracksByArtist( *artistiterator, artisttracks );
artisttracks.setComparator( TrackComparators::BY_ALBUM );
artisttracks.sort();
TrackPtrList::Iterator trackiterator = artisttracks.iterator();
while ( trackiterator.hasNext() ) {
itunesdb::Track * track = trackiterator.next();
printf("\t\t%s - %d - %s\n", track->getAlbum().ascii(), track->getTrackNumber(), track->getTitle().ascii());
}
}
}
}
void ListTests::printPlaylists( const ITunesDB& itunesdb ) {
QStringList playlistTitles;
itunesdb.getPlaylistTitles( playlistTitles );
fprintf( stdout, "PLAYLISTS\n" );
for ( unsigned int i = 0; i < playlistTitles.count(); ++i ) {
ITunesDBPlaylist * playlist = itunesdb.getPlaylistByTitle( playlistTitles[ i ] );
if ( playlist ) {
if ( playlist->isSmartPlaylist() ) {
fprintf( stdout, "%s\n", playlist->getSmartPlaylistRules()->toString().ascii() );
playlist->updateSmartPlaylist( true );
}
fprintf( stdout, "%s (%d) - original order\n", playlist->getTitle().ascii(), playlist->getNumTracks() );
printSortedBy( *playlist, playlist->getSortOrder() );
fprintf( stdout, "%s - ordered by title\n", playlist->getTitle().ascii() );
printSortedBy( *playlist, Playlist::SORTORDER_TITLE );
fprintf( stdout, "%s - ordered by artist\n", playlist->getTitle().ascii() );
printSortedBy( *playlist, Playlist::SORTORDER_ARTIST );
fprintf( stdout, "%s - randomly\n", playlist->getTitle().ascii() );
printSortedBy( *playlist, Playlist::SORTORDER_RANDOM );
fprintf( stdout, "%s - ordered by time played\n", playlist->getTitle().ascii() );
printSortedBy( *playlist, Playlist::SORTORDER_PLAYCOUNT );
}
}
printf( "number of playlists: %u\n", itunesdb.getNumPlaylists() );
}
int ListTests::run( QStringList arguments ) {
IPod * ipod = findFirstIPod();
if ( !ipod ) {
return -1;
}
ITunesDB& itunesdb = ipod->getITunesDB();
printTracksByArtist( itunesdb );
ITunesDBPlaylist * spl = itunesdb.getPlaylistByTitle( RECENTLYPLAYEDTITLE );
if ( spl == NULL ) {
createRecentlyPlayedList( itunesdb );
}
spl = itunesdb.getPlaylistByTitle( FAVORITES );
if ( spl == NULL ) {
createTop25List( itunesdb );
}
spl = itunesdb.getPlaylistByTitle( NEVERPLAYEDBEFORETITLE );
if ( spl == NULL ) {
createNeverPlayedBeforeList( itunesdb );
}
spl = itunesdb.getPlaylistByTitle( RECENTLYADDEDTITLE );
if ( spl == NULL ) {
createNewestAdditionsList( itunesdb );
}
spl = itunesdb.getPlaylistByTitle( RECENTLYSKIPPEDTITLE );
if ( spl == NULL ) {
createRecentlySkippedList( itunesdb );
}
spl = itunesdb.getPlaylistByTitle( HIGHESTRATEDLIST );
if ( spl == NULL ) {
createHighestRated( itunesdb );
}
printPlaylists( itunesdb );
printf( "%s is %s\n", ipod->getName().ascii(), ipod->isDirty() ? "dirty" : "clean" );
#ifdef WIN32
ipod->getITunesDB().writeDatabase( "c:/iTunesDB" );
#else
ipod->getITunesDB().writeDatabase( "/tmp/iTunesDB" );
#endif
printf("closing ipod instance\n");
ipod->close();
delete ipod;
return 0;
}
QString ListTests::getName() {
return "list";
}