Merge lp:~jamesh/mediascanner2/qmlplugin-updates into lp:mediascanner2

Proposed by James Henstridge
Status: Merged
Approved by: Jussi Pakkanen
Approved revision: 234
Merged at revision: 230
Proposed branch: lp:~jamesh/mediascanner2/qmlplugin-updates
Merge into: lp:mediascanner2
Diff against target: 905 lines (+228/-110)
20 files modified
src/daemon/MetadataExtractor.cc (+4/-0)
src/mediascanner/MediaFile.cc (+13/-3)
src/mediascanner/MediaFile.hh (+7/-3)
src/mediascanner/MediaFileBuilder.cc (+17/-1)
src/mediascanner/MediaFileBuilder.hh (+10/-2)
src/mediascanner/MediaStore.cc (+30/-22)
src/qml/Ubuntu/MediaScanner/AlbumModelBase.cc (+4/-0)
src/qml/Ubuntu/MediaScanner/AlbumModelBase.hh (+3/-0)
src/qml/Ubuntu/MediaScanner/ArtistsModel.cc (+4/-0)
src/qml/Ubuntu/MediaScanner/ArtistsModel.hh (+3/-0)
src/qml/Ubuntu/MediaScanner/MediaFileModelBase.cc (+10/-0)
src/qml/Ubuntu/MediaScanner/MediaFileModelBase.hh (+5/-0)
src/qml/Ubuntu/MediaScanner/MediaFileWrapper.cc (+8/-0)
src/qml/Ubuntu/MediaScanner/MediaFileWrapper.hh (+4/-0)
src/qml/Ubuntu/MediaScanner/plugin.qmltypes (+28/-3)
src/utils/scaletest.cc (+1/-1)
test/qml/tst_mediastore.qml (+2/-0)
test/qml/tst_songsearchmodel.qml (+6/-6)
test/test_mediastore.cc (+62/-62)
test/test_qml.cc (+7/-7)
To merge this branch: bzr merge lp:~jamesh/mediascanner2/qmlplugin-updates
Reviewer Review Type Date Requested Status
Jussi Pakkanen (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+218351@code.launchpad.net

Commit message

Add genre and discNumber metadata fields to the media index, and expose it in the QML binding.

Add rowCount property and get(row, role) method to each of the model classes in the QML binding.

Description of the change

Updates to the QML interface for music-app.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:234
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~jamesh/mediascanner2/qmlplugin-updates/+merge/218351/+edit-commit-message

http://jenkins.qa.ubuntu.com/job/mediascanner2-ci/61/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mediascanner2-utopic-amd64-ci/2
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mediascanner2-utopic-armhf-ci/2
        deb: http://jenkins.qa.ubuntu.com/job/mediascanner2-utopic-armhf-ci/2/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mediascanner2-utopic-i386-ci/2

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/mediascanner2-ci/61/rebuild

review: Needs Fixing (continuous-integration)
235. By James Henstridge

Update qmltypes.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Jussi Pakkanen (jpakkane) wrote :

Code-wise this looks good and can be merged.

However this increases the size of MediaFile, which means it is an ABI break. How are we dealing with this? What packages are affected and can we just transition them all in the same silo?

Also noted is that we don't have a symbols file or visibility specifications. Let's not block this MR for those but we should probably add them sooner rather than later.

review: Needs Information
Revision history for this message
James Henstridge (jamesh) wrote :

We will need to rebuild unity-scope-mediascanner too, yes. We don't currently have any other users. If we are settling down on a stable ABI though, we'll probably want to make a few more changes than just this (e.g. move MediaFile's members to a private struct, get rid of its big long constructor, etc). I'm not sure if we want to do this right now though.

Revision history for this message
Jussi Pakkanen (jpakkane) wrote :

Since we don't currently have other users than the scope, we can do this.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/daemon/MetadataExtractor.cc'
--- src/daemon/MetadataExtractor.cc 2014-04-03 09:05:20 +0000
+++ src/daemon/MetadataExtractor.cc 2014-05-08 07:17:36 +0000
@@ -129,6 +129,8 @@
129 mfb->setAlbum(g_value_get_string(val));129 mfb->setAlbum(g_value_get_string(val));
130 else if (tagname == GST_TAG_ALBUM_ARTIST)130 else if (tagname == GST_TAG_ALBUM_ARTIST)
131 mfb->setAlbumArtist(g_value_get_string(val));131 mfb->setAlbumArtist(g_value_get_string(val));
132 else if (tagname == GST_TAG_GENRE)
133 mfb->setGenre(g_value_get_string(val));
132 } else if (G_VALUE_HOLDS(val, GST_TYPE_DATE_TIME)) {134 } else if (G_VALUE_HOLDS(val, GST_TYPE_DATE_TIME)) {
133 if (tagname == GST_TAG_DATE_TIME) {135 if (tagname == GST_TAG_DATE_TIME) {
134 GstDateTime *dt = static_cast<GstDateTime*>(g_value_get_boxed(val));136 GstDateTime *dt = static_cast<GstDateTime*>(g_value_get_boxed(val));
@@ -139,6 +141,8 @@
139 } else if (G_VALUE_HOLDS_UINT(val)) {141 } else if (G_VALUE_HOLDS_UINT(val)) {
140 if (tagname == GST_TAG_TRACK_NUMBER) {142 if (tagname == GST_TAG_TRACK_NUMBER) {
141 mfb->setTrackNumber(g_value_get_uint(val));143 mfb->setTrackNumber(g_value_get_uint(val));
144 } else if (tagname == GST_TAG_ALBUM_VOLUME_NUMBER) {
145 mfb->setDiscNumber(g_value_get_uint(val));
142 }146 }
143 }147 }
144148
145149
=== modified file 'src/mediascanner/MediaFile.cc'
--- src/mediascanner/MediaFile.cc 2014-01-31 07:17:15 +0000
+++ src/mediascanner/MediaFile.cc 2014-05-08 07:17:36 +0000
@@ -24,9 +24,9 @@
2424
25namespace mediascanner {25namespace mediascanner {
2626
27MediaFile::MediaFile(std::string filename, std::string content_type, std::string etag, std::string title, std::string date, std::string author, std::string album, std::string album_artist,27MediaFile::MediaFile(std::string filename, std::string content_type, std::string etag, std::string title, std::string date, std::string author, std::string album, std::string album_artist, std::string genre,
28 int track_number, int duration, MediaType type) :28 int disc_number, int track_number, int duration, MediaType type) :
29 filename(filename), content_type(content_type), etag(etag), title(title), date(date), author(author), album(album), album_artist(album_artist), track_number(track_number), duration(duration), type(type) {29 filename(filename), content_type(content_type), etag(etag), title(title), date(date), author(author), album(album), album_artist(album_artist), genre(genre), disc_number(disc_number), track_number(track_number), duration(duration), type(type) {
3030
31}31}
3232
@@ -62,6 +62,14 @@
62 return date;62 return date;
63}63}
6464
65const std::string& MediaFile::getGenre() const noexcept {
66 return genre;
67}
68
69int MediaFile::getDiscNumber() const noexcept {
70 return disc_number;
71}
72
65int MediaFile::getTrackNumber() const noexcept {73int MediaFile::getTrackNumber() const noexcept {
66 return track_number;74 return track_number;
67}75}
@@ -88,6 +96,8 @@
88 album == other.album &&96 album == other.album &&
89 album_artist == other.album_artist &&97 album_artist == other.album_artist &&
90 date == other.date &&98 date == other.date &&
99 genre == other.genre &&
100 disc_number == other.disc_number &&
91 track_number == other.track_number &&101 track_number == other.track_number &&
92 duration == other.duration &&102 duration == other.duration &&
93 type == other.type;103 type == other.type;
94104
=== modified file 'src/mediascanner/MediaFile.hh'
--- src/mediascanner/MediaFile.hh 2014-01-31 03:48:16 +0000
+++ src/mediascanner/MediaFile.hh 2014-05-08 07:17:36 +0000
@@ -29,9 +29,9 @@
29public:29public:
3030
31 MediaFile(std::string filename) : filename(filename), content_type(""), etag(""), title(""), date(""), author(""),31 MediaFile(std::string filename) : filename(filename), content_type(""), etag(""), title(""), date(""), author(""),
32 album(""), album_artist(""), track_number(0), duration(0), type(UnknownMedia) {}32 album(""), album_artist(""), genre(""), disc_number(0), track_number(0), duration(0), type(UnknownMedia) {}
33 MediaFile(std::string filename, std::string content_type, std::string etag, std::string title, std::string date, std::string author, std::string album, std::string album_artist,33 MediaFile(std::string filename, std::string content_type, std::string etag, std::string title, std::string date, std::string author, std::string album, std::string album_artist, std::string genre,
34 int track_number, int duration, MediaType type);34 int disc_number, int track_number, int duration, MediaType type);
35 MediaFile() = delete;35 MediaFile() = delete;
3636
37 const std::string& getFileName() const noexcept;37 const std::string& getFileName() const noexcept;
@@ -42,8 +42,10 @@
42 const std::string& getAlbum() const noexcept;42 const std::string& getAlbum() const noexcept;
43 const std::string& getAlbumArtist() const noexcept;43 const std::string& getAlbumArtist() const noexcept;
44 const std::string& getDate() const noexcept;44 const std::string& getDate() const noexcept;
45 const std::string& getGenre() const noexcept;
45 std::string getUri() const;46 std::string getUri() const;
4647
48 int getDiscNumber() const noexcept;
47 int getTrackNumber() const noexcept;49 int getTrackNumber() const noexcept;
48 int getDuration() const noexcept;50 int getDuration() const noexcept;
49 MediaType getType() const noexcept;51 MediaType getType() const noexcept;
@@ -62,6 +64,8 @@
62 std::string author;64 std::string author;
63 std::string album;65 std::string album;
64 std::string album_artist;66 std::string album_artist;
67 std::string genre;
68 int disc_number;
65 int track_number;69 int track_number;
66 int duration; // In seconds.70 int duration; // In seconds.
67 MediaType type;71 MediaType type;
6872
=== modified file 'src/mediascanner/MediaFileBuilder.cc'
--- src/mediascanner/MediaFileBuilder.cc 2014-01-31 03:48:16 +0000
+++ src/mediascanner/MediaFileBuilder.cc 2014-05-08 07:17:36 +0000
@@ -37,13 +37,15 @@
37 author(mf.getAuthor()),37 author(mf.getAuthor()),
38 album(mf.getAlbum()),38 album(mf.getAlbum()),
39 album_artist(mf.getAlbumArtist()),39 album_artist(mf.getAlbumArtist()),
40 genre(mf.getGenre()),
41 disc_number(mf.getDiscNumber()),
40 track_number(mf.getTrackNumber()),42 track_number(mf.getTrackNumber()),
41 duration(mf.getDuration()) {43 duration(mf.getDuration()) {
42}44}
4345
44MediaFile MediaFileBuilder::build() const {46MediaFile MediaFileBuilder::build() const {
45 return MediaFile(filename, content_type, etag, title, date, author,47 return MediaFile(filename, content_type, etag, title, date, author,
46 album, album_artist, track_number, duration, type);48 album, album_artist, genre, disc_number, track_number, duration, type);
47}49}
4850
49void MediaFileBuilder::setType(MediaType t) {51void MediaFileBuilder::setType(MediaType t) {
@@ -103,6 +105,20 @@
103 album_artist_set = true;105 album_artist_set = true;
104}106}
105107
108void MediaFileBuilder::setGenre(const std::string &g) {
109 if(genre_set)
110 throw std::invalid_argument("Tried to set genre when it was already set.");
111 genre = g;
112 genre_set = true;
113}
114
115void MediaFileBuilder::setDiscNumber(int n) {
116 if(disc_number_set)
117 throw std::invalid_argument("Tried to set disc number when it was already set.");
118 disc_number = n;
119 disc_number_set = true;
120}
121
106void MediaFileBuilder::setTrackNumber(int n) {122void MediaFileBuilder::setTrackNumber(int n) {
107 if(track_number_set)123 if(track_number_set)
108 throw std::invalid_argument("Tried to set track number when it was already set.");124 throw std::invalid_argument("Tried to set track number when it was already set.");
109125
=== modified file 'src/mediascanner/MediaFileBuilder.hh'
--- src/mediascanner/MediaFileBuilder.hh 2014-01-31 03:48:16 +0000
+++ src/mediascanner/MediaFileBuilder.hh 2014-05-08 07:17:36 +0000
@@ -57,6 +57,8 @@
57 void setAuthor(const std::string &a);57 void setAuthor(const std::string &a);
58 void setAlbum(const std::string &a);58 void setAlbum(const std::string &a);
59 void setAlbumArtist(const std::string &a);59 void setAlbumArtist(const std::string &a);
60 void setGenre(const std::string &g);
61 void setDiscNumber(int n);
60 void setTrackNumber(int n);62 void setTrackNumber(int n);
61 void setDuration(int d);63 void setDuration(int d);
6264
@@ -87,11 +89,17 @@
87 bool album_artist_set = false;89 bool album_artist_set = false;
88 std::string album_artist;90 std::string album_artist;
8991
92 bool genre_set = false;
93 std::string genre;
94
95 bool disc_number_set = false;
96 int disc_number = 0;
97
98 bool track_number_set = false;
90 int track_number = 0;99 int track_number = 0;
91 bool track_number_set = false;
92100
101 bool duration_set = false;
93 int duration = 0;102 int duration = 0;
94 bool duration_set = false;
95};103};
96104
97}105}
98106
=== modified file 'src/mediascanner/MediaStore.cc'
--- src/mediascanner/MediaStore.cc 2014-03-07 08:15:52 +0000
+++ src/mediascanner/MediaStore.cc 2014-05-08 07:17:36 +0000
@@ -41,7 +41,7 @@
4141
42// Increment this whenever changing db schema.42// Increment this whenever changing db schema.
43// It will cause dbstore to rebuild its tables.43// It will cause dbstore to rebuild its tables.
44static const int schemaVersion = 4;44static const int schemaVersion = 5;
4545
46struct MediaStorePrivate {46struct MediaStorePrivate {
47 sqlite3 *db;47 sqlite3 *db;
@@ -175,9 +175,11 @@
175 etag TEXT,175 etag TEXT,
176 title TEXT,176 title TEXT,
177 date TEXT,177 date TEXT,
178 artist TEXT, -- Only relevant to audio178 artist TEXT, -- Only relevant to audio
179 album TEXT, -- Only relevant to audio179 album TEXT, -- Only relevant to audio
180 album_artist TEXT, -- Only relevant to audio180 album_artist TEXT, -- Only relevant to audio
181 genre TEXT, -- Only relevant to audio
182 disc_number INTEGER, -- Only relevant to audio
181 track_number INTEGER, -- Only relevant to audio183 track_number INTEGER, -- Only relevant to audio
182 duration INTEGER,184 duration INTEGER,
183 type INTEGER -- 0=Audio, 1=Video185 type INTEGER -- 0=Audio, 1=Video
@@ -191,9 +193,11 @@
191 etag TEXT,193 etag TEXT,
192 title TEXT,194 title TEXT,
193 date TEXT,195 date TEXT,
194 artist TEXT, -- Only relevant to audio196 artist TEXT, -- Only relevant to audio
195 album TEXT, -- Only relevant to audio197 album TEXT, -- Only relevant to audio
196 album_artist TEXT, -- Only relevant to audio198 album_artist TEXT, -- Only relevant to audio
199 genre TEXT, -- Only relevant to audio
200 disc_number INTEGER, -- Only relevant to audio
197 track_number INTEGER, -- Only relevant to audio201 track_number INTEGER, -- Only relevant to audio
198 duration INTEGER,202 duration INTEGER,
199 type INTEGER -- 0=Audio, 1=Video203 type INTEGER -- 0=Audio, 1=Video
@@ -283,7 +287,7 @@
283}287}
284288
285void MediaStorePrivate::insert(const MediaFile &m) const {289void MediaStorePrivate::insert(const MediaFile &m) const {
286 Statement query(db, "INSERT OR REPLACE INTO media (filename, content_type, etag, title, date, artist, album, album_artist, track_number, duration, type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");290 Statement query(db, "INSERT OR REPLACE INTO media (filename, content_type, etag, title, date, artist, album, album_artist, genre, disc_number, track_number, duration, type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
287 string fname = m.getFileName();291 string fname = m.getFileName();
288 string title = m.getTitle();292 string title = m.getTitle();
289 if(title.empty())293 if(title.empty())
@@ -299,9 +303,11 @@
299 if (album_artist.empty())303 if (album_artist.empty())
300 album_artist = m.getAuthor();304 album_artist = m.getAuthor();
301 query.bind(8, album_artist);305 query.bind(8, album_artist);
302 query.bind(9, m.getTrackNumber());306 query.bind(9, m.getGenre());
303 query.bind(10, m.getDuration());307 query.bind(10, m.getDiscNumber());
304 query.bind(11, (int)m.getType());308 query.bind(11, m.getTrackNumber());
309 query.bind(12, m.getDuration());
310 query.bind(13, (int)m.getType());
305 query.step();311 query.step();
306312
307 const char *typestr = m.getType() == AudioMedia ? "song" : "video";313 const char *typestr = m.getType() == AudioMedia ? "song" : "video";
@@ -327,10 +333,12 @@
327 const string author = query.getText(5);333 const string author = query.getText(5);
328 const string album = query.getText(6);334 const string album = query.getText(6);
329 const string album_artist = query.getText(7);335 const string album_artist = query.getText(7);
330 int track_number = query.getInt(8);336 const string genre = query.getText(8);
331 int duration = query.getInt(9);337 int disc_number = query.getInt(9);
332 MediaType type = (MediaType)query.getInt(10);338 int track_number = query.getInt(10);
333 return MediaFile(filename, content_type, etag, title, date, author, album, album_artist, track_number, duration, type);339 int duration = query.getInt(11);
340 MediaType type = (MediaType)query.getInt(12);
341 return MediaFile(filename, content_type, etag, title, date, author, album, album_artist, genre, disc_number, track_number, duration, type);
334}342}
335343
336static vector<MediaFile> collect_media(Statement &query) {344static vector<MediaFile> collect_media(Statement &query) {
@@ -343,7 +351,7 @@
343351
344MediaFile MediaStorePrivate::lookup(const std::string &filename) const {352MediaFile MediaStorePrivate::lookup(const std::string &filename) const {
345 Statement query(db, R"(353 Statement query(db, R"(
346SELECT filename, content_type, etag, title, date, artist, album, album_artist, track_number, duration, type354SELECT filename, content_type, etag, title, date, artist, album, album_artist, genre, disc_number, track_number, duration, type
347 FROM media355 FROM media
348 WHERE filename = ?356 WHERE filename = ?
349)");357)");
@@ -357,7 +365,7 @@
357vector<MediaFile> MediaStorePrivate::query(const std::string &core_term, MediaType type, int limit) const {365vector<MediaFile> MediaStorePrivate::query(const std::string &core_term, MediaType type, int limit) const {
358 if (core_term == "") {366 if (core_term == "") {
359 Statement query(db, R"(367 Statement query(db, R"(
360SELECT filename, content_type, etag, title, date, artist, album, album_artist, track_number, duration, type368SELECT filename, content_type, etag, title, date, artist, album, album_artist, genre, disc_number, track_number, duration, type
361 FROM media369 FROM media
362 WHERE type == ?370 WHERE type == ?
363 LIMIT ?371 LIMIT ?
@@ -367,7 +375,7 @@
367 return collect_media(query);375 return collect_media(query);
368 } else {376 } else {
369 Statement query(db, R"(377 Statement query(db, R"(
370SELECT filename, content_type, etag, title, date, artist, album, album_artist, track_number, duration, type378SELECT filename, content_type, etag, title, date, artist, album, album_artist, genre, disc_number, track_number, duration, type
371 FROM media JOIN (379 FROM media JOIN (
372 SELECT docid, rank(matchinfo(media_fts), 1.0, 0.5, 0.75) AS rank380 SELECT docid, rank(matchinfo(media_fts), 1.0, 0.5, 0.75) AS rank
373 FROM media_fts WHERE media_fts MATCH ?381 FROM media_fts WHERE media_fts MATCH ?
@@ -425,9 +433,9 @@
425433
426vector<MediaFile> MediaStorePrivate::getAlbumSongs(const Album& album) const {434vector<MediaFile> MediaStorePrivate::getAlbumSongs(const Album& album) const {
427 Statement query(db, R"(435 Statement query(db, R"(
428SELECT filename, content_type, etag, title, date, artist, album, album_artist, track_number, duration, type FROM media436SELECT filename, content_type, etag, title, date, artist, album, album_artist, genre, disc_number, track_number, duration, type FROM media
429WHERE album = ? AND album_artist = ? AND type = ?437WHERE album = ? AND album_artist = ? AND type = ?
430ORDER BY track_number438ORDER BY disc_number, track_number
431)");439)");
432 query.bind(1, album.getTitle());440 query.bind(1, album.getTitle());
433 query.bind(2, album.getArtist());441 query.bind(2, album.getArtist());
@@ -449,7 +457,7 @@
449457
450std::vector<MediaFile> MediaStore::listSongs(const std::string& artist, const std::string& album, const std::string& album_artist, int limit) const {458std::vector<MediaFile> MediaStore::listSongs(const std::string& artist, const std::string& album, const std::string& album_artist, int limit) const {
451 std::string qs(R"(459 std::string qs(R"(
452SELECT filename, content_type, etag, title, date, artist, album, album_artist, track_number, duration, type460SELECT filename, content_type, etag, title, date, artist, album, album_artist, genre, disc_number, track_number, duration, type
453 FROM media461 FROM media
454 WHERE type = ?462 WHERE type = ?
455)");463)");
@@ -463,7 +471,7 @@
463 qs += " AND album_artist = ?";471 qs += " AND album_artist = ?";
464 }472 }
465 qs += R"(473 qs += R"(
466ORDER BY album_artist, album, track_number, title474ORDER BY album_artist, album, disc_number, track_number, title
467LIMIT ?475LIMIT ?
468)";476)";
469 Statement query(p->db, qs.c_str());477 Statement query(p->db, qs.c_str());
470478
=== modified file 'src/qml/Ubuntu/MediaScanner/AlbumModelBase.cc'
--- src/qml/Ubuntu/MediaScanner/AlbumModelBase.cc 2014-03-24 10:04:19 +0000
+++ src/qml/Ubuntu/MediaScanner/AlbumModelBase.cc 2014-05-08 07:17:36 +0000
@@ -50,6 +50,10 @@
50 }50 }
51}51}
5252
53QVariant AlbumModelBase::get(int row, AlbumModelBase::Roles role) const {
54 return data(index(row, 0), role);
55}
56
53QHash<int, QByteArray> AlbumModelBase::roleNames() const {57QHash<int, QByteArray> AlbumModelBase::roleNames() const {
54 return roles;58 return roles;
55}59}
5660
=== modified file 'src/qml/Ubuntu/MediaScanner/AlbumModelBase.hh'
--- src/qml/Ubuntu/MediaScanner/AlbumModelBase.hh 2014-03-24 10:04:19 +0000
+++ src/qml/Ubuntu/MediaScanner/AlbumModelBase.hh 2014-05-08 07:17:36 +0000
@@ -31,6 +31,7 @@
31class AlbumModelBase : public QAbstractListModel {31class AlbumModelBase : public QAbstractListModel {
32 Q_OBJECT32 Q_OBJECT
33 Q_ENUMS(Roles)33 Q_ENUMS(Roles)
34 Q_PROPERTY(int rowCount READ rowCount) // NOTIFY modelReset
34public:35public:
35 enum Roles {36 enum Roles {
36 RoleTitle,37 RoleTitle,
@@ -41,6 +42,8 @@
41 explicit AlbumModelBase(QObject *parent = 0);42 explicit AlbumModelBase(QObject *parent = 0);
42 int rowCount(const QModelIndex &parent=QModelIndex()) const override;43 int rowCount(const QModelIndex &parent=QModelIndex()) const override;
43 QVariant data(const QModelIndex &index, int role) const override;44 QVariant data(const QModelIndex &index, int role) const override;
45
46 Q_INVOKABLE QVariant get(int row, Roles role) const;
44protected:47protected:
45 QHash<int, QByteArray> roleNames() const override;48 QHash<int, QByteArray> roleNames() const override;
46 void updateResults(const std::vector<mediascanner::Album> &results);49 void updateResults(const std::vector<mediascanner::Album> &results);
4750
=== modified file 'src/qml/Ubuntu/MediaScanner/ArtistsModel.cc'
--- src/qml/Ubuntu/MediaScanner/ArtistsModel.cc 2014-02-28 07:01:44 +0000
+++ src/qml/Ubuntu/MediaScanner/ArtistsModel.cc 2014-05-08 07:17:36 +0000
@@ -45,6 +45,10 @@
45 }45 }
46}46}
4747
48QVariant ArtistsModel::get(int row, ArtistsModel::Roles role) const {
49 return data(index(row, 0), role);
50}
51
48QHash<int, QByteArray> ArtistsModel::roleNames() const {52QHash<int, QByteArray> ArtistsModel::roleNames() const {
49 return roles;53 return roles;
50}54}
5155
=== modified file 'src/qml/Ubuntu/MediaScanner/ArtistsModel.hh'
--- src/qml/Ubuntu/MediaScanner/ArtistsModel.hh 2014-02-28 07:01:44 +0000
+++ src/qml/Ubuntu/MediaScanner/ArtistsModel.hh 2014-05-08 07:17:36 +0000
@@ -35,6 +35,7 @@
35 Q_PROPERTY(mediascanner::qml::MediaStoreWrapper* store READ getStore WRITE setStore)35 Q_PROPERTY(mediascanner::qml::MediaStoreWrapper* store READ getStore WRITE setStore)
36 Q_PROPERTY(bool albumArtists READ getAlbumArtists WRITE setAlbumArtists)36 Q_PROPERTY(bool albumArtists READ getAlbumArtists WRITE setAlbumArtists)
37 Q_PROPERTY(int limit READ getLimit WRITE setLimit)37 Q_PROPERTY(int limit READ getLimit WRITE setLimit)
38 Q_PROPERTY(int rowCount READ rowCount) // NOTIFY modelReset
38public:39public:
39 enum Roles {40 enum Roles {
40 RoleArtist,41 RoleArtist,
@@ -43,6 +44,8 @@
43 explicit ArtistsModel(QObject *parent = 0);44 explicit ArtistsModel(QObject *parent = 0);
44 int rowCount(const QModelIndex &parent=QModelIndex()) const override;45 int rowCount(const QModelIndex &parent=QModelIndex()) const override;
45 QVariant data(const QModelIndex &index, int role) const override;46 QVariant data(const QModelIndex &index, int role) const override;
47
48 Q_INVOKABLE QVariant get(int row, Roles role) const;
46protected:49protected:
47 QHash<int, QByteArray> roleNames() const override;50 QHash<int, QByteArray> roleNames() const override;
4851
4952
=== modified file 'src/qml/Ubuntu/MediaScanner/MediaFileModelBase.cc'
--- src/qml/Ubuntu/MediaScanner/MediaFileModelBase.cc 2014-03-24 10:04:19 +0000
+++ src/qml/Ubuntu/MediaScanner/MediaFileModelBase.cc 2014-05-08 07:17:36 +0000
@@ -35,6 +35,8 @@
35 roles[Roles::RoleAlbum] = "album";35 roles[Roles::RoleAlbum] = "album";
36 roles[Roles::RoleAlbumArtist] = "albumArtist";36 roles[Roles::RoleAlbumArtist] = "albumArtist";
37 roles[Roles::RoleDate] = "date";37 roles[Roles::RoleDate] = "date";
38 roles[Roles::RoleGenre] = "genre";
39 roles[Roles::RoleDiscNumber] = "discNumber";
38 roles[Roles::RoleTrackNumber] = "trackNumber";40 roles[Roles::RoleTrackNumber] = "trackNumber";
39 roles[Roles::RoleDuration] = "duration";41 roles[Roles::RoleDuration] = "duration";
40 roles[Roles::RoleArt] = "art";42 roles[Roles::RoleArt] = "art";
@@ -70,6 +72,10 @@
70 return QString::fromStdString(media.getAlbumArtist());72 return QString::fromStdString(media.getAlbumArtist());
71 case RoleDate:73 case RoleDate:
72 return QString::fromStdString(media.getDate());74 return QString::fromStdString(media.getDate());
75 case RoleGenre:
76 return QString::fromStdString(media.getGenre());
77 case RoleDiscNumber:
78 return media.getDiscNumber();
73 case RoleTrackNumber:79 case RoleTrackNumber:
74 return media.getTrackNumber();80 return media.getTrackNumber();
75 case RoleDuration:81 case RoleDuration:
@@ -81,6 +87,10 @@
81 }87 }
82}88}
8389
90QVariant MediaFileModelBase::get(int row, MediaFileModelBase::Roles role) const {
91 return data(index(row, 0), role);
92}
93
84QHash<int, QByteArray> MediaFileModelBase::roleNames() const {94QHash<int, QByteArray> MediaFileModelBase::roleNames() const {
85 return roles;95 return roles;
86}96}
8797
=== modified file 'src/qml/Ubuntu/MediaScanner/MediaFileModelBase.hh'
--- src/qml/Ubuntu/MediaScanner/MediaFileModelBase.hh 2014-03-24 10:04:19 +0000
+++ src/qml/Ubuntu/MediaScanner/MediaFileModelBase.hh 2014-05-08 07:17:36 +0000
@@ -31,6 +31,7 @@
31class MediaFileModelBase : public QAbstractListModel {31class MediaFileModelBase : public QAbstractListModel {
32 Q_OBJECT32 Q_OBJECT
33 Q_ENUMS(Roles)33 Q_ENUMS(Roles)
34 Q_PROPERTY(int rowCount READ rowCount) // NOTIFY modelReset
34public:35public:
35 enum Roles {36 enum Roles {
36 RoleModelData,37 RoleModelData,
@@ -43,6 +44,8 @@
43 RoleAlbum,44 RoleAlbum,
44 RoleAlbumArtist,45 RoleAlbumArtist,
45 RoleDate,46 RoleDate,
47 RoleGenre,
48 RoleDiscNumber,
46 RoleTrackNumber,49 RoleTrackNumber,
47 RoleDuration,50 RoleDuration,
48 RoleArt,51 RoleArt,
@@ -51,6 +54,8 @@
51 explicit MediaFileModelBase(QObject *parent = 0);54 explicit MediaFileModelBase(QObject *parent = 0);
52 int rowCount(const QModelIndex &parent=QModelIndex()) const override;55 int rowCount(const QModelIndex &parent=QModelIndex()) const override;
53 QVariant data(const QModelIndex &index, int role) const override;56 QVariant data(const QModelIndex &index, int role) const override;
57
58 Q_INVOKABLE QVariant get(int row, Roles role) const;
54protected:59protected:
55 QHash<int, QByteArray> roleNames() const override;60 QHash<int, QByteArray> roleNames() const override;
56 void updateResults(const std::vector<mediascanner::MediaFile> &results);61 void updateResults(const std::vector<mediascanner::MediaFile> &results);
5762
=== modified file 'src/qml/Ubuntu/MediaScanner/MediaFileWrapper.cc'
--- src/qml/Ubuntu/MediaScanner/MediaFileWrapper.cc 2014-03-24 10:04:19 +0000
+++ src/qml/Ubuntu/MediaScanner/MediaFileWrapper.cc 2014-05-08 07:17:36 +0000
@@ -62,6 +62,14 @@
62 return QString::fromStdString(media.getDate());62 return QString::fromStdString(media.getDate());
63}63}
6464
65QString MediaFileWrapper::genre() const {
66 return QString::fromStdString(media.getGenre());
67}
68
69int MediaFileWrapper::discNumber() const {
70 return media.getDiscNumber();
71}
72
65int MediaFileWrapper::trackNumber() const {73int MediaFileWrapper::trackNumber() const {
66 return media.getTrackNumber();74 return media.getTrackNumber();
67}75}
6876
=== modified file 'src/qml/Ubuntu/MediaScanner/MediaFileWrapper.hh'
--- src/qml/Ubuntu/MediaScanner/MediaFileWrapper.hh 2014-03-24 10:04:19 +0000
+++ src/qml/Ubuntu/MediaScanner/MediaFileWrapper.hh 2014-05-08 07:17:36 +0000
@@ -39,6 +39,8 @@
39 Q_PROPERTY(QString album READ album CONSTANT)39 Q_PROPERTY(QString album READ album CONSTANT)
40 Q_PROPERTY(QString albumArtist READ albumArtist CONSTANT)40 Q_PROPERTY(QString albumArtist READ albumArtist CONSTANT)
41 Q_PROPERTY(QString date READ date CONSTANT)41 Q_PROPERTY(QString date READ date CONSTANT)
42 Q_PROPERTY(QString genre READ genre CONSTANT)
43 Q_PROPERTY(int discNumber READ discNumber CONSTANT)
42 Q_PROPERTY(int trackNumber READ trackNumber CONSTANT)44 Q_PROPERTY(int trackNumber READ trackNumber CONSTANT)
43 Q_PROPERTY(int duration READ duration CONSTANT)45 Q_PROPERTY(int duration READ duration CONSTANT)
44 Q_PROPERTY(QString art READ art CONSTANT)46 Q_PROPERTY(QString art READ art CONSTANT)
@@ -53,6 +55,8 @@
53 QString album() const;55 QString album() const;
54 QString albumArtist() const;56 QString albumArtist() const;
55 QString date() const;57 QString date() const;
58 QString genre() const;
59 int discNumber() const;
56 int trackNumber() const;60 int trackNumber() const;
57 int duration() const;61 int duration() const;
58 QString art() const;62 QString art() const;
5963
=== modified file 'src/qml/Ubuntu/MediaScanner/plugin.qmltypes'
--- src/qml/Ubuntu/MediaScanner/plugin.qmltypes 2014-03-24 10:28:30 +0000
+++ src/qml/Ubuntu/MediaScanner/plugin.qmltypes 2014-05-08 07:17:36 +0000
@@ -18,6 +18,13 @@
18 "RoleArt": 218 "RoleArt": 2
19 }19 }
20 }20 }
21 Property { name: "rowCount"; type: "int"; isReadonly: true }
22 Method {
23 name: "get"
24 type: "QVariant"
25 Parameter { name: "row"; type: "int" }
26 Parameter { name: "role"; type: "Roles" }
27 }
21 }28 }
22 Component {29 Component {
23 name: "mediascanner::qml::AlbumsModel"30 name: "mediascanner::qml::AlbumsModel"
@@ -43,6 +50,13 @@
43 Property { name: "store"; type: "mediascanner::qml::MediaStoreWrapper"; isPointer: true }50 Property { name: "store"; type: "mediascanner::qml::MediaStoreWrapper"; isPointer: true }
44 Property { name: "albumArtists"; type: "bool" }51 Property { name: "albumArtists"; type: "bool" }
45 Property { name: "limit"; type: "int" }52 Property { name: "limit"; type: "int" }
53 Property { name: "rowCount"; type: "int"; isReadonly: true }
54 Method {
55 name: "get"
56 type: "QVariant"
57 Parameter { name: "row"; type: "int" }
58 Parameter { name: "role"; type: "Roles" }
59 }
46 }60 }
47 Component {61 Component {
48 name: "mediascanner::qml::MediaFileModelBase"62 name: "mediascanner::qml::MediaFileModelBase"
@@ -60,11 +74,20 @@
60 "RoleAlbum": 7,74 "RoleAlbum": 7,
61 "RoleAlbumArtist": 8,75 "RoleAlbumArtist": 8,
62 "RoleDate": 9,76 "RoleDate": 9,
63 "RoleTrackNumber": 10,77 "RoleGenre": 10,
64 "RoleDuration": 11,78 "RoleDiscNumber": 11,
65 "RoleArt": 1279 "RoleTrackNumber": 12,
80 "RoleDuration": 13,
81 "RoleArt": 14
66 }82 }
67 }83 }
84 Property { name: "rowCount"; type: "int"; isReadonly: true }
85 Method {
86 name: "get"
87 type: "QVariant"
88 Parameter { name: "row"; type: "int" }
89 Parameter { name: "role"; type: "Roles" }
90 }
68 }91 }
69 Component {92 Component {
70 name: "mediascanner::qml::MediaFileWrapper"93 name: "mediascanner::qml::MediaFileWrapper"
@@ -80,6 +103,8 @@
80 Property { name: "album"; type: "string"; isReadonly: true }103 Property { name: "album"; type: "string"; isReadonly: true }
81 Property { name: "albumArtist"; type: "string"; isReadonly: true }104 Property { name: "albumArtist"; type: "string"; isReadonly: true }
82 Property { name: "date"; type: "string"; isReadonly: true }105 Property { name: "date"; type: "string"; isReadonly: true }
106 Property { name: "genre"; type: "string"; isReadonly: true }
107 Property { name: "discNumber"; type: "int"; isReadonly: true }
83 Property { name: "trackNumber"; type: "int"; isReadonly: true }108 Property { name: "trackNumber"; type: "int"; isReadonly: true }
84 Property { name: "duration"; type: "int"; isReadonly: true }109 Property { name: "duration"; type: "int"; isReadonly: true }
85 Property { name: "art"; type: "string"; isReadonly: true }110 Property { name: "art"; type: "string"; isReadonly: true }
86111
=== modified file 'src/utils/scaletest.cc'
--- src/utils/scaletest.cc 2014-01-31 07:17:15 +0000
+++ src/utils/scaletest.cc 2014-05-08 07:17:36 +0000
@@ -84,7 +84,7 @@
84 track += " " + RNDWORD;84 track += " " + RNDWORD;
85 }85 }
86 string fname = to_string(i) + ".mp3";86 string fname = to_string(i) + ".mp3";
87 MediaFile mf(fname, "audio/mp3", "", track, "2013-01-01", artist, album, artist, trackCount, rnd() % 300, AudioMedia);87 MediaFile mf(fname, "audio/mp3", "", track, "2013-01-01", artist, album, artist, "", 0, trackCount, rnd() % 300, AudioMedia);
88 store.insert(mf);88 store.insert(mf);
89 i++;89 i++;
90 //printf("%s, %s, %s\n", artist.c_str(), album.c_str(), track.c_str());90 //printf("%s, %s, %s\n", artist.c_str(), album.c_str(), track.c_str());
9191
=== modified file 'test/qml/tst_mediastore.qml'
--- test/qml/tst_mediastore.qml 2014-03-24 10:04:19 +0000
+++ test/qml/tst_mediastore.qml 2014-05-08 07:17:36 +0000
@@ -31,6 +31,8 @@
31 checkAttr("album", "Spiderbait");31 checkAttr("album", "Spiderbait");
32 checkAttr("albumArtist", "Spiderbait");32 checkAttr("albumArtist", "Spiderbait");
33 checkAttr("date", "2013-11-15");33 checkAttr("date", "2013-11-15");
34 checkAttr("genre", "rock");
35 checkAttr("discNumber", 1);
34 checkAttr("trackNumber", 1);36 checkAttr("trackNumber", 1);
35 checkAttr("duration", 235);37 checkAttr("duration", 235);
36 checkAttr("art", "image://albumart/artist=Spiderbait&album=Spiderbait");38 checkAttr("art", "image://albumart/artist=Spiderbait&album=Spiderbait");
3739
=== modified file 'test/qml/tst_songsearchmodel.qml'
--- test/qml/tst_songsearchmodel.qml 2014-02-25 05:54:27 +0000
+++ test/qml/tst_songsearchmodel.qml 2014-05-08 07:17:36 +0000
@@ -15,14 +15,14 @@
15 query: ""15 query: ""
16 }16 }
1717
18 ListView {
19 id: songs_view
20 model: songs_model
21 }
22
23 TestCase {18 TestCase {
24 name: "SongsSearchModelTests"19 name: "SongsSearchModelTests"
25 function test_foo() {20 function test_search() {
21 // By default, the model lists all songs.
22 compare(songs_model.rowCount, 7, "songs_model.rowCount == 7");
23 songs_model.query = "revolution";
24 compare(songs_model.rowCount, 1, "songs_model.rowCount == 1");
25 compare(songs_model.get(0, SongsSearchModel.RoleTitle), "Revolution");
26 }26 }
27 }27 }
28}28}
2929
=== modified file 'test/test_mediastore.cc'
--- test/test_mediastore.cc 2014-03-07 08:13:07 +0000
+++ test/test_mediastore.cc 2014-05-08 07:17:36 +0000
@@ -54,11 +54,11 @@
54}54}
5555
56TEST_F(MediaStoreTest, equality) {56TEST_F(MediaStoreTest, equality) {
57 MediaFile audio1("a", "type", "etag", "1900", "b", "c", "d", "e", 1, 5, AudioMedia);57 MediaFile audio1("a", "type", "etag", "1900", "b", "c", "d", "e", "f", 0, 1, 5, AudioMedia);
58 MediaFile audio2("aa", "type", "etag", "1900", "b", "c", "d", "e", 1, 5, AudioMedia);58 MediaFile audio2("aa", "type", "etag", "1900", "b", "c", "d", "e", "f", 0, 1, 5, AudioMedia);
5959
60 MediaFile video1("a", "type", "etag", "b", "1900", "c", "d", "e", 0, 5, VideoMedia);60 MediaFile video1("a", "type", "etag", "b", "1900", "c", "d", "e", "f", 0, 0, 5, VideoMedia);
61 MediaFile video2("aa", "type", "etag", "b", "1900", "c", "d", "e", 0, 5, VideoMedia);61 MediaFile video2("aa", "type", "etag", "b", "1900", "c", "d", "e", "f", 0, 0, 5, VideoMedia);
6262
63 EXPECT_EQ(audio1, audio1);63 EXPECT_EQ(audio1, audio1);
64 EXPECT_EQ(video1, video1);64 EXPECT_EQ(video1, video1);
@@ -70,7 +70,7 @@
70}70}
7171
72TEST_F(MediaStoreTest, lookup) {72TEST_F(MediaStoreTest, lookup) {
73 MediaFile audio("aaa", "type", "etag", "bbb bbb", "1900-01-01", "ccc", "ddd", "eee", 3, 5, AudioMedia);73 MediaFile audio("aaa", "type", "etag", "bbb bbb", "1900-01-01", "ccc", "ddd", "eee", "fff", 0, 3, 5, AudioMedia);
74 MediaStore store(":memory:", MS_READ_WRITE);74 MediaStore store(":memory:", MS_READ_WRITE);
75 store.insert(audio);75 store.insert(audio);
7676
@@ -79,8 +79,8 @@
79}79}
8080
81TEST_F(MediaStoreTest, roundtrip) {81TEST_F(MediaStoreTest, roundtrip) {
82 MediaFile audio("aaa", "type", "etag", "bbb bbb", "1900-01-01", "ccc", "ddd", "eee", 3, 5, AudioMedia);82 MediaFile audio("aaa", "type", "etag", "bbb bbb", "1900-01-01", "ccc", "ddd", "eee", "fff", 0, 3, 5, AudioMedia);
83 MediaFile video("aaa2", "type", "etag", "bbb bbb", "2012-01-01", "ccc", "ddd", "eee", 0, 5, VideoMedia);83 MediaFile video("aaa2", "type", "etag", "bbb bbb", "2012-01-01", "ccc", "ddd", "eee", "fff", 0, 0, 5, VideoMedia);
84 MediaStore store(":memory:", MS_READ_WRITE);84 MediaStore store(":memory:", MS_READ_WRITE);
85 store.insert(audio);85 store.insert(audio);
86 store.insert(video);86 store.insert(video);
@@ -93,7 +93,7 @@
93}93}
9494
95TEST_F(MediaStoreTest, query_by_album) {95TEST_F(MediaStoreTest, query_by_album) {
96 MediaFile audio("/path/foo.ogg", "", "", "title", "1900-01-01", "artist", "album", "albumartist", 3, 5, AudioMedia);96 MediaFile audio("/path/foo.ogg", "", "", "title", "1900-01-01", "artist", "album", "albumartist", "genre", 0, 3, 5, AudioMedia);
97 MediaStore store(":memory:", MS_READ_WRITE);97 MediaStore store(":memory:", MS_READ_WRITE);
98 store.insert(audio);98 store.insert(audio);
9999
@@ -103,7 +103,7 @@
103 }103 }
104104
105TEST_F(MediaStoreTest, query_by_artist) {105TEST_F(MediaStoreTest, query_by_artist) {
106 MediaFile audio("/path/foo.ogg", "", "", "title", "1900-01-01", "artist", "album", "albumartist", 3, 5, AudioMedia);106 MediaFile audio("/path/foo.ogg", "", "", "title", "1900-01-01", "artist", "album", "albumartist", "genre", 1, 3, 5, AudioMedia);
107 MediaStore store(":memory:", MS_READ_WRITE);107 MediaStore store(":memory:", MS_READ_WRITE);
108 store.insert(audio);108 store.insert(audio);
109109
@@ -113,18 +113,18 @@
113 }113 }
114114
115TEST_F(MediaStoreTest, query_ranking) {115TEST_F(MediaStoreTest, query_ranking) {
116 MediaFile audio1("/path/foo1.ogg", "", "", "title", "1900-01-01", "artist", "album", "albumartist", 3, 5, AudioMedia);116 MediaFile audio1("/path/foo1.ogg", "", "", "title", "1900-01-01", "artist", "album", "albumartist", "genre", 1, 3, 5, AudioMedia);
117 MediaFile audio2("/path/foo2.ogg", "", "", "title aaa", "1900-01-01", "artist", "album", "albumartist", 3, 5, AudioMedia);117 MediaFile audio2("/path/foo2.ogg", "", "", "title aaa", "1900-01-01", "artist", "album", "albumartist", "genre", 1, 3, 5, AudioMedia);
118 MediaFile audio3("/path/foo3.ogg", "", "", "title", "1900-01-01", "artist aaa", "album", "albumartist", 3, 5, AudioMedia);118 MediaFile audio3("/path/foo3.ogg", "", "", "title", "1900-01-01", "artist aaa", "album", "albumartist", "genre", 1, 3, 5, AudioMedia);
119 MediaFile audio4("/path/foo4.ogg", "", "", "title", "1900-01-01", "artist", "album aaa", "albumartist", 3, 5, AudioMedia);119 MediaFile audio4("/path/foo4.ogg", "", "", "title", "1900-01-01", "artist", "album aaa", "albumartist", "genre", 1, 3, 5, AudioMedia);
120 MediaFile audio5("/path/foo5.ogg", "", "", "title aaa", "1900-01-01", "artist aaa", "album aaa", "albumartist", 3, 5, AudioMedia);120 MediaFile audio5("/path/foo5.ogg", "", "", "title aaa", "1900-01-01", "artist aaa", "album aaa", "albumartist", "genre", 1, 3, 5, AudioMedia);
121121
122 MediaStore store(":memory:", MS_READ_WRITE);122 MediaStore store(":memory:", MS_READ_WRITE);
123 store.insert(audio1);123 store.insert(audio1);
124 store.insert(audio2);124 store.insert(audio2);
125 store.insert(audio3);125 store.insert(audio3);
126 store.insert(audio4);126 store.insert(audio4);
127 store.insert(audio5);127 store.insert(audio5);
128128
129 vector<MediaFile> result = store.query("aaa", AudioMedia);129 vector<MediaFile> result = store.query("aaa", AudioMedia);
130 ASSERT_EQ(result.size(), 4);130 ASSERT_EQ(result.size(), 4);
@@ -135,9 +135,9 @@
135}135}
136136
137TEST_F(MediaStoreTest, query_limit) {137TEST_F(MediaStoreTest, query_limit) {
138 MediaFile audio1("/path/foo5.ogg", "", "", "title aaa", "1900-01-01", "artist aaa", "album aaa", "albumartist", 3, 5, AudioMedia);138 MediaFile audio1("/path/foo5.ogg", "", "", "title aaa", "1900-01-01", "artist aaa", "album aaa", "albumartist", "genre", 1, 3, 5, AudioMedia);
139 MediaFile audio2("/path/foo2.ogg", "", "", "title aaa", "1900-01-01", "artist", "album", "albumartist", 3, 5, AudioMedia);139 MediaFile audio2("/path/foo2.ogg", "", "", "title aaa", "1900-01-01", "artist", "album", "albumartist", "genre", 1, 3, 5, AudioMedia);
140 MediaFile audio3("/path/foo4.ogg", "", "", "title", "1900-01-01", "artist", "album aaa", "albumartist", 3, 5, AudioMedia);140 MediaFile audio3("/path/foo4.ogg", "", "", "title", "1900-01-01", "artist", "album aaa", "albumartist", "genre", 1, 3, 5, AudioMedia);
141141
142 MediaStore store(":memory:", MS_READ_WRITE);142 MediaStore store(":memory:", MS_READ_WRITE);
143 store.insert(audio1);143 store.insert(audio1);
@@ -151,8 +151,8 @@
151}151}
152152
153TEST_F(MediaStoreTest, query_short) {153TEST_F(MediaStoreTest, query_short) {
154 MediaFile audio1("/path/foo5.ogg", "", "", "title xyz", "1900-01-01", "artist", "album", "albumartist", 3, 5, AudioMedia);154 MediaFile audio1("/path/foo5.ogg", "", "", "title xyz", "1900-01-01", "artist", "album", "albumartist", "genre", 1, 3, 5, AudioMedia);
155 MediaFile audio2("/path/foo2.ogg", "", "", "title xzy", "1900-01-01", "artist", "album", "albumartist", 3, 5, AudioMedia);155 MediaFile audio2("/path/foo2.ogg", "", "", "title xzy", "1900-01-01", "artist", "album", "albumartist", "genre", 1, 3, 5, AudioMedia);
156156
157 MediaStore store(":memory:", MS_READ_WRITE);157 MediaStore store(":memory:", MS_READ_WRITE);
158 store.insert(audio1);158 store.insert(audio1);
@@ -165,9 +165,9 @@
165}165}
166166
167TEST_F(MediaStoreTest, query_empty) {167TEST_F(MediaStoreTest, query_empty) {
168 MediaFile audio1("/path/foo5.ogg", "", "", "title aaa", "1900-01-01", "artist aaa", "album aaa", "albumartist", 3, 5, AudioMedia);168 MediaFile audio1("/path/foo5.ogg", "", "", "title aaa", "1900-01-01", "artist aaa", "album aaa", "albumartist", "genre", 1, 3, 5, AudioMedia);
169 MediaFile audio2("/path/foo2.ogg", "", "", "title aaa", "1900-01-01", "artist", "album", "albumartist", 3, 5, AudioMedia);169 MediaFile audio2("/path/foo2.ogg", "", "", "title aaa", "1900-01-01", "artist", "album", "albumartist", "genre", 1, 3, 5, AudioMedia);
170 MediaFile audio3("/path/foo4.ogg", "", "", "title", "1900-01-01", "artist", "album aaa", "albumartist", 3, 5, AudioMedia);170 MediaFile audio3("/path/foo4.ogg", "", "", "title", "1900-01-01", "artist", "album aaa", "albumartist", "genre", 1, 3, 5, AudioMedia);
171171
172 MediaStore store(":memory:", MS_READ_WRITE);172 MediaStore store(":memory:", MS_READ_WRITE);
173 store.insert(audio1);173 store.insert(audio1);
@@ -180,8 +180,8 @@
180}180}
181181
182TEST_F(MediaStoreTest, unmount) {182TEST_F(MediaStoreTest, unmount) {
183 MediaFile audio1("/media/username/dir/fname.ogg", "", "", "bbb bbb", "2000-01-01", "ccc", "ddd", "eee", 1, 5, AudioMedia);183 MediaFile audio1("/media/username/dir/fname.ogg", "", "", "bbb bbb", "2000-01-01", "ccc", "ddd", "eee", "ffff", 0, 1, 5, AudioMedia);
184 MediaFile audio2("/home/username/Music/fname.ogg", "", "", "bbb bbb", "1900-01-01", "ccc", "ddd", "eee", 42, 5, AudioMedia);184 MediaFile audio2("/home/username/Music/fname.ogg", "", "", "bbb bbb", "1900-01-01", "ccc", "ddd", "eee", "ffff", 0, 42, 5, AudioMedia);
185 MediaStore store(":memory:", MS_READ_WRITE);185 MediaStore store(":memory:", MS_READ_WRITE);
186 store.insert(audio1);186 store.insert(audio1);
187 store.insert(audio2);187 store.insert(audio2);
@@ -210,10 +210,10 @@
210}210}
211211
212TEST_F(MediaStoreTest, queryAlbums) {212TEST_F(MediaStoreTest, queryAlbums) {
213 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "Various Artists", 1, 5, AudioMedia);213 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "Various Artists", "genre", 1, 1, 5, AudioMedia);
214 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistTwo", "AlbumOne", "Various Artists", 2, 5, AudioMedia);214 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistTwo", "AlbumOne", "Various Artists", "genre", 1, 2, 5, AudioMedia);
215 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistThree", "AlbumOne", "Various Artists", 3, 5, AudioMedia);215 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistThree", "AlbumOne", "Various Artists", "genre", 1, 3, 5, AudioMedia);
216 MediaFile audio4("/home/username/Music/fname.ogg", "", "", "TitleFour", "1900-01-01", "ArtistFour", "AlbumTwo", "ArtistFour", 1, 5, AudioMedia);216 MediaFile audio4("/home/username/Music/fname.ogg", "", "", "TitleFour", "1900-01-01", "ArtistFour", "AlbumTwo", "ArtistFour", "genre", 1, 1, 5, AudioMedia);
217217
218 MediaStore store(":memory:", MS_READ_WRITE);218 MediaStore store(":memory:", MS_READ_WRITE);
219 store.insert(audio1);219 store.insert(audio1);
@@ -241,10 +241,10 @@
241}241}
242242
243TEST_F(MediaStoreTest, queryAlbums_limit) {243TEST_F(MediaStoreTest, queryAlbums_limit) {
244 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "Various Artists", 1, 5, AudioMedia);244 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "Various Artists", "genre", 1, 1, 5, AudioMedia);
245 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistTwo", "AlbumOne", "Various Artists", 2, 5, AudioMedia);245 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistTwo", "AlbumOne", "Various Artists", "genre", 1, 2, 5, AudioMedia);
246 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistThree", "AlbumOne", "Various Artists", 3, 5, AudioMedia);246 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistThree", "AlbumOne", "Various Artists", "genre", 1, 3, 5, AudioMedia);
247 MediaFile audio4("/home/username/Music/fname.ogg", "", "", "TitleFour", "1900-01-01", "ArtistFour", "AlbumTwo", "ArtistFour", 1, 5, AudioMedia);247 MediaFile audio4("/home/username/Music/fname.ogg", "", "", "TitleFour", "1900-01-01", "ArtistFour", "AlbumTwo", "ArtistFour", "genre", 1, 1, 5, AudioMedia);
248248
249 MediaStore store(":memory:", MS_READ_WRITE);249 MediaStore store(":memory:", MS_READ_WRITE);
250 store.insert(audio1);250 store.insert(audio1);
@@ -259,10 +259,10 @@
259}259}
260260
261TEST_F(MediaStoreTest, queryAlbums_empty) {261TEST_F(MediaStoreTest, queryAlbums_empty) {
262 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "Various Artists", 1, 5, AudioMedia);262 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "Various Artists", "genre", 1, 1, 5, AudioMedia);
263 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistTwo", "AlbumOne", "Various Artists", 2, 5, AudioMedia);263 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistTwo", "AlbumOne", "Various Artists", "genre", 1, 2, 5, AudioMedia);
264 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistThree", "AlbumOne", "Various Artists", 3, 5, AudioMedia);264 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistThree", "AlbumOne", "Various Artists", "genre", 1, 3, 5, AudioMedia);
265 MediaFile audio4("/home/username/Music/fname.ogg", "", "", "TitleFour", "1900-01-01", "ArtistFour", "AlbumTwo", "ArtistFour", 1, 5, AudioMedia);265 MediaFile audio4("/home/username/Music/fname.ogg", "", "", "TitleFour", "1900-01-01", "ArtistFour", "AlbumTwo", "ArtistFour", "genre", 1, 1, 5, AudioMedia);
266266
267 MediaStore store(":memory:", MS_READ_WRITE);267 MediaStore store(":memory:", MS_READ_WRITE);
268 store.insert(audio1);268 store.insert(audio1);
@@ -277,9 +277,9 @@
277}277}
278278
279TEST_F(MediaStoreTest, getAlbumSongs) {279TEST_F(MediaStoreTest, getAlbumSongs) {
280 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "Various Artists", 1, 5, AudioMedia);280 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "Various Artists", "genre", 1, 1, 5, AudioMedia);
281 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistTwo", "AlbumOne", "Various Artists", 2, 5, AudioMedia);281 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistTwo", "AlbumOne", "Various Artists", "genre", 1, 2, 5, AudioMedia);
282 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistThree", "AlbumOne", "Various Artists", 3, 5, AudioMedia);282 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistThree", "AlbumOne", "Various Artists", "genre", 1, 3, 5, AudioMedia);
283283
284 MediaStore store(":memory:", MS_READ_WRITE);284 MediaStore store(":memory:", MS_READ_WRITE);
285 store.insert(audio1);285 store.insert(audio1);
@@ -295,7 +295,7 @@
295}295}
296296
297TEST_F(MediaStoreTest, getETag) {297TEST_F(MediaStoreTest, getETag) {
298 MediaFile file("/path/file.ogg", "audio/ogg", "etag", "title", "2013", "artist", "album", "artist", 1, 5, AudioMedia);298 MediaFile file("/path/file.ogg", "audio/ogg", "etag", "title", "2013", "artist", "album", "artist", "genre", 1, 1, 5, AudioMedia);
299299
300 MediaStore store(":memory:", MS_READ_WRITE);300 MediaStore store(":memory:", MS_READ_WRITE);
301 store.insert(file);301 store.insert(file);
@@ -305,12 +305,12 @@
305}305}
306306
307TEST_F(MediaStoreTest, listSongs) {307TEST_F(MediaStoreTest, listSongs) {
308 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "ArtistOne", 1, 5, AudioMedia);308 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "ArtistOne", "genre", 1, 1, 5, AudioMedia);
309 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistOne", "AlbumOne", "ArtistOne", 2, 5, AudioMedia);309 MediaFile audio2("/home/username/Music/track2.ogg", "", "", "TitleTwo", "1900-01-01", "ArtistOne", "AlbumOne", "ArtistOne", "genre", 1, 2, 5, AudioMedia);
310 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistOne", "AlbumTwo", "ArtistOne", 3, 5, AudioMedia);310 MediaFile audio3("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistOne", "AlbumTwo", "ArtistOne", "genre", 1, 3, 5, AudioMedia);
311 MediaFile audio4("/home/username/Music/track4.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumThree", "ArtistTwo", 1, 5, AudioMedia);311 MediaFile audio4("/home/username/Music/track4.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumThree", "ArtistTwo", "genre", 1, 1, 5, AudioMedia);
312 MediaFile audio5("/home/username/Music/track5.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumFour", "Various Artists", 1, 5, AudioMedia);312 MediaFile audio5("/home/username/Music/track5.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumFour", "Various Artists", "genre", 1, 1, 5, AudioMedia);
313 MediaFile audio6("/home/username/Music/track6.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumFour", "Various Artists", 2, 5, AudioMedia);313 MediaFile audio6("/home/username/Music/track6.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumFour", "Various Artists", "genre", 1, 2, 5, AudioMedia);
314314
315 MediaStore store(":memory:", MS_READ_WRITE);315 MediaStore store(":memory:", MS_READ_WRITE);
316 store.insert(audio1);316 store.insert(audio1);
@@ -352,11 +352,11 @@
352}352}
353353
354TEST_F(MediaStoreTest, listAlbums) {354TEST_F(MediaStoreTest, listAlbums) {
355 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "ArtistOne", 1, 5, AudioMedia);355 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "ArtistOne", "genre", 1, 1, 5, AudioMedia);
356 MediaFile audio2("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistOne", "AlbumTwo", "ArtistOne", 3, 5, AudioMedia);356 MediaFile audio2("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistOne", "AlbumTwo", "ArtistOne", "genre", 1, 3, 5, AudioMedia);
357 MediaFile audio3("/home/username/Music/track4.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumThree", "ArtistTwo", 1, 5, AudioMedia);357 MediaFile audio3("/home/username/Music/track4.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumThree", "ArtistTwo", "genre", 1, 1, 5, AudioMedia);
358 MediaFile audio4("/home/username/Music/track5.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumFour", "Various Artists", 1, 5, AudioMedia);358 MediaFile audio4("/home/username/Music/track5.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumFour", "Various Artists", "genre", 1, 1, 5, AudioMedia);
359 MediaFile audio5("/home/username/Music/track6.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumFour", "Various Artists", 2, 5, AudioMedia);359 MediaFile audio5("/home/username/Music/track6.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumFour", "Various Artists", "genre", 1, 2, 5, AudioMedia);
360360
361 MediaStore store(":memory:", MS_READ_WRITE);361 MediaStore store(":memory:", MS_READ_WRITE);
362 store.insert(audio1);362 store.insert(audio1);
@@ -387,11 +387,11 @@
387}387}
388388
389TEST_F(MediaStoreTest, listArtists) {389TEST_F(MediaStoreTest, listArtists) {
390 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "ArtistOne", 1, 5, AudioMedia);390 MediaFile audio1("/home/username/Music/track1.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumOne", "ArtistOne", "genre", 1, 1, 5, AudioMedia);
391 MediaFile audio2("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistOne", "AlbumTwo", "ArtistOne", 3, 5, AudioMedia);391 MediaFile audio2("/home/username/Music/track3.ogg", "", "", "TitleThree", "1900-01-01", "ArtistOne", "AlbumTwo", "ArtistOne", "genre", 1, 3, 5, AudioMedia);
392 MediaFile audio3("/home/username/Music/track4.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumThree", "ArtistTwo", 1, 5, AudioMedia);392 MediaFile audio3("/home/username/Music/track4.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumThree", "ArtistTwo", "genre", 1, 1, 5, AudioMedia);
393 MediaFile audio4("/home/username/Music/track5.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumFour", "Various Artists", 1, 5, AudioMedia);393 MediaFile audio4("/home/username/Music/track5.ogg", "", "", "TitleOne", "1900-01-01", "ArtistOne", "AlbumFour", "Various Artists", "genre", 1, 1, 5, AudioMedia);
394 MediaFile audio5("/home/username/Music/track6.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumFour", "Various Artists", 2, 5, AudioMedia);394 MediaFile audio5("/home/username/Music/track6.ogg", "", "", "TitleFour", "1900-01-01", "ArtistTwo", "AlbumFour", "Various Artists", "genre", 1, 2, 5, AudioMedia);
395395
396 MediaStore store(":memory:", MS_READ_WRITE);396 MediaStore store(":memory:", MS_READ_WRITE);
397 store.insert(audio1);397 store.insert(audio1);
398398
=== modified file 'test/test_qml.cc'
--- test/test_qml.cc 2014-02-25 05:54:27 +0000
+++ test/test_qml.cc 2014-05-08 07:17:36 +0000
@@ -29,28 +29,28 @@
2929
30 store.insert(MediaFile("/path/foo1.ogg", "audio/ogg", "etag",30 store.insert(MediaFile("/path/foo1.ogg", "audio/ogg", "etag",
31 "Straight Through The Sun", "2013-11-15", "Spiderbait",31 "Straight Through The Sun", "2013-11-15", "Spiderbait",
32 "Spiderbait", "Spiderbait", 1, 235, AudioMedia));32 "Spiderbait", "Spiderbait", "rock", 1, 1, 235, AudioMedia));
33 store.insert(MediaFile("/path/foo2.ogg", "audio/ogg", "etag",33 store.insert(MediaFile("/path/foo2.ogg", "audio/ogg", "etag",
34 "It's Beautiful", "2013-11-15", "Spiderbait",34 "It's Beautiful", "2013-11-15", "Spiderbait",
35 "Spiderbait", "Spiderbait", 2, 220, AudioMedia));35 "Spiderbait", "Spiderbait", "rock", 1, 2, 220, AudioMedia));
3636
37 store.insert(MediaFile("/path/foo3.ogg", "audio/ogg", "etag",37 store.insert(MediaFile("/path/foo3.ogg", "audio/ogg", "etag",
38 "Buy Me a Pony", "1996-10-04", "Spiderbait",38 "Buy Me a Pony", "1996-10-04", "Spiderbait",
39 "Ivy and the Big Apples", "Spiderbait", 3, 104, AudioMedia));39 "Ivy and the Big Apples", "Spiderbait", "rock", 1, 3, 104, AudioMedia));
4040
41 store.insert(MediaFile("/path/foo4.ogg", "audio/ogg", "etag",41 store.insert(MediaFile("/path/foo4.ogg", "audio/ogg", "etag",
42 "Peaches & Cream", "2004-03-08", "The John Butler Trio",42 "Peaches & Cream", "2004-03-08", "The John Butler Trio",
43 "Sunrise Over Sea", "The John Butler Trio", 2, 407, AudioMedia));43 "Sunrise Over Sea", "The John Butler Trio", "roots", 1, 2, 407, AudioMedia));
44 store.insert(MediaFile("/path/foo5.ogg", "audio/ogg", "etag",44 store.insert(MediaFile("/path/foo5.ogg", "audio/ogg", "etag",
45 "Zebra", "2004-03-08", "The John Butler Trio",45 "Zebra", "2004-03-08", "The John Butler Trio",
46 "Sunrise Over Sea", "The John Butler Trio", 10, 237, AudioMedia));46 "Sunrise Over Sea", "The John Butler Trio", "roots", 1, 10, 237, AudioMedia));
4747
48 store.insert(MediaFile("/path/foo6.ogg", "audio/ogg", "etag",48 store.insert(MediaFile("/path/foo6.ogg", "audio/ogg", "etag",
49 "Revolution", "2010-01-01", "The John Butler Trio",49 "Revolution", "2010-01-01", "The John Butler Trio",
50 "April Uprising", "The John Butler Trio", 1, 305, AudioMedia));50 "April Uprising", "The John Butler Trio", "roots", 1, 1, 305, AudioMedia));
51 store.insert(MediaFile("/path/foo7.ogg", "audio/ogg", "etag",51 store.insert(MediaFile("/path/foo7.ogg", "audio/ogg", "etag",
52 "One Way Road", "2010-01-01", "The John Butler Trio",52 "One Way Road", "2010-01-01", "The John Butler Trio",
53 "April Uprising", "The John Butler Trio", 2, 185, AudioMedia));53 "April Uprising", "The John Butler Trio", "roots", 1, 2, 185, AudioMedia));
54 }54 }
5555
56private:56private:

Subscribers

People subscribed via source and target branches