48
45
Result MusicBrainzLookup::lookup( const QString &, uint, const TrackOffsetList & trackOffsetList )
50
47
QString discId = calculateDiscId(trackOffsetList);
52
49
kDebug() << "Should lookup " << discId;
60
args.insert(args.begin(), discId.toLatin1().data());
62
if (!mb.Query(MBQ_GetCDInfoFromCDIndexId, &args))
66
mb.GetQueryError(error);
67
kDebug() << "Query failed: " << error.c_str();
72
int nrAlbums = mb.DataInt(MBE_GetNumAlbums);
76
kDebug() << "No CD Found";
81
for (int i=1; i <= nrAlbums; i++)
83
mb.Select(MBS_SelectAlbum, i);
86
info.set("source", "musicbrainz");
87
// FIXME Could have different discid than the one above?
88
// Will break cache if several entries have same discid
89
info.set("discid", discId);
91
info.set(Title, QString::fromUtf8(mb.Data(MBE_AlbumGetAlbumName).c_str()));
92
info.set(Artist, QString::fromUtf8(mb.Data(MBE_AlbumGetAlbumArtistName).c_str()));
94
int numTracks = trackOffsetList.count()-1;
96
for (int i=1; i <= numTracks; i++)
98
TrackInfo& track = info.track(i-1);
99
track.set(Artist, QString::fromUtf8(mb.Data(MBE_AlbumGetArtistName, i).c_str()));
100
track.set(Title, QString::fromUtf8(mb.Data(MBE_AlbumGetTrackName, i).c_str()));
52
MusicBrainz::ReleaseResultList results;
55
MusicBrainz::ReleaseFilter f = MusicBrainz::ReleaseFilter().discId(std::string(discId.toAscii()));
56
results = q.getReleases(&f);
58
// FIXME Doesn't seem to get caught, why?
59
// catch (MusicBrainz::WebServiceError &e)
62
kDebug() << "Query failed"; //<< e.what();
67
for (MusicBrainz::ReleaseResultList::iterator i = results.begin(); i != results.end(); i++) {
68
MusicBrainz::ReleaseResult *result = *i;
69
MusicBrainz::Release *release;
71
release = q.getReleaseById(result->getRelease()->getId(), &MusicBrainz::ReleaseIncludes().tracks().artist());
73
catch (MusicBrainz::WebServiceError &e) {
74
kDebug() << "Error: " << e.what();
78
info.set(QLatin1String( "source" ), QLatin1String( "musicbrainz" ));
79
// Uses musicbrainz discid for the first release,
80
// then discid-2, discid-3 and so on, to
81
// allow multiple releases with the same discid
83
info.set(QLatin1String( "discid" ), discId);
85
info.set(QLatin1String( "discid" ), discId+QLatin1String( "-" )+QString::number(relnr));
87
info.set(Title, QString::fromUtf8(release->getTitle().c_str()));
88
info.set(Artist, QString::fromUtf8(release->getArtist()->getName().c_str()));
91
for (MusicBrainz::TrackList::iterator j = release->getTracks().begin(); j != release->getTracks().end(); j++) {
92
MusicBrainz::Track *mb_track = *j;
93
MusicBrainz::Artist *artist = mb_track->getArtist();
95
artist = release->getArtist();
96
TrackInfo& track = info.track(trackno);
97
track.set(Artist, QString::fromUtf8(artist->getName().c_str()));
98
track.set(Title, QString::fromUtf8(mb_track->getTitle().c_str()));
107
if (cdInfoList_.isEmpty())
109
kDebug() << "No record found";
110
return NoRecordFound;
106
113
kDebug() << "Query succeeded :-)";
111
118
QString MusicBrainzLookup::calculateDiscId(const TrackOffsetList & trackOffsetList )
113
120
// Code based on libmusicbrainz/lib/diskid.cpp
115
122
int numTracks = trackOffsetList.count()-1;
117
124
QCryptographicHash sha(QCryptographicHash::Sha1);
140
147
sprintf(temp, "%08lX", offset);
141
148
sha.addData(temp, strlen(temp));
144
151
QByteArray base64 = sha.result().toBase64();
146
153
// '/' '+' and '=' replaced for MusicBrainz
147
QString res = QString::fromLatin1(base64).replace('/',"_").replace('+',".").replace('=',"-");
154
QString res = QString::fromLatin1(base64).replace(QLatin1Char( '/' ),QLatin1String( "_" )).replace(QLatin1Char( '+' ),QLatin1String( "." )).replace(QLatin1Char( '=' ),QLatin1String( "-" ));
158
165
for (QStringList::const_iterator cddbCacheDir = cddbCacheDirs.constBegin();
159
166
cddbCacheDir != cddbCacheDirs.constEnd(); ++cddbCacheDir)
161
QString fileName = *cddbCacheDir + "/musicbrainz/" + discid;
168
// Looks for all files in cddbdir/musicbrainz/discid*
169
// Several files can correspond to the same discid,
170
// then they are named discid, discid-2, discid-3 and so on
171
QDir dir(*cddbCacheDir+QLatin1String( "/musicbrainz/" ));
172
dir.setNameFilters(QStringList(discid+QLatin1String( "*" )));
164
if ( f.exists() && f.open(QIODevice::ReadOnly) )
174
QStringList files = dir.entryList();
175
kDebug() << "Cache files found: " << files.count();
176
for (QStringList::iterator it = files.begin(); it != files.end(); ++it)
167
ts.setCodec("UTF-8");
168
QString cddbData = ts.readAll();
172
info.set("source", "musicbrainz");
173
info.set("discid", discid);
178
QFile f( dir.filePath(*it) );
179
if ( f.exists() && f.open(QIODevice::ReadOnly) )
182
ts.setCodec("UTF-8");
183
QString cddbData = ts.readAll();
187
info.set(QLatin1String( "source" ), QLatin1String( "musicbrainz" ));
188
info.set(QLatin1String( "discid" ), discid);
175
infoList.append( info );
190
infoList.append( info );
193
kDebug() << "Could not read file: " << f.fileName();