Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/library/itunes/itunesplaylistmodel.cpp

Go to the documentation of this file.
00001 #include <QtCore>
00002 #include <QtGui>
00003 #include <QtSql>
00004 
00005 #include "library/trackcollection.h"
00006 #include "library/itunes/itunesplaylistmodel.h"
00007 #include "track/beatfactory.h"
00008 #include "track/beats.h"
00009 
00010 ITunesPlaylistModel::ITunesPlaylistModel(QObject* parent,
00011                                          TrackCollection* pTrackCollection)
00012         : BaseSqlTableModel(parent, pTrackCollection,
00013                             pTrackCollection->getDatabase(),
00014                             "mixxx.db.model.itunes_playlist"),
00015           m_pTrackCollection(pTrackCollection),
00016           m_database(m_pTrackCollection->getDatabase()) {
00017     connect(this, SIGNAL(doSearch(const QString&)),
00018             this, SLOT(slotSearch(const QString&)));
00019 }
00020 
00021 ITunesPlaylistModel::~ITunesPlaylistModel() {
00022 }
00023 
00024 TrackPointer ITunesPlaylistModel::getTrack(const QModelIndex& index) const
00025 {
00026     QString artist = index.sibling(
00027         index.row(), fieldIndex("artist")).data().toString();
00028     QString title = index.sibling(
00029         index.row(), fieldIndex("title")).data().toString();
00030     QString album = index.sibling(
00031         index.row(), fieldIndex("album")).data().toString();
00032     QString year = index.sibling(
00033         index.row(), fieldIndex("year")).data().toString();
00034     QString genre = index.sibling(
00035         index.row(), fieldIndex("genre")).data().toString();
00036     float bpm = index.sibling(
00037         index.row(), fieldIndex("bpm")).data().toString().toFloat();
00038     QString location = index.sibling(
00039         index.row(), fieldIndex("location")).data().toString();
00040 
00041     if (location.isEmpty()) {
00042         // Track is lost
00043         return TrackPointer();
00044     }
00045 
00046     TrackDAO& track_dao = m_pTrackCollection->getTrackDAO();
00047     int track_id = track_dao.getTrackId(location);
00048     bool track_already_in_library = track_id >= 0;
00049     if (track_id < 0) {
00050         // Add Track to library
00051         track_id = track_dao.addTrack(location, true);
00052     }
00053 
00054     TrackPointer pTrack;
00055 
00056     if (track_id < 0) {
00057         // Add Track to library failed, create a transient TrackInfoObject
00058         pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater);
00059     } else {
00060         pTrack = track_dao.getTrack(track_id);
00061     }
00062 
00063     // If this track was not in the Mixxx library it is now added and will be
00064     // saved with the metadata from iTunes. If it was already in the library
00065     // then we do not touch it so that we do not over-write the user's metadata.
00066     if (!track_already_in_library) {
00067         pTrack->setArtist(artist);
00068         pTrack->setTitle(title);
00069         pTrack->setAlbum(album);
00070         pTrack->setYear(year);
00071         pTrack->setGenre(genre);
00072         pTrack->setBpm(bpm);
00073 
00074         // If the track has a BPM, then give it a static beatgrid.
00075         if (bpm > 0) {
00076             BeatsPointer pBeats = BeatFactory::makeBeatGrid(pTrack, bpm, 0);
00077             pTrack->setBeats(pBeats);
00078         }
00079     }
00080     return pTrack;
00081 }
00082 
00083 void ITunesPlaylistModel::search(const QString& searchText) {
00084     // qDebug() << "ITunesPlaylistModel::search()" << searchText
00085     //          << QThread::currentThread();
00086     emit(doSearch(searchText));
00087 }
00088 
00089 void ITunesPlaylistModel::slotSearch(const QString& searchText) {
00090     BaseSqlTableModel::search(searchText);
00091 }
00092 
00093 bool ITunesPlaylistModel::isColumnInternal(int column) {
00094     if (column == fieldIndex("track_id")) {
00095         return true;
00096     }
00097     return false;
00098 }
00099 
00100 Qt::ItemFlags ITunesPlaylistModel::flags(const QModelIndex &index) const {
00101     return readOnlyFlags(index);
00102 }
00103 
00104 void ITunesPlaylistModel::setPlaylist(QString playlist_path) {
00105     int playlistId = -1;
00106     QSqlQuery finder_query(m_database);
00107     finder_query.prepare("SELECT id from itunes_playlists where name=:name");
00108     finder_query.bindValue(":name", playlist_path);
00109 
00110     if (!finder_query.exec()) {
00111         qDebug() << "SQL Error in ITunesPlaylistModel.cpp: line" << __LINE__
00112                  << " " << finder_query.lastError();
00113         return;
00114     }
00115 
00116     while (finder_query.next()) {
00117         playlistId = finder_query.value(
00118             finder_query.record().indexOf("id")).toInt();
00119     }
00120 
00121     QString playlistID = "ITunesPlaylist_" + QString("%1").arg(playlistId);
00122     // Escape the playlist name
00123     QSqlDriver* driver = m_pTrackCollection->getDatabase().driver();
00124     QSqlField playlistNameField("name", QVariant::String);
00125     playlistNameField.setValue(playlistID);
00126 
00127     QStringList columns;
00128     columns << "track_id";
00129     columns << "position";
00130 
00131     QSqlQuery query(m_database);
00132     QString queryString = QString(
00133         "CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS "
00134         "SELECT %2 FROM %3 WHERE playlist_id = %4")
00135             .arg(driver->formatValue(playlistNameField))
00136             .arg(columns.join(","))
00137             .arg("itunes_playlist_tracks")
00138             .arg(playlistId);
00139     query.prepare(queryString);
00140 
00141     if (!query.exec()) {
00142         qDebug() << "Error creating temporary view for itunes playlists."
00143                  << "ITunesPlaylistModel --> line: " << __LINE__
00144                  << query.lastError();
00145         qDebug() << "Executed Query: " << query.executedQuery();
00146         return;
00147     }
00148 
00149     setTable(playlistID, columns[0], columns,
00150              m_pTrackCollection->getTrackSource("itunes"));
00151     setDefaultSort(fieldIndex("position"), Qt::AscendingOrder);
00152     initHeaderData();
00153     setSearch("");
00154 }
00155 
00156 bool ITunesPlaylistModel::isColumnHiddenByDefault(int column) {
00157    Q_UNUSED(column);
00158    return false;
00159 }
00160 
00161 TrackModel::CapabilitiesFlags ITunesPlaylistModel::getCapabilities() const {
00162     // See src/library/trackmodel.h for the list of TRACKMODELCAPS
00163     return TRACKMODELCAPS_NONE
00164             | TRACKMODELCAPS_ADDTOPLAYLIST
00165             | TRACKMODELCAPS_ADDTOCRATE
00166             | TRACKMODELCAPS_ADDTOAUTODJ
00167             | TRACKMODELCAPS_LOADTODECK
00168             | TRACKMODELCAPS_LOADTOSAMPLER;
00169 }
00170 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines