Merge lp:~jonathan-costers/mixxx/LP878931 into lp:~mixxxdevelopers/mixxx/trunk

Proposed by Jonathan Costers
Status: Merged
Merged at revision: 2979
Proposed branch: lp:~jonathan-costers/mixxx/LP878931
Merge into: lp:~mixxxdevelopers/mixxx/trunk
Diff against target: 1157 lines (+124/-303)
19 files modified
mixxx/res/schema.xml (+0/-288)
mixxx/src/audiotagger.cpp (+26/-0)
mixxx/src/audiotagger.h (+2/-0)
mixxx/src/dlgtrackinfo.cpp (+3/-0)
mixxx/src/dlgtrackinfo.ui (+21/-6)
mixxx/src/library/basesqltablemodel.cpp (+4/-1)
mixxx/src/library/basetrackcache.cpp (+2/-0)
mixxx/src/library/browse/browsetablemodel.cpp (+5/-0)
mixxx/src/library/browse/browsetablemodel.h (+1/-0)
mixxx/src/library/browse/browsethread.cpp (+3/-0)
mixxx/src/library/dao/trackdao.cpp (+12/-6)
mixxx/src/library/dao/trackdao.h (+1/-0)
mixxx/src/library/mixxxlibraryfeature.cpp (+1/-0)
mixxx/src/library/trackcollection.cpp (+1/-1)
mixxx/src/soundsource.cpp (+14/-0)
mixxx/src/soundsource.h (+3/-0)
mixxx/src/soundsourceproxy.cpp (+2/-1)
mixxx/src/trackinfoobject.cpp (+16/-0)
mixxx/src/trackinfoobject.h (+7/-0)
To merge this branch: bzr merge lp:~jonathan-costers/mixxx/LP878931
Reviewer Review Type Date Requested Status
RJ Skerry-Ryan Approve
Review via email: mp+87046@code.launchpad.net

Description of the change

Add Composer field to the library:
- DB revision 14, adding composer field to library table
- updated relevant models and DAOs
- updated library ui and track info dialog to show new field
- integrated new field with existing tag reading/writing

To post a comment you must log in.
lp:~jonathan-costers/mixxx/LP878931 updated
2983. By jonathan

use empty string as default value for composer field, instead of "?"

Revision history for this message
RJ Skerry-Ryan (rryan) wrote :

Thanks Jonathan! I'll get the code reviewed this weekend.

Revision history for this message
RJ Skerry-Ryan (rryan) wrote :

Looks good to me! Thanks Jonathan and nice job on making your code blend in with wherever you were writing it. As you have surely noticed there are a variety of different styles of code lurking around the codebase :).

I have one question. Is there a standard composer field for M4A files? I noticed you haven't updated SoundSource::processMP4Tag to look for one.

Is it ok if I add you to the credits as "Jonathan Costers"?

I'm merging this to trunk now and it will be in the 1.11.0 release later this year.

review: Approve
Revision history for this message
Jonathan Costers (jonathan-costers) wrote :

Haha, yes I did notice.
Not a lot different from any other projects I've been involved with in the past, for that matter :-)

I must have overlooked M4A tagging ... Let me find out.

Thanks for adding me to the credits! Jonathan Costers is quite alright.

Revision history for this message
RJ Skerry-Ryan (rryan) wrote :

I actually found a reference here:
http://atomicparsley.sourceforge.net/mpeg-4files.html

And added the appropriate parsing to trunk last night but I didn't test it.

On Sat, Jan 7, 2012 at 6:52 AM, Jonathan Costers <<email address hidden>
> wrote:

> Haha, yes I did notice.
> Not a lot different from any other projects I've been involved with in the
> past, for that matter :-)
>
> I must have overlooked M4A tagging ... Let me find out.
>
> Thanks for adding me to the credits! Jonathan Costers is quite alright.
> --
> https://code.launchpad.net/~jonathan-costers/mixxx/LP878931/+merge/87046
> You are reviewing the proposed merge of
> lp:~jonathan-costers/mixxx/LP878931 into lp:mixxx.
>

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'mixxx/res/schema.xml'
--- mixxx/res/schema.xml 1970-01-01 00:00:00 +0000
+++ mixxx/res/schema.xml 2011-12-28 23:47:25 +0000
@@ -0,0 +1,296 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--
3This is the Mixxx schema history file. It keeps track of internal changes to the
4Mixxx database schema and allows Mixxx to automatically upgrade itself to new
5revisions of the schema on a version upgrade.
6
7DO NOT EDIT THIS FILE OR YOU WILL BREAK YOUR MIXXX LIBRARY AND LOSE YOUR
8METADATA
9-->
10<schema>
11 <revision version="1">
12 <description>
13 The base schema for the Mixxx SQLITE database.
14 </description>
15 <sql>
16 CREATE TABLE IF NOT EXISTS settings (
17 name TEXT UNIQUE NOT NULL,
18 value TEXT,
19 locked INTEGER DEFAULT 0,
20 hidden INTEGER DEFAULT 0);
21
22 CREATE TABLE IF NOT EXISTS track_locations (
23 id INTEGER PRIMARY KEY AUTOINCREMENT,
24 location varchar(512) UNIQUE,
25 filename varchar(512),
26 directory varchar(512),
27 filesize INTEGER,
28 fs_deleted INTEGER,
29 needs_verification INTEGER);
30
31 CREATE TABLE IF NOT EXISTS LibraryHashes (
32 directory_path VARCHAR(256) primary key,
33 hash INTEGER,
34 directory_deleted INTEGER);
35
36 CREATE TABLE IF NOT EXISTS library (
37 id INTEGER primary key AUTOINCREMENT,
38 artist varchar(48), title varchar(48),
39 album varchar(48), year varchar(16),
40 genre varchar(32), tracknumber varchar(3),
41 location varchar(512) REFERENCES track_locations(location),
42 comment varchar(20), url varchar(256),
43 duration integer,
44 bitrate integer, samplerate integer,
45 cuepoint integer, bpm float,
46 wavesummaryhex blob,
47 channels integer,
48 datetime_added DEFAULT CURRENT_TIMESTAMP,
49 mixxx_deleted integer,
50 played integer);
51
52 CREATE TABLE Playlists (
53 id INTEGER primary key,
54 name varchar(48),
55 position INTEGER,
56 hidden INTEGER DEFAULT 0 NOT NULL,
57 date_created datetime,
58 date_modified datetime);
59
60 CREATE TABLE PlaylistTracks (
61 id INTEGER primary key,
62 playlist_id INTEGER REFERENCES Playlists(id),
63 track_id INTEGER REFERENCES library(id),
64 position INTEGER);
65
66 CREATE TABLE IF NOT EXISTS cues (
67 id integer PRIMARY KEY AUTOINCREMENT,
68 track_id integer NOT NULL REFERENCES library(id),
69 type integer DEFAULT 0 NOT NULL,
70 position integer DEFAULT -1 NOT NULL,
71 length integer DEFAULT 0 NOT NULL,
72 hotcue integer DEFAULT -1 NOT NULL,
73 label text DEFAULT '' NOT NULL);
74
75 CREATE TABLE IF NOT EXISTS crates (
76 id integer PRIMARY KEY AUTOINCREMENT,
77 name varchar(48) UNIQUE NOT NULL,
78 count integer DEFAULT 0,
79 show integer DEFAULT 1);
80
81 CREATE TABLE IF NOT EXISTS crate_tracks (
82 crate_id integer NOT NULL REFERENCES crates(id),
83 track_id integer NOT NULL REFERENCES library(id),
84 UNIQUE (crate_id, track_id));
85
86 </sql>
87 </revision>
88 <revision version="2">
89 <description>
90 Add a header_parsed integer column to the library to indicate when a
91 track's tags have been parsed.
92 </description>
93 <sql>
94 ALTER TABLE library ADD COLUMN header_parsed integer DEFAULT 0;
95 </sql>
96 </revision>
97 <revision version="3">
98 <description>
99 Change the location column to be a an integer. Change comment to be
100 varchar(256) and album/artist/title to be varchar(64).
101 </description>
102 <sql>
103 ALTER TABLE library RENAME TO library_old;
104
105 CREATE TABLE IF NOT EXISTS library (
106 id INTEGER primary key AUTOINCREMENT,
107 artist varchar(64),
108 title varchar(64),
109 album varchar(64),
110 year varchar(16),
111 genre varchar(64),
112 tracknumber varchar(3),
113 location integer REFERENCES track_locations(location),
114 comment varchar(256),
115 url varchar(256),
116 duration integer,
117 bitrate integer,
118 samplerate integer,
119 cuepoint integer,
120 bpm float,
121 wavesummaryhex blob,
122 channels integer,
123 datetime_added DEFAULT CURRENT_TIMESTAMP,
124 mixxx_deleted integer,
125 played integer,
126 header_parsed integer DEFAULT 0);
127
128 INSERT INTO library (id, artist, title, album, year, genre, tracknumber, location, comment, url, duration, bitrate, samplerate, bpm, cuepoint, bpm, wavesummaryhex, channels, datetime_added, mixxx_deleted, played, header_parsed) SELECT id, artist, title, album, year, genre, tracknumber, location, comment, url, duration, bitrate, samplerate, bpm, cuepoint, bpm, wavesummaryhex, channels, datetime_added, mixxx_deleted, played, header_parsed from library_old;
129
130 DROP TABLE library_old;
131 </sql>
132 </revision>
133 <revision version="4">
134 <description>
135 Add file type column.
136 </description>
137 <sql>
138 ALTER TABLE library ADD COLUMN filetype varchar(8) DEFAULT "?";
139 </sql>
140 </revision>
141 <revision version="5">
142 <description>
143 Add needs_verification column to library hashes table.
144 </description>
145 <sql>
146 ALTER TABLE LibraryHashes ADD COLUMN needs_verification INTEGER DEFAULT 0;
147 </sql>
148 </revision>
149 <revision version="6">
150 <description>
151 Added a ReplayGain Column.
152 </description>
153 <sql>
154 ALTER TABLE library ADD COLUMN replaygain float DEFAULT 0;
155 </sql>
156 </revision>
157 <revision version="7" min_compatible="3">
158 <description>
159 Add timesplayed and rating column. Reset header state.
160 </description>
161 <sql>
162 ALTER TABLE library ADD COLUMN timesplayed integer DEFAULT 0;
163 ALTER TABLE library ADD COLUMN rating integer DEFAULT 0;
164 ALTER TABLE library ADD COLUMN key varchar(8) DEFAULT "";
165 UPDATE library SET timesplayed = played;
166 UPDATE library SET played = 0;
167
168 DELETE FROM settings WHERE name="mixxx.db.model.library.header_state";
169 DELETE FROM settings WHERE name="mixxx.db.model.playlist.header_state";
170 DELETE FROM settings WHERE name="mixxx.db.model.crate.header_state";
171 DELETE FROM settings WHERE name="mixxx.db.model.prepare.header_state";
172 DELETE FROM settings WHERE name="mixxx.db.model.missing.header_state";
173 </sql>
174 </revision>
175 <revision version="8" min_compatible="3">
176 <description>
177 Added iTunes tables
178 </description>
179 <sql>
180 CREATE TABLE IF NOT EXISTS itunes_library (
181 id INTEGER primary key,
182 artist varchar(48), title varchar(48),
183 album varchar(48), year varchar(16),
184 genre varchar(32), tracknumber varchar(3),
185 location varchar(512),
186 comment varchar(60),
187 duration integer,
188 bitrate integer,
189 bpm integer,
190 rating integer);
191
192 CREATE TABLE IF NOT EXISTS itunes_playlists (
193 id INTEGER primary key,
194 name varchar(100) UNIQUE);
195
196 CREATE TABLE IF NOT EXISTS itunes_playlist_tracks (
197 id INTEGER primary key AUTOINCREMENT,
198 playlist_id INTEGER REFERENCES itunes_playlist(id),
199 track_id INTEGER REFERENCES itunes_library(id));
200 </sql>
201 </revision>
202 <revision version="9" min_compatible="3">
203 <description>
204 Tables for Traktor library feature
205 </description>
206 <sql>
207 CREATE TABLE IF NOT EXISTS traktor_library (
208 id INTEGER primary key AUTOINCREMENT,
209 artist varchar(48), title varchar(48),
210 album varchar(48), year varchar(16),
211 genre varchar(32), tracknumber varchar(3),
212 location varchar(512) UNIQUE,
213 comment varchar(60),
214 duration integer,
215 bitrate integer,
216 bpm float,
217 key varchar(6),
218 rating integer
219 );
220 CREATE TABLE IF NOT EXISTS traktor_playlists (
221 id INTEGER primary key,
222 name varchar(100) UNIQUE
223 );
224 CREATE TABLE IF NOT EXISTS traktor_playlist_tracks (
225 id INTEGER primary key AUTOINCREMENT,
226 playlist_id INTEGER REFERENCES traktor_playlist(id),
227 track_id INTEGER REFERENCES traktor_library(id)
228 );
229 </sql>
230 </revision>
231 <revision version="10" min_compatible="3">
232 <description>
233 Playlist and crate locks
234 </description>
235 <sql>
236 ALTER TABLE crates ADD COLUMN locked integer DEFAULT 0;
237 ALTER TABLE playlists ADD COLUMN locked integer DEFAULT 0;
238 </sql>
239 </revision>
240 <revision version="11" min_compatible="3">
241 <description>
242 Tables for Rhythmbox library feature
243 </description>
244 <sql>
245 CREATE TABLE IF NOT EXISTS rhythmbox_library (
246 id INTEGER primary key AUTOINCREMENT,
247 artist varchar(48), title varchar(48),
248 album varchar(48), year varchar(16),
249 genre varchar(32), tracknumber varchar(3),
250 location varchar(512) UNIQUE,
251 comment varchar(60),
252 duration integer,
253 bitrate integer,
254 bpm float,
255 key varchar(6),
256 rating integer
257 );
258 CREATE TABLE IF NOT EXISTS rhythmbox_playlists (
259 id INTEGER primary key AUTOINCREMENT,
260 name varchar(100) UNIQUE
261 );
262 CREATE TABLE IF NOT EXISTS rhythmbox_playlist_tracks (
263 id INTEGER primary key AUTOINCREMENT,
264 playlist_id INTEGER REFERENCES rhythmbox_playlist(id),
265 track_id INTEGER REFERENCES rhythmbox_library(id)
266 );
267 </sql>
268 </revision>
269 <revision version="12" min_compatible="3">
270 <description>
271 Add beats column to library table.
272 </description>
273 <sql>
274 ALTER TABLE Library ADD COLUMN beats BLOB;
275 ALTER TABLE Library ADD COLUMN beats_version TEXT;
276 </sql>
277 </revision>
278 <revision version="13" min_compatible="3">
279 <description>
280 Add position column to Rhythmbox, iTunes, and Traktor playlist tables.
281 </description>
282 <sql>
283 ALTER TABLE itunes_playlist_tracks ADD COLUMN position INTEGER DEFAULT 0;
284 ALTER TABLE rhythmbox_playlist_tracks ADD COLUMN position INTEGER DEFAULT 0;
285 ALTER TABLE traktor_playlist_tracks ADD COLUMN position INTEGER DEFAULT 0;
286 </sql>
287 </revision>
288 <revision version="14" min_compatible="3">
289 <description>
290 Add composer column to library table.
291 </description>
292 <sql>
293 ALTER TABLE library ADD COLUMN composer varchar(64) DEFAULT "";
294 </sql>
295 </revision>
296</schema>
0297
=== removed file 'mixxx/res/schema.xml'
--- mixxx/res/schema.xml 2011-10-14 00:24:59 +0000
+++ mixxx/res/schema.xml 1970-01-01 00:00:00 +0000
@@ -1,288 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--
3This is the Mixxx schema history file. It keeps track of internal changes to the
4Mixxx database schema and allows Mixxx to automatically upgrade itself to new
5revisions of the schema on a version upgrade.
6
7DO NOT EDIT THIS FILE OR YOU WILL BREAK YOUR MIXXX LIBRARY AND LOSE YOUR
8METADATA
9-->
10<schema>
11 <revision version="1">
12 <description>
13 The base schema for the Mixxx SQLITE database.
14 </description>
15 <sql>
16 CREATE TABLE IF NOT EXISTS settings (
17 name TEXT UNIQUE NOT NULL,
18 value TEXT,
19 locked INTEGER DEFAULT 0,
20 hidden INTEGER DEFAULT 0);
21
22 CREATE TABLE IF NOT EXISTS track_locations (
23 id INTEGER PRIMARY KEY AUTOINCREMENT,
24 location varchar(512) UNIQUE,
25 filename varchar(512),
26 directory varchar(512),
27 filesize INTEGER,
28 fs_deleted INTEGER,
29 needs_verification INTEGER);
30
31 CREATE TABLE IF NOT EXISTS LibraryHashes (
32 directory_path VARCHAR(256) primary key,
33 hash INTEGER,
34 directory_deleted INTEGER);
35
36 CREATE TABLE IF NOT EXISTS library (
37 id INTEGER primary key AUTOINCREMENT,
38 artist varchar(48), title varchar(48),
39 album varchar(48), year varchar(16),
40 genre varchar(32), tracknumber varchar(3),
41 location varchar(512) REFERENCES track_locations(location),
42 comment varchar(20), url varchar(256),
43 duration integer,
44 bitrate integer, samplerate integer,
45 cuepoint integer, bpm float,
46 wavesummaryhex blob,
47 channels integer,
48 datetime_added DEFAULT CURRENT_TIMESTAMP,
49 mixxx_deleted integer,
50 played integer);
51
52 CREATE TABLE Playlists (
53 id INTEGER primary key,
54 name varchar(48),
55 position INTEGER,
56 hidden INTEGER DEFAULT 0 NOT NULL,
57 date_created datetime,
58 date_modified datetime);
59
60 CREATE TABLE PlaylistTracks (
61 id INTEGER primary key,
62 playlist_id INTEGER REFERENCES Playlists(id),
63 track_id INTEGER REFERENCES library(id),
64 position INTEGER);
65
66 CREATE TABLE IF NOT EXISTS cues (
67 id integer PRIMARY KEY AUTOINCREMENT,
68 track_id integer NOT NULL REFERENCES library(id),
69 type integer DEFAULT 0 NOT NULL,
70 position integer DEFAULT -1 NOT NULL,
71 length integer DEFAULT 0 NOT NULL,
72 hotcue integer DEFAULT -1 NOT NULL,
73 label text DEFAULT '' NOT NULL);
74
75 CREATE TABLE IF NOT EXISTS crates (
76 id integer PRIMARY KEY AUTOINCREMENT,
77 name varchar(48) UNIQUE NOT NULL,
78 count integer DEFAULT 0,
79 show integer DEFAULT 1);
80
81 CREATE TABLE IF NOT EXISTS crate_tracks (
82 crate_id integer NOT NULL REFERENCES crates(id),
83 track_id integer NOT NULL REFERENCES library(id),
84 UNIQUE (crate_id, track_id));
85
86 </sql>
87 </revision>
88 <revision version="2">
89 <description>
90 Add a header_parsed integer column to the library to indicate when a
91 track's tags have been parsed.
92 </description>
93 <sql>
94 ALTER TABLE library ADD COLUMN header_parsed integer DEFAULT 0;
95 </sql>
96 </revision>
97 <revision version="3">
98 <description>
99 Change the location column to be a an integer. Change comment to be
100 varchar(256) and album/artist/title to be varchar(64).
101 </description>
102 <sql>
103 ALTER TABLE library RENAME TO library_old;
104
105 CREATE TABLE IF NOT EXISTS library (
106 id INTEGER primary key AUTOINCREMENT,
107 artist varchar(64),
108 title varchar(64),
109 album varchar(64),
110 year varchar(16),
111 genre varchar(64),
112 tracknumber varchar(3),
113 location integer REFERENCES track_locations(location),
114 comment varchar(256),
115 url varchar(256),
116 duration integer,
117 bitrate integer,
118 samplerate integer,
119 cuepoint integer,
120 bpm float,
121 wavesummaryhex blob,
122 channels integer,
123 datetime_added DEFAULT CURRENT_TIMESTAMP,
124 mixxx_deleted integer,
125 played integer,
126 header_parsed integer DEFAULT 0);
127
128 INSERT INTO library (id, artist, title, album, year, genre, tracknumber, location, comment, url, duration, bitrate, samplerate, bpm, cuepoint, bpm, wavesummaryhex, channels, datetime_added, mixxx_deleted, played, header_parsed) SELECT id, artist, title, album, year, genre, tracknumber, location, comment, url, duration, bitrate, samplerate, bpm, cuepoint, bpm, wavesummaryhex, channels, datetime_added, mixxx_deleted, played, header_parsed from library_old;
129
130 DROP TABLE library_old;
131 </sql>
132 </revision>
133 <revision version="4">
134 <description>
135 Add file type column.
136 </description>
137 <sql>
138 ALTER TABLE library ADD COLUMN filetype varchar(8) DEFAULT "?";
139 </sql>
140 </revision>
141 <revision version="5">
142 <description>
143 Add needs_verification column to library hashes table.
144 </description>
145 <sql>
146 ALTER TABLE LibraryHashes ADD COLUMN needs_verification INTEGER DEFAULT 0;
147 </sql>
148 </revision>
149 <revision version="6">
150 <description>
151 Added a ReplayGain Column.
152 </description>
153 <sql>
154 ALTER TABLE library ADD COLUMN replaygain float DEFAULT 0;
155 </sql>
156 </revision>
157 <revision version="7" min_compatible="3">
158 <description>
159 Add timesplayed and rating column. Reset header state.
160 </description>
161 <sql>
162 ALTER TABLE library ADD COLUMN timesplayed integer DEFAULT 0;
163 ALTER TABLE library ADD COLUMN rating integer DEFAULT 0;
164 ALTER TABLE library ADD COLUMN key varchar(8) DEFAULT "";
165 UPDATE library SET timesplayed = played;
166 UPDATE library SET played = 0;
167
168 DELETE FROM settings WHERE name="mixxx.db.model.library.header_state";
169 DELETE FROM settings WHERE name="mixxx.db.model.playlist.header_state";
170 DELETE FROM settings WHERE name="mixxx.db.model.crate.header_state";
171 DELETE FROM settings WHERE name="mixxx.db.model.prepare.header_state";
172 DELETE FROM settings WHERE name="mixxx.db.model.missing.header_state";
173 </sql>
174 </revision>
175 <revision version="8" min_compatible="3">
176 <description>
177 Added iTunes tables
178 </description>
179 <sql>
180 CREATE TABLE IF NOT EXISTS itunes_library (
181 id INTEGER primary key,
182 artist varchar(48), title varchar(48),
183 album varchar(48), year varchar(16),
184 genre varchar(32), tracknumber varchar(3),
185 location varchar(512),
186 comment varchar(60),
187 duration integer,
188 bitrate integer,
189 bpm integer,
190 rating integer);
191
192 CREATE TABLE IF NOT EXISTS itunes_playlists (
193 id INTEGER primary key,
194 name varchar(100) UNIQUE);
195
196 CREATE TABLE IF NOT EXISTS itunes_playlist_tracks (
197 id INTEGER primary key AUTOINCREMENT,
198 playlist_id INTEGER REFERENCES itunes_playlist(id),
199 track_id INTEGER REFERENCES itunes_library(id));
200 </sql>
201 </revision>
202 <revision version="9" min_compatible="3">
203 <description>
204 Tables for Traktor library feature
205 </description>
206 <sql>
207 CREATE TABLE IF NOT EXISTS traktor_library (
208 id INTEGER primary key AUTOINCREMENT,
209 artist varchar(48), title varchar(48),
210 album varchar(48), year varchar(16),
211 genre varchar(32), tracknumber varchar(3),
212 location varchar(512) UNIQUE,
213 comment varchar(60),
214 duration integer,
215 bitrate integer,
216 bpm float,
217 key varchar(6),
218 rating integer
219 );
220 CREATE TABLE IF NOT EXISTS traktor_playlists (
221 id INTEGER primary key,
222 name varchar(100) UNIQUE
223 );
224 CREATE TABLE IF NOT EXISTS traktor_playlist_tracks (
225 id INTEGER primary key AUTOINCREMENT,
226 playlist_id INTEGER REFERENCES traktor_playlist(id),
227 track_id INTEGER REFERENCES traktor_library(id)
228 );
229 </sql>
230 </revision>
231 <revision version="10" min_compatible="3">
232 <description>
233 Playlist and crate locks
234 </description>
235 <sql>
236 ALTER TABLE crates ADD COLUMN locked integer DEFAULT 0;
237 ALTER TABLE playlists ADD COLUMN locked integer DEFAULT 0;
238 </sql>
239 </revision>
240 <revision version="11" min_compatible="3">
241 <description>
242 Tables for Rhythmbox library feature
243 </description>
244 <sql>
245 CREATE TABLE IF NOT EXISTS rhythmbox_library (
246 id INTEGER primary key AUTOINCREMENT,
247 artist varchar(48), title varchar(48),
248 album varchar(48), year varchar(16),
249 genre varchar(32), tracknumber varchar(3),
250 location varchar(512) UNIQUE,
251 comment varchar(60),
252 duration integer,
253 bitrate integer,
254 bpm float,
255 key varchar(6),
256 rating integer
257 );
258 CREATE TABLE IF NOT EXISTS rhythmbox_playlists (
259 id INTEGER primary key AUTOINCREMENT,
260 name varchar(100) UNIQUE
261 );
262 CREATE TABLE IF NOT EXISTS rhythmbox_playlist_tracks (
263 id INTEGER primary key AUTOINCREMENT,
264 playlist_id INTEGER REFERENCES rhythmbox_playlist(id),
265 track_id INTEGER REFERENCES rhythmbox_library(id)
266 );
267 </sql>
268 </revision>
269 <revision version="12" min_compatible="3">
270 <description>
271 Add beats column to library table.
272 </description>
273 <sql>
274 ALTER TABLE Library ADD COLUMN beats BLOB;
275 ALTER TABLE Library ADD COLUMN beats_version TEXT;
276 </sql>
277 </revision>
278 <revision version="13" min_compatible="3">
279 <description>
280 Add position column to Rhythmbox, iTunes, and Traktor playlist tables.
281 </description>
282 <sql>
283 ALTER TABLE itunes_playlist_tracks ADD COLUMN position INTEGER DEFAULT 0;
284 ALTER TABLE rhythmbox_playlist_tracks ADD COLUMN position INTEGER DEFAULT 0;
285 ALTER TABLE traktor_playlist_tracks ADD COLUMN position INTEGER DEFAULT 0;
286 </sql>
287 </revision>
288</schema>
2890
=== modified file 'mixxx/src/audiotagger.cpp'
--- mixxx/src/audiotagger.cpp 2011-04-15 11:09:14 +0000
+++ mixxx/src/audiotagger.cpp 2011-12-28 23:47:25 +0000
@@ -26,6 +26,7 @@
26 m_artist = "";26 m_artist = "";
27 m_title = "";27 m_title = "";
28 m_genre = "";28 m_genre = "";
29 m_composer = "";
29 m_album = "";30 m_album = "";
30 m_year = "";31 m_year = "";
31 m_comment = "";32 m_comment = "";
@@ -69,6 +70,11 @@
69}70}
7071
7172
73void AudioTagger::setComposer (QString composer )
74{
75 m_composer = composer;
76}
77
7278
73void AudioTagger::setYear (QString year )79void AudioTagger::setYear (QString year )
74{80{
@@ -219,6 +225,22 @@
219225
220 }226 }
221227
228 TagLib::ID3v2::FrameList composerFrame = id3v2->frameListMap()["TCOM"];
229 if (!composerFrame.isEmpty())
230 {
231 composerFrame.front()->setText(m_composer.toStdString());
232
233 }
234 else
235 {
236 //add new frame
237 TagLib::ID3v2::TextIdentificationFrame* newFrame = new TagLib::ID3v2::TextIdentificationFrame("TCOM", TagLib::String::Latin1);
238
239 newFrame->setText(m_composer.toStdString());
240 id3v2->addFrame(newFrame);
241
242 }
243
222}244}
223void AudioTagger::addAPETag(TagLib::APE::Tag* ape)245void AudioTagger::addAPETag(TagLib::APE::Tag* ape)
224{246{
@@ -230,6 +252,7 @@
230 ape->addValue("BPM",m_bpm.toStdString(), true);252 ape->addValue("BPM",m_bpm.toStdString(), true);
231 ape->addValue("BPM",m_bpm.toStdString(), true);253 ape->addValue("BPM",m_bpm.toStdString(), true);
232254
255 ape->addValue("Composer",m_composer.toStdString(), true);
233256
234}257}
235void AudioTagger::addXiphComment(TagLib::Ogg::XiphComment* xiph)258void AudioTagger::addXiphComment(TagLib::Ogg::XiphComment* xiph)
@@ -252,6 +275,9 @@
252 xiph->removeField("KEY");275 xiph->removeField("KEY");
253 xiph->addField("KEY", m_key.toStdString());276 xiph->addField("KEY", m_key.toStdString());
254277
278 xiph->removeField("COMPOSER");
279 xiph->addField("COMPOSER", m_key.toStdString());
280
255}281}
256void AudioTagger::processMP4Tag(TagLib::MP4::Tag* mp4)282void AudioTagger::processMP4Tag(TagLib::MP4::Tag* mp4)
257{283{
258284
=== modified file 'mixxx/src/audiotagger.h'
--- mixxx/src/audiotagger.h 2011-04-10 18:23:52 +0000
+++ mixxx/src/audiotagger.h 2011-12-28 23:47:25 +0000
@@ -21,6 +21,7 @@
21 void setTitle (QString title );21 void setTitle (QString title );
22 void setAlbum (QString album );22 void setAlbum (QString album );
23 void setGenre (QString genre );23 void setGenre (QString genre );
24 void setComposer (QString composer );
24 void setYear (QString year );25 void setYear (QString year );
25 void setComment (QString comment );26 void setComment (QString comment );
26 void setKey (QString key );27 void setKey (QString key );
@@ -33,6 +34,7 @@
33 QString m_artist;34 QString m_artist;
34 QString m_title;35 QString m_title;
35 QString m_genre;36 QString m_genre;
37 QString m_composer;
36 QString m_album;38 QString m_album;
37 QString m_year;39 QString m_year;
38 QString m_comment;40 QString m_comment;
3941
=== modified file 'mixxx/src/dlgtrackinfo.cpp'
--- mixxx/src/dlgtrackinfo.cpp 2011-12-18 20:23:14 +0000
+++ mixxx/src/dlgtrackinfo.cpp 2011-12-28 23:47:25 +0000
@@ -103,6 +103,7 @@
103 txtArtist->setText(pTrack->getArtist());103 txtArtist->setText(pTrack->getArtist());
104 txtAlbum->setText(pTrack->getAlbum());104 txtAlbum->setText(pTrack->getAlbum());
105 txtGenre->setText(pTrack->getGenre());105 txtGenre->setText(pTrack->getGenre());
106 txtComposer->setText(pTrack->getComposer());
106 txtYear->setText(pTrack->getYear());107 txtYear->setText(pTrack->getYear());
107 txtTrackNumber->setText(pTrack->getTrackNumber());108 txtTrackNumber->setText(pTrack->getTrackNumber());
108 txtComment->setText(pTrack->getComment());109 txtComment->setText(pTrack->getComment());
@@ -198,6 +199,7 @@
198 m_pLoadedTrack->setArtist(txtArtist->text());199 m_pLoadedTrack->setArtist(txtArtist->text());
199 m_pLoadedTrack->setAlbum(txtAlbum->text());200 m_pLoadedTrack->setAlbum(txtAlbum->text());
200 m_pLoadedTrack->setGenre(txtGenre->text());201 m_pLoadedTrack->setGenre(txtGenre->text());
202 m_pLoadedTrack->setComposer(txtComposer->text());
201 m_pLoadedTrack->setYear(txtYear->text());203 m_pLoadedTrack->setYear(txtYear->text());
202 m_pLoadedTrack->setTrackNumber(txtTrackNumber->text());204 m_pLoadedTrack->setTrackNumber(txtTrackNumber->text());
203 m_pLoadedTrack->setBpm(spinBpm->value());205 m_pLoadedTrack->setBpm(spinBpm->value());
@@ -253,6 +255,7 @@
253 txtArtist->setText("");255 txtArtist->setText("");
254 txtAlbum->setText("");256 txtAlbum->setText("");
255 txtGenre->setText("");257 txtGenre->setText("");
258 txtComposer->setText("");
256 txtYear->setText("");259 txtYear->setText("");
257 txtTrackNumber->setText("");260 txtTrackNumber->setText("");
258 txtComment->setText("");261 txtComment->setText("");
259262
=== modified file 'mixxx/src/dlgtrackinfo.ui'
--- mixxx/src/dlgtrackinfo.ui 2011-10-05 16:29:58 +0000
+++ mixxx/src/dlgtrackinfo.ui 2011-12-28 23:47:25 +0000
@@ -7,7 +7,7 @@
7 <x>0</x>7 <x>0</x>
8 <y>0</y>8 <y>0</y>
9 <width>448</width>9 <width>448</width>
10 <height>571</height>10 <height>615</height>
11 </rect>11 </rect>
12 </property>12 </property>
13 <property name="windowTitle">13 <property name="windowTitle">
@@ -135,7 +135,22 @@
135 <item row="5" column="1" colspan="3">135 <item row="5" column="1" colspan="3">
136 <widget class="QLineEdit" name="txtGenre"/>136 <widget class="QLineEdit" name="txtGenre"/>
137 </item>137 </item>
138
138 <item row="6" column="0">139 <item row="6" column="0">
140 <widget class="QLabel" name="label_11">
141 <property name="text">
142 <string>Composer:</string>
143 </property>
144 <property name="buddy" >
145 <cstring>txtComposer</cstring>
146 </property>
147 </widget>
148 </item>
149 <item row="6" column="1" colspan="3">
150 <widget class="QLineEdit" name="txtComposer"/>
151 </item>
152
153 <item row="7" column="0">
139 <widget class="QLabel" name="label_5">154 <widget class="QLabel" name="label_5">
140 <property name="text">155 <property name="text">
141 <string>Filename:</string>156 <string>Filename:</string>
@@ -145,7 +160,7 @@
145 </property>160 </property>
146 </widget>161 </widget>
147 </item>162 </item>
148 <item row="6" column="1" colspan="3">163 <item row="7" column="1" colspan="3">
149 <widget class="QLineEdit" name="txtFilepath">164 <widget class="QLineEdit" name="txtFilepath">
150 <property name="enabled">165 <property name="enabled">
151 <bool>true</bool>166 <bool>true</bool>
@@ -169,21 +184,21 @@
169 </property>184 </property>
170 </widget>185 </widget>
171 </item>186 </item>
172 <item row="8" column="2">187 <item row="9" column="2">
173 <widget class="QLabel" name="Type">188 <widget class="QLabel" name="Type">
174 <property name="text">189 <property name="text">
175 <string>File Type:</string>190 <string>File Type:</string>
176 </property>191 </property>
177 </widget>192 </widget>
178 </item>193 </item>
179 <item row="8" column="3">194 <item row="9" column="3">
180 <widget class="QLabel" name="txtType">195 <widget class="QLabel" name="txtType">
181 <property name="text">196 <property name="text">
182 <string>77</string>197 <string>77</string>
183 </property>198 </property>
184 </widget>199 </widget>
185 </item>200 </item>
186 <item row="9" column="0">201 <item row="10" column="0">
187 <widget class="QLabel" name="label_4">202 <widget class="QLabel" name="label_4">
188 <property name="text">203 <property name="text">
189 <string>Comments:</string>204 <string>Comments:</string>
@@ -193,7 +208,7 @@
193 </property>208 </property>
194 </widget>209 </widget>
195 </item>210 </item>
196 <item row="9" column="1" colspan="3">211 <item row="10" column="1" colspan="3">
197 <widget class="QTextEdit" name="txtComment">212 <widget class="QTextEdit" name="txtComment">
198 <property name="tabChangesFocus">213 <property name="tabChangesFocus">
199 <bool>true</bool>214 <bool>true</bool>
200215
=== modified file 'mixxx/src/library/basesqltablemodel.cpp'
--- mixxx/src/library/basesqltablemodel.cpp 2011-12-18 18:50:40 +0000
+++ mixxx/src/library/basesqltablemodel.cpp 2011-12-28 23:47:25 +0000
@@ -43,6 +43,8 @@
43 Qt::Horizontal, tr("Album"));43 Qt::Horizontal, tr("Album"));
44 setHeaderData(fieldIndex(LIBRARYTABLE_GENRE),44 setHeaderData(fieldIndex(LIBRARYTABLE_GENRE),
45 Qt::Horizontal, tr("Genre"));45 Qt::Horizontal, tr("Genre"));
46 setHeaderData(fieldIndex(LIBRARYTABLE_COMPOSER),
47 Qt::Horizontal, tr("Composer"));
46 setHeaderData(fieldIndex(LIBRARYTABLE_YEAR),48 setHeaderData(fieldIndex(LIBRARYTABLE_YEAR),
47 Qt::Horizontal, tr("Year"));49 Qt::Horizontal, tr("Year"));
48 setHeaderData(fieldIndex(LIBRARYTABLE_FILETYPE),50 setHeaderData(fieldIndex(LIBRARYTABLE_FILETYPE),
@@ -528,7 +530,6 @@
528 // waveform widget to load a track into a Player).530 // waveform widget to load a track into a Player).
529 defaultFlags |= Qt::ItemIsDragEnabled;531 defaultFlags |= Qt::ItemIsDragEnabled;
530532
531 int row = index.row();
532 int column = index.column();533 int column = index.column();
533534
534 if ( column == fieldIndex(LIBRARYTABLE_FILETYPE)535 if ( column == fieldIndex(LIBRARYTABLE_FILETYPE)
@@ -609,6 +610,8 @@
609 pTrack->setYear(value.toString());610 pTrack->setYear(value.toString());
610 } else if (fieldIndex(LIBRARYTABLE_GENRE) == column) {611 } else if (fieldIndex(LIBRARYTABLE_GENRE) == column) {
611 pTrack->setGenre(value.toString());612 pTrack->setGenre(value.toString());
613 } else if (fieldIndex(LIBRARYTABLE_COMPOSER) == column) {
614 pTrack->setComposer(value.toString());
612 } else if (fieldIndex(LIBRARYTABLE_FILETYPE) == column) {615 } else if (fieldIndex(LIBRARYTABLE_FILETYPE) == column) {
613 pTrack->setType(value.toString());616 pTrack->setType(value.toString());
614 } else if (fieldIndex(LIBRARYTABLE_TRACKNUMBER) == column) {617 } else if (fieldIndex(LIBRARYTABLE_TRACKNUMBER) == column) {
615618
=== modified file 'mixxx/src/library/basetrackcache.cpp'
--- mixxx/src/library/basetrackcache.cpp 2011-12-18 20:25:07 +0000
+++ mixxx/src/library/basetrackcache.cpp 2011-12-28 23:47:25 +0000
@@ -238,6 +238,8 @@
238 return QVariant(pTrack->getDateAdded());238 return QVariant(pTrack->getDateAdded());
239 } else if (fieldIndex(LIBRARYTABLE_GENRE) == column) {239 } else if (fieldIndex(LIBRARYTABLE_GENRE) == column) {
240 return QVariant(pTrack->getGenre());240 return QVariant(pTrack->getGenre());
241 } else if (fieldIndex(LIBRARYTABLE_COMPOSER) == column) {
242 return QVariant(pTrack->getComposer());
241 } else if (fieldIndex(LIBRARYTABLE_FILETYPE) == column) {243 } else if (fieldIndex(LIBRARYTABLE_FILETYPE) == column) {
242 return QVariant(pTrack->getType());244 return QVariant(pTrack->getType());
243 } else if (fieldIndex(LIBRARYTABLE_TRACKNUMBER) == column) {245 } else if (fieldIndex(LIBRARYTABLE_TRACKNUMBER) == column) {
244246
=== modified file 'mixxx/src/library/browse/browsetablemodel.cpp'
--- mixxx/src/library/browse/browsetablemodel.cpp 2011-12-22 10:56:03 +0000
+++ mixxx/src/library/browse/browsetablemodel.cpp 2011-12-28 23:47:25 +0000
@@ -31,6 +31,7 @@
31 header_data.insert(COLUMN_TRACK_NUMBER, tr("Track #"));31 header_data.insert(COLUMN_TRACK_NUMBER, tr("Track #"));
32 header_data.insert(COLUMN_YEAR, tr("Year"));32 header_data.insert(COLUMN_YEAR, tr("Year"));
33 header_data.insert(COLUMN_GENRE, tr("Genre"));33 header_data.insert(COLUMN_GENRE, tr("Genre"));
34 header_data.insert(COLUMN_COMPOSER, tr("Composer"));
34 header_data.insert(COLUMN_COMMENT, tr("Comment"));35 header_data.insert(COLUMN_COMMENT, tr("Comment"));
35 header_data.insert(COLUMN_DURATION, tr("Duration"));36 header_data.insert(COLUMN_DURATION, tr("Duration"));
36 header_data.insert(COLUMN_BPM, tr("BPM"));37 header_data.insert(COLUMN_BPM, tr("BPM"));
@@ -44,6 +45,7 @@
44 addSearchColumn(COLUMN_ALBUM);45 addSearchColumn(COLUMN_ALBUM);
45 addSearchColumn(COLUMN_TITLE);46 addSearchColumn(COLUMN_TITLE);
46 addSearchColumn(COLUMN_GENRE);47 addSearchColumn(COLUMN_GENRE);
48 addSearchColumn(COLUMN_COMPOSER);
47 addSearchColumn(COLUMN_KEY);49 addSearchColumn(COLUMN_KEY);
48 addSearchColumn(COLUMN_COMMENT);50 addSearchColumn(COLUMN_COMMENT);
4951
@@ -336,6 +338,7 @@
336 tagger.setTracknumber(this->index(row,COLUMN_TRACK_NUMBER).data().toString());338 tagger.setTracknumber(this->index(row,COLUMN_TRACK_NUMBER).data().toString());
337 tagger.setYear(this->index(row,COLUMN_YEAR).data().toString());339 tagger.setYear(this->index(row,COLUMN_YEAR).data().toString());
338 tagger.setGenre(this->index(row,COLUMN_GENRE).data().toString());340 tagger.setGenre(this->index(row,COLUMN_GENRE).data().toString());
341 tagger.setComposer(this->index(row,COLUMN_COMPOSER).data().toString());
339342
340 //check if one the item were edited343 //check if one the item were edited
341 if(col == COLUMN_ARTIST) {344 if(col == COLUMN_ARTIST) {
@@ -354,6 +357,8 @@
354 tagger.setComment(value.toString());357 tagger.setComment(value.toString());
355 } else if(col == COLUMN_GENRE) {358 } else if(col == COLUMN_GENRE) {
356 tagger.setGenre(value.toString());359 tagger.setGenre(value.toString());
360 } else if(col == COLUMN_COMPOSER) {
361 tagger.setComposer(value.toString());
357 } else if(col == COLUMN_YEAR) {362 } else if(col == COLUMN_YEAR) {
358 tagger.setYear(value.toString());363 tagger.setYear(value.toString());
359 }364 }
360365
=== modified file 'mixxx/src/library/browse/browsetablemodel.h'
--- mixxx/src/library/browse/browsetablemodel.h 2011-12-22 10:56:03 +0000
+++ mixxx/src/library/browse/browsetablemodel.h 2011-12-28 23:47:25 +0000
@@ -24,6 +24,7 @@
24const int COLUMN_TYPE = 11;24const int COLUMN_TYPE = 11;
25const int COLUMN_BITRATE = 12;25const int COLUMN_BITRATE = 12;
26const int COLUMN_LOCATION = 13;26const int COLUMN_LOCATION = 13;
27const int COLUMN_COMPOSER = 14;
2728
28/*29/*
29 * The BrowseTable models displays tracks30 * The BrowseTable models displays tracks
3031
=== modified file 'mixxx/src/library/browse/browsethread.cpp'
--- mixxx/src/library/browse/browsethread.cpp 2011-11-04 20:03:24 +0000
+++ mixxx/src/library/browse/browsethread.cpp 2011-12-28 23:47:25 +0000
@@ -141,6 +141,9 @@
141 item = new QStandardItem(tio.getGenre());141 item = new QStandardItem(tio.getGenre());
142 row_data.insert(COLUMN_GENRE, item);142 row_data.insert(COLUMN_GENRE, item);
143143
144 item = new QStandardItem(tio.getComposer());
145 row_data.insert(COLUMN_COMPOSER, item);
146
144 item = new QStandardItem(tio.getComment());147 item = new QStandardItem(tio.getComment());
145 row_data.insert(COLUMN_COMMENT, item);148 row_data.insert(COLUMN_COMMENT, item);
146149
147150
=== modified file 'mixxx/src/library/dao/trackdao.cpp'
--- mixxx/src/library/dao/trackdao.cpp 2011-10-21 00:42:23 +0000
+++ mixxx/src/library/dao/trackdao.cpp 2011-12-28 23:47:25 +0000
@@ -240,13 +240,13 @@
240}240}
241241
242void TrackDAO::prepareLibraryInsert(QSqlQuery& query) {242void TrackDAO::prepareLibraryInsert(QSqlQuery& query) {
243 query.prepare("INSERT INTO library (artist, title, album, year, genre, tracknumber, "243 query.prepare("INSERT INTO library (artist, title, album, year, genre, composer, "
244 "filetype, location, comment, url, duration, rating, key, "244 "tracknumber, filetype, location, comment, url, duration, rating, key, "
245 "bitrate, samplerate, cuepoint, bpm, replaygain, wavesummaryhex, "245 "bitrate, samplerate, cuepoint, bpm, replaygain, wavesummaryhex, "
246 "timesplayed, "246 "timesplayed, "
247 "channels, mixxx_deleted, header_parsed, beats_version, beats) "247 "channels, mixxx_deleted, header_parsed, beats_version, beats) "
248 "VALUES (:artist, "248 "VALUES (:artist, "
249 ":title, :album, :year, :genre, :tracknumber, "249 ":title, :album, :year, :genre, :composer, :tracknumber, "
250 ":filetype, :location, :comment, :url, :duration, :rating, :key, "250 ":filetype, :location, :comment, :url, :duration, :rating, :key, "
251 ":bitrate, :samplerate, :cuepoint, :bpm, :replaygain, :wavesummaryhex, "251 ":bitrate, :samplerate, :cuepoint, :bpm, :replaygain, :wavesummaryhex, "
252 ":timesplayed, "252 ":timesplayed, "
@@ -260,6 +260,7 @@
260 query.bindValue(":album", pTrack->getAlbum());260 query.bindValue(":album", pTrack->getAlbum());
261 query.bindValue(":year", pTrack->getYear());261 query.bindValue(":year", pTrack->getYear());
262 query.bindValue(":genre", pTrack->getGenre());262 query.bindValue(":genre", pTrack->getGenre());
263 query.bindValue(":composer", pTrack->getComposer());
263 query.bindValue(":tracknumber", pTrack->getTrackNumber());264 query.bindValue(":tracknumber", pTrack->getTrackNumber());
264 query.bindValue(":filetype", pTrack->getType());265 query.bindValue(":filetype", pTrack->getType());
265 query.bindValue(":location", trackLocationId);266 query.bindValue(":location", trackLocationId);
@@ -421,7 +422,8 @@
421 // but marked deleted? Skip this track.422 // but marked deleted? Skip this track.
422 LOG_FAILED_QUERY(query)423 LOG_FAILED_QUERY(query)
423 << "Failed to INSERT new track into library:"424 << "Failed to INSERT new track into library:"
424 << pTrack->getFilename();425 << pTrack->getFilename()
426 << ", composer: \'" << pTrack->getComposer() << "\'";
425 continue;427 continue;
426 }428 }
427 int trackId = query.lastInsertId().toInt();429 int trackId = query.lastInsertId().toInt();
@@ -557,6 +559,7 @@
557 QString album = query.value(query.record().indexOf("album")).toString();559 QString album = query.value(query.record().indexOf("album")).toString();
558 QString year = query.value(query.record().indexOf("year")).toString();560 QString year = query.value(query.record().indexOf("year")).toString();
559 QString genre = query.value(query.record().indexOf("genre")).toString();561 QString genre = query.value(query.record().indexOf("genre")).toString();
562 QString composer = query.value(query.record().indexOf("composer")).toString();
560 QString tracknumber = query.value(query.record().indexOf("tracknumber")).toString();563 QString tracknumber = query.value(query.record().indexOf("tracknumber")).toString();
561 QString comment = query.value(query.record().indexOf("comment")).toString();564 QString comment = query.value(query.record().indexOf("comment")).toString();
562 QString url = query.value(query.record().indexOf("url")).toString();565 QString url = query.value(query.record().indexOf("url")).toString();
@@ -591,6 +594,7 @@
591 pTrack->setAlbum(album);594 pTrack->setAlbum(album);
592 pTrack->setYear(year);595 pTrack->setYear(year);
593 pTrack->setGenre(genre);596 pTrack->setGenre(genre);
597 pTrack->setComposer(composer);
594 pTrack->setTrackNumber(tracknumber);598 pTrack->setTrackNumber(tracknumber);
595 pTrack->setRating(rating);599 pTrack->setRating(rating);
596 pTrack->setKey(key);600 pTrack->setKey(key);
@@ -704,7 +708,7 @@
704 QSqlQuery query(m_database);708 QSqlQuery query(m_database);
705709
706 query.prepare(710 query.prepare(
707 "SELECT library.id, artist, title, album, year, genre, tracknumber, "711 "SELECT library.id, artist, title, album, year, genre, composer, tracknumber, "
708 "filetype, rating, key, track_locations.location as location, "712 "filetype, rating, key, track_locations.location as location, "
709 "track_locations.filesize as filesize, comment, url, duration, bitrate, "713 "track_locations.filesize as filesize, comment, url, duration, bitrate, "
710 "samplerate, cuepoint, bpm, replaygain, wavesummaryhex, channels, "714 "samplerate, cuepoint, bpm, replaygain, wavesummaryhex, channels, "
@@ -747,7 +751,7 @@
747 query.prepare("UPDATE library "751 query.prepare("UPDATE library "
748 "SET artist=:artist, "752 "SET artist=:artist, "
749 "title=:title, album=:album, year=:year, genre=:genre, "753 "title=:title, album=:album, year=:year, genre=:genre, "
750 "filetype=:filetype, tracknumber=:tracknumber, "754 "composer=:composer, filetype=:filetype, tracknumber=:tracknumber, "
751 "comment=:comment, url=:url, duration=:duration, rating=:rating, key=:key, "755 "comment=:comment, url=:url, duration=:duration, rating=:rating, key=:key, "
752 "bitrate=:bitrate, samplerate=:samplerate, cuepoint=:cuepoint, "756 "bitrate=:bitrate, samplerate=:samplerate, cuepoint=:cuepoint, "
753 "bpm=:bpm, replaygain=:replaygain, wavesummaryhex=:wavesummaryhex, "757 "bpm=:bpm, replaygain=:replaygain, wavesummaryhex=:wavesummaryhex, "
@@ -760,6 +764,7 @@
760 query.bindValue(":album", pTrack->getAlbum());764 query.bindValue(":album", pTrack->getAlbum());
761 query.bindValue(":year", pTrack->getYear());765 query.bindValue(":year", pTrack->getYear());
762 query.bindValue(":genre", pTrack->getGenre());766 query.bindValue(":genre", pTrack->getGenre());
767 query.bindValue(":composer", pTrack->getComposer());
763 query.bindValue(":filetype", pTrack->getType());768 query.bindValue(":filetype", pTrack->getType());
764 query.bindValue(":tracknumber", pTrack->getTrackNumber());769 query.bindValue(":tracknumber", pTrack->getTrackNumber());
765 query.bindValue(":comment", pTrack->getComment());770 query.bindValue(":comment", pTrack->getComment());
@@ -984,6 +989,7 @@
984 tagger.setArtist(pTrack->getArtist());989 tagger.setArtist(pTrack->getArtist());
985 tagger.setTitle(pTrack->getTitle());990 tagger.setTitle(pTrack->getTitle());
986 tagger.setGenre(pTrack->getGenre());991 tagger.setGenre(pTrack->getGenre());
992 tagger.setComposer(pTrack->getComposer());
987 tagger.setAlbum(pTrack->getAlbum());993 tagger.setAlbum(pTrack->getAlbum());
988 tagger.setComment(pTrack->getComment());994 tagger.setComment(pTrack->getComment());
989 tagger.setTracknumber(pTrack->getTrackNumber());995 tagger.setTracknumber(pTrack->getTrackNumber());
990996
=== modified file 'mixxx/src/library/dao/trackdao.h'
--- mixxx/src/library/dao/trackdao.h 2011-10-21 00:42:23 +0000
+++ mixxx/src/library/dao/trackdao.h 2011-12-28 23:47:25 +0000
@@ -25,6 +25,7 @@
25const QString LIBRARYTABLE_ALBUM = "album";25const QString LIBRARYTABLE_ALBUM = "album";
26const QString LIBRARYTABLE_YEAR = "year";26const QString LIBRARYTABLE_YEAR = "year";
27const QString LIBRARYTABLE_GENRE = "genre";27const QString LIBRARYTABLE_GENRE = "genre";
28const QString LIBRARYTABLE_COMPOSER = "composer";
28const QString LIBRARYTABLE_TRACKNUMBER = "tracknumber";29const QString LIBRARYTABLE_TRACKNUMBER = "tracknumber";
29const QString LIBRARYTABLE_FILETYPE = "filetype";30const QString LIBRARYTABLE_FILETYPE = "filetype";
30const QString LIBRARYTABLE_LOCATION = "location";31const QString LIBRARYTABLE_LOCATION = "location";
3132
=== modified file 'mixxx/src/library/mixxxlibraryfeature.cpp'
--- mixxx/src/library/mixxxlibraryfeature.cpp 2011-12-18 20:23:14 +0000
+++ mixxx/src/library/mixxxlibraryfeature.cpp 2011-12-28 23:47:25 +0000
@@ -28,6 +28,7 @@
28 << "library." + LIBRARYTABLE_DURATION28 << "library." + LIBRARYTABLE_DURATION
29 << "library." + LIBRARYTABLE_RATING29 << "library." + LIBRARYTABLE_RATING
30 << "library." + LIBRARYTABLE_GENRE30 << "library." + LIBRARYTABLE_GENRE
31 << "library." + LIBRARYTABLE_COMPOSER
31 << "library." + LIBRARYTABLE_FILETYPE32 << "library." + LIBRARYTABLE_FILETYPE
32 << "library." + LIBRARYTABLE_TRACKNUMBER33 << "library." + LIBRARYTABLE_TRACKNUMBER
33 << "library." + LIBRARYTABLE_KEY34 << "library." + LIBRARYTABLE_KEY
3435
=== modified file 'mixxx/src/library/trackcollection.cpp'
--- mixxx/src/library/trackcollection.cpp 2011-10-21 02:09:53 +0000
+++ mixxx/src/library/trackcollection.cpp 2011-12-28 23:47:25 +0000
@@ -67,7 +67,7 @@
67 return false;67 return false;
68 }68 }
6969
70 int requiredSchemaVersion = 13;70 int requiredSchemaVersion = 14;
71 if (!SchemaManager::upgradeToSchemaVersion(m_pConfig, m_db,71 if (!SchemaManager::upgradeToSchemaVersion(m_pConfig, m_db,
72 requiredSchemaVersion)) {72 requiredSchemaVersion)) {
73 QMessageBox::warning(0, tr("Cannot upgrade database schema"),73 QMessageBox::warning(0, tr("Cannot upgrade database schema"),
7474
=== modified file 'mixxx/src/soundsource.cpp'
--- mixxx/src/soundsource.cpp 2011-03-22 16:24:04 +0000
+++ mixxx/src/soundsource.cpp 2011-12-28 23:47:25 +0000
@@ -110,6 +110,10 @@
110{110{
111 return m_sGenre;111 return m_sGenre;
112}112}
113QString SoundSource::getComposer()
114{
115 return m_sComposer;
116}
113QString SoundSource::getTrackNumber()117QString SoundSource::getTrackNumber()
114{118{
115 return m_sTrackNumber;119 return m_sTrackNumber;
@@ -167,6 +171,10 @@
167{171{
168 m_sGenre = genre;172 m_sGenre = genre;
169}173}
174void SoundSource::setComposer(QString composer)
175{
176 m_sComposer = composer;
177}
170void SoundSource::setTrackNumber(QString trackNumber)178void SoundSource::setTrackNumber(QString trackNumber)
171{179{
172 m_sTrackNumber = trackNumber;180 m_sTrackNumber = trackNumber;
@@ -326,6 +334,12 @@
326 }334 }
327 }335 }
328 }336 }
337 TagLib::ID3v2::FrameList composerFrame = id3v2->frameListMap()["TCOM"];
338 if (!composerFrame.isEmpty()) {
339 QString sComposer = TStringToQString(composerFrame.front()->toString());
340 setComposer(sComposer);
341 }
342
329 return true;343 return true;
330}344}
331345
332346
=== modified file 'mixxx/src/soundsource.h'
--- mixxx/src/soundsource.h 2011-11-02 01:09:26 +0000
+++ mixxx/src/soundsource.h 2011-12-28 23:47:25 +0000
@@ -75,6 +75,7 @@
75 virtual QString getComment();75 virtual QString getComment();
76 virtual QString getYear();76 virtual QString getYear();
77 virtual QString getGenre();77 virtual QString getGenre();
78 virtual QString getComposer();
78 virtual QString getTrackNumber();79 virtual QString getTrackNumber();
79 virtual float getReplayGain();80 virtual float getReplayGain();
80 virtual QString getKey();81 virtual QString getKey();
@@ -91,6 +92,7 @@
91 virtual void setComment(QString);92 virtual void setComment(QString);
92 virtual void setYear(QString);93 virtual void setYear(QString);
93 virtual void setGenre(QString);94 virtual void setGenre(QString);
95 virtual void setComposer(QString);
94 virtual void setTrackNumber(QString);96 virtual void setTrackNumber(QString);
95 virtual void setReplayGain(float);97 virtual void setReplayGain(float);
96 virtual void setKey(QString);98 virtual void setKey(QString);
@@ -122,6 +124,7 @@
122 QString m_sComment;124 QString m_sComment;
123 QString m_sYear;125 QString m_sYear;
124 QString m_sGenre;126 QString m_sGenre;
127 QString m_sComposer;
125 QString m_sTrackNumber;128 QString m_sTrackNumber;
126 float m_fReplayGain;129 float m_fReplayGain;
127 QString m_sKey;130 QString m_sKey;
128131
=== modified file 'mixxx/src/soundsourceproxy.cpp'
--- mixxx/src/soundsourceproxy.cpp 2011-12-15 21:15:41 +0000
+++ mixxx/src/soundsourceproxy.cpp 2011-12-28 23:47:25 +0000
@@ -302,7 +302,8 @@
302 p->setType(sndsrc->getType());302 p->setType(sndsrc->getType());
303 p->setYear(sndsrc->getYear());303 p->setYear(sndsrc->getYear());
304 p->setGenre(sndsrc->getGenre());304 p->setGenre(sndsrc->getGenre());
305 p->setComment(sndsrc->getComment());305 p->setComposer(sndsrc->getComposer());
306 p->setComment(sndsrc->getComment());
306 p->setTrackNumber(sndsrc->getTrackNumber());307 p->setTrackNumber(sndsrc->getTrackNumber());
307 p->setReplayGain(sndsrc->getReplayGain());308 p->setReplayGain(sndsrc->getReplayGain());
308 p->setBpm(sndsrc->getBPM());309 p->setBpm(sndsrc->getBPM());
309310
=== modified file 'mixxx/src/trackinfoobject.cpp'
--- mixxx/src/trackinfoobject.cpp 2011-12-18 20:23:14 +0000
+++ mixxx/src/trackinfoobject.cpp 2011-12-28 23:47:25 +0000
@@ -508,6 +508,22 @@
508 setDirty(true);508 setDirty(true);
509}509}
510510
511QString TrackInfoObject::getComposer() const
512{
513 QMutexLocker lock(&m_qMutex);
514 return m_sComposer;
515}
516
517void TrackInfoObject::setComposer(QString s)
518{
519 QMutexLocker lock(&m_qMutex);
520 s = s.trimmed();
521 bool dirty = m_sComposer != s;
522 m_sComposer = s;
523 if (dirty)
524 setDirty(true);
525}
526
511QString TrackInfoObject::getTrackNumber() const527QString TrackInfoObject::getTrackNumber() const
512{528{
513 QMutexLocker lock(&m_qMutex);529 QMutexLocker lock(&m_qMutex);
514530
=== modified file 'mixxx/src/trackinfoobject.h'
--- mixxx/src/trackinfoobject.h 2011-10-03 22:37:35 +0000
+++ mixxx/src/trackinfoobject.h 2011-12-28 23:47:25 +0000
@@ -77,6 +77,7 @@
77 Q_PROPERTY(QString title READ getTitle WRITE setTitle)77 Q_PROPERTY(QString title READ getTitle WRITE setTitle)
78 Q_PROPERTY(QString album READ getAlbum WRITE setAlbum)78 Q_PROPERTY(QString album READ getAlbum WRITE setAlbum)
79 Q_PROPERTY(QString genre READ getGenre WRITE setGenre)79 Q_PROPERTY(QString genre READ getGenre WRITE setGenre)
80 Q_PROPERTY(QString composer READ getComposer WRITE setComposer)
80 Q_PROPERTY(QString year READ getYear WRITE setYear)81 Q_PROPERTY(QString year READ getYear WRITE setYear)
81 Q_PROPERTY(QString track_number READ getTrackNumber WRITE setTrackNumber)82 Q_PROPERTY(QString track_number READ getTrackNumber WRITE setTrackNumber)
82 Q_PROPERTY(int times_played READ getTimesPlayed)83 Q_PROPERTY(int times_played READ getTimesPlayed)
@@ -172,6 +173,10 @@
172 QString getGenre() const;173 QString getGenre() const;
173 /** Set genre */174 /** Set genre */
174 void setGenre(QString);175 void setGenre(QString);
176 /** Return composer */
177 QString getComposer() const;
178 /** Set composer */
179 void setComposer(QString);
175 /** Return Track Number */180 /** Return Track Number */
176 QString getTrackNumber() const;181 QString getTrackNumber() const;
177 /** Set Track Number */182 /** Set Track Number */
@@ -317,6 +322,8 @@
317 QString m_sTitle;322 QString m_sTitle;
318 /** Genre */323 /** Genre */
319 QString m_sGenre;324 QString m_sGenre;
325 /** Composer */
326 QString m_sComposer;
320 /** Year */327 /** Year */
321 QString m_sYear;328 QString m_sYear;
322 /** Track Number */329 /** Track Number */