~mixxxdevelopers/mixxx/engine-control-refactor

« back to all changes in this revision

Viewing changes to mixxx/src/library/itunes/itunesplaylistmodel.cpp

  • Committer: RJ Ryan
  • Date: 2013-06-04 00:41:29 UTC
  • mfrom: (2890.22.101 mixxx)
  • Revision ID: rryan@mixxx.org-20130604004129-8jjxkicsb3givu4a
MergingĀ fromĀ lp:mixxx.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include <QtCore>
2
 
#include <QtGui>
3
 
#include <QtSql>
4
 
 
5
 
#include "library/trackcollection.h"
6
 
#include "library/itunes/itunesplaylistmodel.h"
7
 
#include "track/beatfactory.h"
8
 
#include "track/beats.h"
9
 
 
10
 
ITunesPlaylistModel::ITunesPlaylistModel(QObject* parent,
11
 
                                         TrackCollection* pTrackCollection)
12
 
        : BaseSqlTableModel(parent, pTrackCollection,
13
 
                            pTrackCollection->getDatabase(),
14
 
                            "mixxx.db.model.itunes_playlist"),
15
 
          m_pTrackCollection(pTrackCollection),
16
 
          m_database(m_pTrackCollection->getDatabase()) {
17
 
    connect(this, SIGNAL(doSearch(const QString&)),
18
 
            this, SLOT(slotSearch(const QString&)));
19
 
}
20
 
 
21
 
ITunesPlaylistModel::~ITunesPlaylistModel() {
22
 
}
23
 
 
24
 
TrackPointer ITunesPlaylistModel::getTrack(const QModelIndex& index) const
25
 
{
26
 
    QString artist = index.sibling(
27
 
        index.row(), fieldIndex("artist")).data().toString();
28
 
    QString title = index.sibling(
29
 
        index.row(), fieldIndex("title")).data().toString();
30
 
    QString album = index.sibling(
31
 
        index.row(), fieldIndex("album")).data().toString();
32
 
    QString year = index.sibling(
33
 
        index.row(), fieldIndex("year")).data().toString();
34
 
    QString genre = index.sibling(
35
 
        index.row(), fieldIndex("genre")).data().toString();
36
 
    float bpm = index.sibling(
37
 
        index.row(), fieldIndex("bpm")).data().toString().toFloat();
38
 
    QString location = index.sibling(
39
 
        index.row(), fieldIndex("location")).data().toString();
40
 
 
41
 
    if (location.isEmpty()) {
42
 
        // Track is lost
43
 
        return TrackPointer();
44
 
    }
45
 
 
46
 
    TrackDAO& track_dao = m_pTrackCollection->getTrackDAO();
47
 
    int track_id = track_dao.getTrackId(location);
48
 
    bool track_already_in_library = track_id >= 0;
49
 
    if (track_id < 0) {
50
 
        // Add Track to library
51
 
        track_id = track_dao.addTrack(location, true);
52
 
    }
53
 
 
54
 
    TrackPointer pTrack;
55
 
 
56
 
    if (track_id < 0) {
57
 
        // Add Track to library failed, create a transient TrackInfoObject
58
 
        pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater);
59
 
    } else {
60
 
        pTrack = track_dao.getTrack(track_id);
61
 
    }
62
 
 
63
 
    // If this track was not in the Mixxx library it is now added and will be
64
 
    // saved with the metadata from iTunes. If it was already in the library
65
 
    // then we do not touch it so that we do not over-write the user's metadata.
66
 
    if (!track_already_in_library) {
67
 
        pTrack->setArtist(artist);
68
 
        pTrack->setTitle(title);
69
 
        pTrack->setAlbum(album);
70
 
        pTrack->setYear(year);
71
 
        pTrack->setGenre(genre);
72
 
        pTrack->setBpm(bpm);
73
 
    }
74
 
    return pTrack;
75
 
}
76
 
 
77
 
void ITunesPlaylistModel::search(const QString& searchText) {
78
 
    // qDebug() << "ITunesPlaylistModel::search()" << searchText
79
 
    //          << QThread::currentThread();
80
 
    emit(doSearch(searchText));
81
 
}
82
 
 
83
 
void ITunesPlaylistModel::slotSearch(const QString& searchText) {
84
 
    BaseSqlTableModel::search(searchText);
85
 
}
86
 
 
87
 
bool ITunesPlaylistModel::isColumnInternal(int column) {
88
 
    if (column == fieldIndex("track_id")) {
89
 
        return true;
90
 
    }
91
 
    return false;
92
 
}
93
 
 
94
 
Qt::ItemFlags ITunesPlaylistModel::flags(const QModelIndex &index) const {
95
 
    return readOnlyFlags(index);
96
 
}
97
 
 
98
 
void ITunesPlaylistModel::setPlaylist(QString playlist_path) {
99
 
    int playlistId = -1;
100
 
    QSqlQuery finder_query(m_database);
101
 
    finder_query.prepare("SELECT id from itunes_playlists where name=:name");
102
 
    finder_query.bindValue(":name", playlist_path);
103
 
 
104
 
    if (!finder_query.exec()) {
105
 
        qDebug() << "SQL Error in ITunesPlaylistModel.cpp: line" << __LINE__
106
 
                 << " " << finder_query.lastError();
107
 
        return;
108
 
    }
109
 
 
110
 
    while (finder_query.next()) {
111
 
        playlistId = finder_query.value(
112
 
            finder_query.record().indexOf("id")).toInt();
113
 
    }
114
 
 
115
 
    QString playlistID = "ITunesPlaylist_" + QString("%1").arg(playlistId);
116
 
    // Escape the playlist name
117
 
    QSqlDriver* driver = m_pTrackCollection->getDatabase().driver();
118
 
    QSqlField playlistNameField("name", QVariant::String);
119
 
    playlistNameField.setValue(playlistID);
120
 
 
121
 
    QStringList columns;
122
 
    columns << "track_id";
123
 
    columns << "position";
124
 
 
125
 
    QSqlQuery query(m_database);
126
 
    QString queryString = QString(
127
 
        "CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS "
128
 
        "SELECT %2 FROM %3 WHERE playlist_id = %4")
129
 
            .arg(driver->formatValue(playlistNameField),
130
 
                 columns.join(","),
131
 
                 "itunes_playlist_tracks",
132
 
                 QString::number(playlistId));
133
 
    query.prepare(queryString);
134
 
 
135
 
    if (!query.exec()) {
136
 
        qDebug() << "Error creating temporary view for itunes playlists."
137
 
                 << "ITunesPlaylistModel --> line: " << __LINE__
138
 
                 << query.lastError();
139
 
        qDebug() << "Executed Query: " << query.executedQuery();
140
 
        return;
141
 
    }
142
 
 
143
 
    setTable(playlistID, columns[0], columns,
144
 
             m_pTrackCollection->getTrackSource("itunes"));
145
 
    setDefaultSort(fieldIndex("position"), Qt::AscendingOrder);
146
 
    initHeaderData();
147
 
    setSearch("");
148
 
}
149
 
 
150
 
bool ITunesPlaylistModel::isColumnHiddenByDefault(int column) {
151
 
    Q_UNUSED(column);
152
 
    return false;
153
 
}
154
 
 
155
 
TrackModel::CapabilitiesFlags ITunesPlaylistModel::getCapabilities() const {
156
 
    // See src/library/trackmodel.h for the list of TRACKMODELCAPS
157
 
    return TRACKMODELCAPS_NONE
158
 
            | TRACKMODELCAPS_ADDTOPLAYLIST
159
 
            | TRACKMODELCAPS_ADDTOCRATE
160
 
            | TRACKMODELCAPS_ADDTOAUTODJ
161
 
            | TRACKMODELCAPS_LOADTODECK
162
 
            | TRACKMODELCAPS_LOADTOSAMPLER;
163
 
}
164