Hi, Alle domenica 24 giugno 2012, Jon Dowland ha scritto: > On Tue, Jun 19, 2012 at 08:47:19PM -0300, Lisandro Damián Nicanor Pérez Meyer wrote: > > kdemultimedia creates lots of binaries [0]. Do you know exactly > > which of them use the old mb? > > Yes, it's libkcddb4 and kscd. > > > Please **note** that I'm mostly speaking **for myself**: *if* the > > patches are accepted upstream and we manage to get them before the > > freeze (we uploaded kdemultimedia a few days ago, so we will wait > > for it to enter unstable), I don't think there will be much > > problem in applying them. > > I don't think upstream are likely to accept these patches. My > understanding is that the version we're talking about is considered > stable by upstream and so they won't accept further changes. Their > focus is on the next release (which has moved away from the > monolithic packaging). However I am not very familiar with KDE > upstream, and perhaps they would consider the patches after all. The > turn-around to get them accepted upstream would rule this out for > wheezy, though. This is correct, usually KDE stable series are feature- and string- frozen, and that includes also dependencies. However, at this point a KDE 4.8.5 is not that likely (although it has not been totally ruled out yet), so a backport would not be much helpful. > The patches themselves, when I write them, are backports from the git > repositories for kcddb and kscd. libkcddb has been converted already to MB5 for the future KDE 4.9; attached there is a preliminary backport I did (warning: it is not tested, not even to compile!) wrt kdemultimedia 4.8.x. However, kscd has not been ported upstream yet. > There are presently three packages relying on mb3 still: > [...] > There's a slim chance we can get the migration to musicbrainz5 done > in time for wheezy. One important question is: if libkcddb and kscd in Wheezy still use MB3, except the issues mentioned earlier about multi-discs, which kind of issues would they have? Would they still be able to search/fetch/uploadd disc info in, say, the next couple of years? (Since I'm no MB-literate, I'm asking to know more about the current situation, and to eventually decide whether me or the team should invest in this.) Thanks, -- Pino Toscano
Author: Richard Lärkäng <larkang@gmail.com>
Author: Pino Toscano <pino@kde.org> <pino@debian.org>
Description: Port libkcddb to MusicBrainz5
Apply the serie of upstream commits that port libkcddb to MusicBrainz5
(passing through MusicBrainz4), which are part of KDE 4.9.
It includes also a bugfix for year reading (KDE bug #300091).
.
The patch has been slightly modified to not change the libkcddb version,
and to not enable Musicbrainz lookup by default (keeping the behaviour
of kdemultimedia 4.8.x).
Applied-Upstream: commit:57902715f4592ef44da39835ace42242f96e0a3a
Applied-Upstream: commit:4c71ec9c617b4d442a42a7b2c00004c57eb333c1
Applied-Upstream: commit:fa6acd9986779659e9aac8c2cf85e735e7632f85
Applied-Upstream: commit:79b80e1ec090beedf9061cae75a04c39ae5309eb
Applied-Upstream: commit:35880a3bca3c8bf88b07b143d20b5b51ce339a21
Applied-Upstream: commit:95ab6c638ea90e3241bd1950b937c52c34cd7c99
Applied-Upstream: commit:a2d2a670fb5ac1a733f35b3358d00b8981a4a459
Last-Update: 2012-06-28
--- a/libkcddb/CMakeLists.txt
+++ b/libkcddb/CMakeLists.txt
@@ -3,19 +3,22 @@ project(libkcddb)
add_subdirectory( test )
add_subdirectory( kcmcddb )
-if(MUSICBRAINZ3_FOUND)
- set(HAVE_MUSICBRAINZ3 1)
- include_directories(${MUSICBRAINZ3_INCLUDE_DIR})
+macro_optional_find_package(MusicBrainz5)
+macro_log_feature(MUSICBRAINZ5_FOUND "MusicBrainz5" "A library that provides access to metadata lookup on the MusicBrainz server" "http://www.musicbrainz.org" FALSE "" "Music metadata lookup for KDE multimedia applications through libkcddb. You need version 5.x of libmusicbrainz")
+
+if(MUSICBRAINZ5_FOUND)
+ set(HAVE_MUSICBRAINZ5 1)
+ include_directories(${MUSICBRAINZ5_INCLUDE_DIR})
set(libmusicbrainz_SRCS ${libmusicbrainz_SRCS}
musicbrainz/musicbrainzlookup.cpp
musicbrainz/asyncmusicbrainzlookup.cpp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS}")
-else(MUSICBRAINZ3_FOUND)
- set(HAVE_MUSICBRAINZ3 0)
+else(MUSICBRAINZ5_FOUND)
+ set(HAVE_MUSICBRAINZ5 0)
set(libmusicbrainz_SRCS)
-endif(MUSICBRAINZ3_FOUND)
+endif(MUSICBRAINZ5_FOUND)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config-musicbrainz.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-musicbrainz.h )
@@ -58,9 +61,9 @@ kde4_add_kcfg_files(kcddb_LIB_SRCS confi
kde4_add_library(kcddb SHARED ${kcddb_LIB_SRCS})
target_link_libraries(kcddb ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS})
-if(MUSICBRAINZ3_FOUND)
- target_link_libraries(kcddb ${MUSICBRAINZ3_LIBRARIES})
-endif(MUSICBRAINZ3_FOUND)
+if(MUSICBRAINZ5_FOUND)
+ target_link_libraries(kcddb ${MUSICBRAINZ5_LIBRARIES})
+endif(MUSICBRAINZ5_FOUND)
set_target_properties(kcddb PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION} )
install(TARGETS kcddb ${INSTALL_TARGETS_DEFAULT_ARGS} )
--- a/libkcddb/cache.cpp
+++ b/libkcddb/cache.cpp
@@ -26,7 +26,7 @@
#include "cddb.h"
#include "config-musicbrainz.h"
-#ifdef HAVE_MUSICBRAINZ3
+#ifdef HAVE_MUSICBRAINZ5
#include "musicbrainz/musicbrainzlookup.h"
#endif
@@ -49,7 +49,7 @@ namespace KCDDB
CDInfoList infoList;
infoList << CDDB::cacheFiles(offsetList, c);
-#ifdef HAVE_MUSICBRAINZ3
+#ifdef HAVE_MUSICBRAINZ5
infoList << MusicBrainzLookup::cacheFiles(offsetList, c);
#endif
--- a/libkcddb/cdinfo.cpp
+++ b/libkcddb/cdinfo.cpp
@@ -443,13 +443,30 @@ namespace KCDDB
else
s += d->createLine(QLatin1String( "DGENRE" ),get(Genre).toString());
+ bool isSampler = false;
+ for (int i = 0; i < d->trackInfoList.count(); ++i){
+ QString trackArtist = d->trackInfoList[i].get(Artist).toString();
+ if (!trackArtist.isEmpty() && trackArtist != artist)
+ {
+ isSampler = true;
+ break;
+ }
+ }
+
for (int i = 0; i < d->trackInfoList.count(); ++i){
QString trackTitle = d->trackInfoList[i].get(Title).toString();
QString trackArtist = d->trackInfoList[i].get(Artist).toString();
- if(trackArtist != artist && !trackArtist.isEmpty())
+ if (isSampler)
+ {
+ if (trackArtist.isEmpty())
+ s += d->createLine(QString::fromLatin1("TTITLE%1").arg(i), QString::fromLatin1("%1 / %2").arg(artist).arg(trackTitle));
+ else
s += d->createLine(QString::fromLatin1("TTITLE%1").arg(i), QString::fromLatin1("%1 / %2").arg(trackArtist).arg(trackTitle));
+ }
else
+ {
s += d->createLine(QString::fromLatin1("TTITLE%1").arg(i), trackTitle);
+ }
}
s += d->createLine(QLatin1String("EXTD"), get(Comment).toString());
--- a/libkcddb/client.cpp
+++ b/libkcddb/client.cpp
@@ -33,7 +33,7 @@
#include "lookup.h"
#include "config-musicbrainz.h"
-#ifdef HAVE_MUSICBRAINZ3
+#ifdef HAVE_MUSICBRAINZ5
#include "musicbrainz/musicbrainzlookup.h"
#include "musicbrainz/asyncmusicbrainzlookup.h"
#endif
@@ -138,7 +138,7 @@ namespace KCDDB
if ( blockingMode() )
{
-#ifdef HAVE_MUSICBRAINZ3
+#ifdef HAVE_MUSICBRAINZ5
if ( d->config.musicBrainzLookupEnabled() )
{
d->cdInfoLookup = new MusicBrainzLookup();
@@ -186,7 +186,7 @@ namespace KCDDB
}
else
{
-#ifdef HAVE_MUSICBRAINZ3
+#ifdef HAVE_MUSICBRAINZ5
if ( d->config.musicBrainzLookupEnabled() )
{
AsyncMusicBrainzLookup* lookup = new AsyncMusicBrainzLookup();
--- a/libkcddb/config-musicbrainz.h.cmake
+++ b/libkcddb/config-musicbrainz.h.cmake
@@ -1,2 +1,2 @@
/* have MusicBrainz */
-#cmakedefine HAVE_MUSICBRAINZ3 1
+#cmakedefine HAVE_MUSICBRAINZ5 1
--- a/libkcddb/httpsubmit.cpp
+++ b/libkcddb/httpsubmit.cpp
@@ -51,8 +51,8 @@ namespace KCDDB
header += QLatin1String( "Category: " ) + cdInfo.get(Category).toString() + QLatin1Char( '\n' );
header += QLatin1String( "Discid: " ) + cdInfo.get(QLatin1String( "discid" )).toString() + QLatin1Char( '\n' );
header += QLatin1String( "User-Email: " ) + from_ + QLatin1Char( '\n' );
- // Change to sumbit
- header += QLatin1String( "Submit-Mode: test\n" );
+ //header += QLatin1String( "Submit-Mode: test\n" );
+ header += QLatin1String( "Submit-Mode: submit\n" );
header += QLatin1String( "Charset: UTF-8" );
job->addMetaData(QLatin1String( "customHTTPHeader" ), header);
--- a/libkcddb/kcmcddb/cddbconfigwidget.cpp
+++ b/libkcddb/kcmcddb/cddbconfigwidget.cpp
@@ -46,7 +46,7 @@ CDDBConfigWidget::CDDBConfigWidget(QWidg
{
setupUi(this);
-#ifndef HAVE_MUSICBRAINZ3
+#ifndef HAVE_MUSICBRAINZ5
kcfg_MusicBrainzLookupEnabled->hide();
#endif
--- a/libkcddb/libkcddb.kcfg
+++ b/libkcddb/libkcddb.kcfg
@@ -61,7 +61,7 @@
<entry name="smtpHostname" type="String">
</entry>
<entry name="submitAddress" type="String">
- <default>test-submit@freedb.org</default>
+ <default>freedb-submit@freedb.org</default>
</entry>
</group>
</kcfg>
--- a/libkcddb/musicbrainz/musicbrainzlookup.cpp
+++ b/libkcddb/musicbrainz/musicbrainzlookup.cpp
@@ -22,13 +22,21 @@
#include <kdebug.h>
#include <kcodecs.h>
+#include <klocale.h>
#include <qcryptographichash.h>
#include <cstdio>
#include <cstring>
-#include <musicbrainz3/musicbrainz.h>
-#include <musicbrainz3/query.h>
-#include <musicbrainz3/release.h>
-#include <musicbrainz3/filters.h>
+#include <musicbrainz5/Query.h>
+#include <musicbrainz5/Medium.h>
+#include <musicbrainz5/Release.h>
+#include <musicbrainz5/ReleaseGroup.h>
+#include <musicbrainz5/Track.h>
+#include <musicbrainz5/Recording.h>
+#include <musicbrainz5/Disc.h>
+#include <musicbrainz5/HTTPFetch.h>
+#include <musicbrainz5/ArtistCredit.h>
+#include <musicbrainz5/Artist.h>
+#include <musicbrainz5/NameCredit.h>
namespace KCDDB
{
@@ -48,60 +56,181 @@ namespace KCDDB
kDebug() << "Should lookup " << discId;
- MusicBrainz::Query q;
- MusicBrainz::ReleaseResultList results;
+ MusicBrainz5::CQuery Query("libkcddb-0.4");
+
+ // Code adapted from libmusicbrainz/examples/cdlookup.cc
try {
- MusicBrainz::ReleaseFilter f = MusicBrainz::ReleaseFilter().discId(std::string(discId.toAscii()));
- results = q.getReleases(&f);
- }
- // FIXME Doesn't seem to get caught, why?
- // catch (MusicBrainz::WebServiceError &e)
- catch (...)
- {
- kDebug() << "Query failed"; //<< e.what();
- return UnknownError;
- }
-
- int relnr=1;
- for (MusicBrainz::ReleaseResultList::iterator i = results.begin(); i != results.end(); i++) {
- MusicBrainz::ReleaseResult *result = *i;
- MusicBrainz::Release *release;
- try {
- release = q.getReleaseById(result->getRelease()->getId(), &MusicBrainz::ReleaseIncludes().tracks().artist());
- }
- catch (MusicBrainz::WebServiceError &e) {
- kDebug() << "Error: " << e.what();
- continue;
- }
- CDInfo info;
- info.set(QLatin1String( "source" ), QLatin1String( "musicbrainz" ));
- // Uses musicbrainz discid for the first release,
- // then discid-2, discid-3 and so on, to
- // allow multiple releases with the same discid
- if (relnr == 1)
- info.set(QLatin1String( "discid" ), discId);
- else
- info.set(QLatin1String( "discid" ), discId+QLatin1String( "-" )+QString::number(relnr));
+ MusicBrainz5::CMetadata Metadata=Query.Query("discid",discId.toAscii().constData());
+
+ if (Metadata.Disc() && Metadata.Disc()->ReleaseList())
+ {
+ MusicBrainz5::CReleaseList *ReleaseList=Metadata.Disc()->ReleaseList();
+ kDebug() << "Found " << ReleaseList->NumItems() << " release(s)";
- info.set(Title, QString::fromUtf8(release->getTitle().c_str()));
- info.set(Artist, QString::fromUtf8(release->getArtist()->getName().c_str()));
+ int relnr=1;
- int trackno = 0;
- for (MusicBrainz::TrackList::iterator j = release->getTracks().begin(); j != release->getTracks().end(); j++) {
- MusicBrainz::Track *mb_track = *j;
- MusicBrainz::Artist *artist = mb_track->getArtist();
- if (!artist)
- artist = release->getArtist();
- TrackInfo& track = info.track(trackno);
- track.set(Artist, QString::fromUtf8(artist->getName().c_str()));
- track.set(Title, QString::fromUtf8(mb_track->getTitle().c_str()));
- trackno++;
+ for (int i = 0; i < ReleaseList->NumItems(); i++)
+ {
+ MusicBrainz5::CRelease* Release=ReleaseList->Item(i);
+
+ //The releases returned from LookupDiscID don't contain full information
+
+ MusicBrainz5::CQuery::tParamMap Params;
+ Params["inc"]="artists labels recordings release-groups url-rels discids artist-credits";
+
+ std::string ReleaseID=Release->ID();
+
+ MusicBrainz5::CMetadata Metadata2=Query.Query("release",ReleaseID,"",Params);
+ if (Metadata2.Release())
+ {
+ MusicBrainz5::CRelease *FullRelease=Metadata2.Release();
+
+ //However, these releases will include information for all media in the release
+ //So we need to filter out the only the media we want.
+
+ MusicBrainz5::CMediumList MediaList=FullRelease->MediaMatchingDiscID(discId.toAscii().constData());
+
+ if (MediaList.NumItems() > 0)
+ {
+ /*if (FullRelease->ReleaseGroup())
+ kDebug() << "Release group title: " << FullRelease->ReleaseGroup()->Title();
+ else
+ kDebug() << "No release group for this release";*/
+
+ kDebug() << "Found " << MediaList.NumItems() << " media item(s)";
+
+ for (int i=0; i < MediaList.NumItems(); i++)
+ {
+ MusicBrainz5::CMedium* Medium= MediaList.Item(i);
+
+ /*kDebug() << "Found media: '" << Medium.Title() << "', position " << Medium.Position();*/
+
+ CDInfo info;
+ info.set(QLatin1String( "source" ), QLatin1String( "musicbrainz" ));
+ // Uses musicbrainz discid for the first release,
+ // then discid-2, discid-3 and so on, to
+ // allow multiple releases with the same discid
+ if (relnr == 1)
+ info.set(QLatin1String( "discid" ), discId);
+ else
+ info.set(QLatin1String( "discid" ), discId+QLatin1String( "-" )+QString::number(relnr));
+
+ QString title = QString::fromUtf8(FullRelease->Title().c_str());
+
+ if (FullRelease->MediumList()->NumItems() > 1)
+ title = i18n("%1 (disc %2)", title, Medium->Position());
+
+ info.set(Title, title);
+ info.set(Artist, artistFromCreditList(FullRelease->ArtistCredit()));
+
+ QString date = QString::fromUtf8(FullRelease->Date().c_str());
+ QRegExp yearRe("^(\\d{4,4})(-\\d{1,2}-\\d{1,2})?$");
+ int year = 0;
+ if (yearRe.indexIn(date) > -1)
+ {
+ QString yearString = yearRe.cap(1);
+ bool ok;
+ year=yearString.toInt(&ok);
+ if (!ok)
+ year = 0;
+ }
+ info.set(Year, year);
+
+ MusicBrainz5::CTrackList *TrackList=Medium->TrackList();
+ if (TrackList)
+ {
+ for (int i=0; i < TrackList->NumItems(); i++)
+ {
+ MusicBrainz5::CTrack* Track=TrackList->Item(i);
+ MusicBrainz5::CRecording *Recording=Track->Recording();
+
+ TrackInfo& track = info.track(i);
+
+ // Prefer title and artist from the track credits, but
+ // it appears to be empty if same as in Recording
+ // Noticable in the musicbrainztest-fulldate test,
+ // where the title on the credits of track 18 are
+ // "Bara om min älskade väntar", but the recording
+ // has title "Men bara om min älskade"
+ if(Recording && Track->ArtistCredit() == 0)
+ track.set(Artist, artistFromCreditList(Recording->ArtistCredit()));
+ else
+ track.set(Artist, artistFromCreditList(Track->ArtistCredit()));
+
+ if(Recording && Track->Title().empty())
+ track.set(Title, QString::fromUtf8(Recording->Title().c_str()));
+ else
+ track.set(Title, QString::fromUtf8(Track->Title().c_str()));
+ }
+ }
+ cdInfoList_ << info;
+ relnr++;
+ }
+ }
+ }
}
- delete result;
+ }
+ }
+
+ catch (MusicBrainz5::CConnectionError& Error)
+ {
+ kDebug() << "Connection Exception: '" << Error.what() << "'";
+ kDebug() << "LastResult: " << Query.LastResult();
+ kDebug() << "LastHTTPCode: " << Query.LastHTTPCode();
+ kDebug() << "LastErrorMessage: " << QString::fromUtf8(Query.LastErrorMessage().c_str());
+
+ return ServerError;
+ }
+
+ catch (MusicBrainz5::CTimeoutError& Error)
+ {
+ kDebug() << "Timeout Exception: '" << Error.what() << "'";
+ kDebug() << "LastResult: " << Query.LastResult();
+ kDebug() << "LastHTTPCode: " << Query.LastHTTPCode();
+ kDebug() << "LastErrorMessage: " << QString::fromUtf8(Query.LastErrorMessage().c_str());
- cdInfoList_ << info;
- relnr++;
+ return ServerError;
+ }
+
+ catch (MusicBrainz5::CAuthenticationError& Error)
+ {
+ kDebug() << "Authentication Exception: '" << Error.what() << "'";
+ kDebug() << "LastResult: " << Query.LastResult();
+ kDebug() << "LastHTTPCode: " << Query.LastHTTPCode();
+ kDebug() << "LastErrorMessage: " << QString::fromUtf8(Query.LastErrorMessage().c_str());
+
+ return ServerError;
+ }
+
+ catch (MusicBrainz5::CFetchError& Error)
+ {
+ kDebug() << "Fetch Exception: '" << Error.what() << "'";
+ kDebug() << "LastResult: " << Query.LastResult();
+ kDebug() << "LastHTTPCode: " << Query.LastHTTPCode();
+ kDebug() << "LastErrorMessage: " << QString::fromUtf8(Query.LastErrorMessage().c_str());
+
+ return ServerError;
+ }
+
+ catch (MusicBrainz5::CRequestError& Error)
+ {
+ kDebug() << "Request Exception: '" << Error.what() << "'";
+ kDebug() << "LastResult: " << Query.LastResult();
+ kDebug() << "LastHTTPCode: " << Query.LastHTTPCode();
+ kDebug() << "LastErrorMessage: " << QString::fromUtf8(Query.LastErrorMessage().c_str());
+
+ return ServerError;
+ }
+
+ catch (MusicBrainz5::CResourceNotFoundError& Error)
+ {
+ kDebug() << "ResourceNotFound Exception: '" << Error.what() << "'";
+ kDebug() << "LastResult: " << Query.LastResult();
+ kDebug() << "LastHTTPCode: " << Query.LastHTTPCode();
+ kDebug() << "LastErrorMessage: " << QString::fromUtf8(Query.LastErrorMessage().c_str());
+
+ return ServerError;
}
if (cdInfoList_.isEmpty())
@@ -196,6 +325,35 @@ namespace KCDDB
return infoList;
}
+
+ QString MusicBrainzLookup::artistFromCreditList(MusicBrainz5::CArtistCredit * artistCredit )
+ {
+ kDebug() << k_funcinfo;
+ QString artistName;
+
+ MusicBrainz5::CNameCreditList *ArtistList=artistCredit->NameCreditList();
+
+ if (ArtistList)
+ {
+ for (int i=0; i < ArtistList->NumItems(); i++)
+ {
+ MusicBrainz5::CNameCredit* Name=ArtistList->Item(i);
+ MusicBrainz5::CArtist* Artist = Name->Artist();
+
+ if (!Name->Name().empty())
+ artistName += QString::fromUtf8(Name->Name().c_str());
+ else
+ artistName += QString::fromUtf8(Artist->Name().c_str());
+
+ artistName += QString::fromUtf8(Name->JoinPhrase().c_str());
+ }
+
+ kDebug() << "Artist:" << artistName;
+
+ }
+
+ return artistName;
+ }
}
// vim:tabstop=2:shiftwidth=2:expandtab:cinoptions=(s,U1,m1
--- a/libkcddb/musicbrainz/musicbrainzlookup.h
+++ b/libkcddb/musicbrainz/musicbrainzlookup.h
@@ -25,6 +25,11 @@
#include "../kcddb.h"
#include "../kcddbconfig.h"
+namespace MusicBrainz5
+{
+ class CArtistCredit;
+}
+
namespace KCDDB
{
class MusicBrainzLookup : public Lookup
@@ -44,6 +49,7 @@ namespace KCDDB
private:
static QString calculateDiscId(const TrackOffsetList & );
+ static QString artistFromCreditList(MusicBrainz5::CArtistCredit * );
} ;
}
--- a/libkcddb/test/CMakeLists.txt
+++ b/libkcddb/test/CMakeLists.txt
@@ -27,6 +27,8 @@ KCDDB_UNIT_TESTS(
asyncmusicbrainztest
cdinfotest
cachetest
+ musicbrainztest-severaldiscs
+ musicbrainztest-fulldate
)
KCDDB_EXECUTABLE_TESTS(
--- a/libkcddb/test/asyncmusicbrainztest.cpp
+++ b/libkcddb/test/asyncmusicbrainztest.cpp
@@ -28,7 +28,7 @@ void AsyncMusicBrainzTest::testLookup()
{
using namespace KCDDB;
-#ifndef HAVE_MUSICBRAINZ3
+#ifndef HAVE_MUSICBRAINZ5
QSKIP("This test requires libmusicbrainz", SkipAll);
#endif
@@ -74,9 +74,9 @@ void AsyncMusicBrainzTest::testLookup()
QCOMPARE(m_info.get(Artist).toString(),QString("Various Artists"));
QCOMPARE(m_info.get(Title).toString(),QString::fromUtf8("Definitivt 50 spänn 10"));
- // genre and year not really supported for musicbrainz
+ // genre not really supported for musicbrainz
QCOMPARE(m_info.get(Genre).toString(),QString());
- QCOMPARE(m_info.get(Year).toInt(),0);
+ QCOMPARE(m_info.get(Year).toInt(),2001);
QCOMPARE(m_info.track(0).get(Title).toString(),QString::fromUtf8("Uphill Struggle"));
QCOMPARE(m_info.track(1).get(Title).toString(),QString::fromUtf8("Vill du bli miljonär?"));
QCOMPARE(m_info.track(2).get(Title).toString(),QString::fromUtf8("Här är jag"));
--- /dev/null
+++ b/libkcddb/test/musicbrainztest-severaldiscs.cpp
@@ -0,0 +1,141 @@
+/*
+ Copyright (C) 2006 Richard Lärkäng <nouseforaname@home.se>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qtest_kde.h>
+#include "musicbrainztest-severaldiscs.h"
+#include "libkcddb/client.h"
+#include "libkcddb/cache.h"
+#include "libkcddb/lookup.h"
+#include "config-musicbrainz.h"
+
+
+void MusicBrainzTestSeveralDiscs::testLookup()
+{
+ using namespace KCDDB;
+
+#ifndef HAVE_MUSICBRAINZ5
+ QSKIP("This test requires libmusicbrainz", SkipAll);
+#endif
+
+ Client c;
+ c.config().setCacheLookupEnabled(false);
+ c.config().setFreedbLookupEnabled(false);
+ c.config().setMusicBrainzLookupEnabled(true);
+
+ TrackOffsetList list;
+
+ list <<
+ 150 <<
+ 17272 <<
+ 36395 <<
+ 47954 <<
+ 63638 <<
+ 77928 <<
+ 95029 <<
+ 112094 <<
+ 130540 <<
+ 145938 <<
+ 160463 <<
+ 180364 <<
+ 195549 <<
+ 203821 <<
+ 222410 <<
+ 230367 <<
+ 249241 <<
+ 273944 <<
+ 287584 <<
+ 309904 <<
+ 325124;
+
+ Result r = c.lookup(list);
+
+ QVERIFY(r == Success);
+
+ kDebug() << "Client::lookup gave : " << resultToString(r);
+
+ CDInfoList response = c.lookupResponse();
+
+ kDebug() << "Client::lookup returned : " << response.count() << " entries"
+ << endl;
+
+ QVERIFY(response.count() > 0);
+
+ // See http://musicbrainz.org/release/4e0655b5-22fc-496e-9c14-2ee1a6027b45 for changes (disc 2)
+ CDInfo i(response.first());
+ QCOMPARE(i.numberOfTracks(),20);
+
+ QCOMPARE(i.get(Artist).toString(),QString("Billy Bragg"));
+ QCOMPARE(i.get(Title).toString(),QString("Must I Paint You a Picture? The Essential Billy Bragg (disc 2)"));
+ // genre not really supported for musicbrainz
+ QCOMPARE(i.get(Genre).toString(),QString());
+ QCOMPARE(i.get(Year).toInt(),2003);
+ QCOMPARE(i.track(0).get(Title).toString(),QString("Sexuality"));
+ QCOMPARE(i.track(1).get(Title).toString(),QString("Cindy of 1000 Lives"));
+ QCOMPARE(i.track(2).get(Title).toString(),QString("Moving the Goalposts"));
+ QCOMPARE(i.track(3).get(Title).toString(),QString("Tank Park Salute"));
+ QCOMPARE(i.track(4).get(Title).toString(),QString("You Woke Up My Neighbourhood"));
+ QCOMPARE(i.track(5).get(Title).toString(),QString("Accident Waiting to Happen (Red Stars version)"));
+ QCOMPARE(i.track(6).get(Title).toString(),QString("Sulk"));
+ QCOMPARE(i.track(7).get(Title).toString(),QString("Upfield"));
+ QCOMPARE(i.track(8).get(Title).toString(),QString("The Fourteenth of February"));
+ QCOMPARE(i.track(9).get(Title).toString(),QString("Brickbat"));
+ QCOMPARE(i.track(10).get(Title).toString(),QString("The Space Race Is Over"));
+ QCOMPARE(i.track(11).get(Title).toString(),QString("The Boy Done Good"));
+ QCOMPARE(i.track(12).get(Title).toString(),QString("Ingrid Bergman"));
+ QCOMPARE(i.track(13).get(Title).toString(),QString("Way Over Yonder in the Minor Key"));
+ QCOMPARE(i.track(14).get(Title).toString(),QString("My Flying Saucer"));
+ QCOMPARE(i.track(15).get(Title).toString(),QString("All You Fascists Bound to Lose (Blokes version)"));
+ QCOMPARE(i.track(16).get(Title).toString(),QString("NPWA"));
+ QCOMPARE(i.track(17).get(Title).toString(),QString("St. Monday"));
+ QCOMPARE(i.track(18).get(Title).toString(),QString("Somedays I See the Point"));
+ QCOMPARE(i.track(19).get(Title).toString(),QString("Take Down the Union Jack (Band version)"));
+ for (int j=0; j < 12; j++)
+ QCOMPARE(i.track(j).get(Artist).toString(),QString("Billy Bragg"));
+ for (int j=12; j < 15; j++)
+ QCOMPARE(i.track(j).get(Artist).toString(),QString("Billy Bragg & Wilco"));
+ for (int j=15; j < 20; j++)
+ QCOMPARE(i.track(j).get(Artist).toString(),QString("Billy Bragg and The Blokes"));
+ // comments not supported in a simple way
+ for (int j=0; j < 19; j++)
+ QCOMPARE(i.track(j).get(Comment).toString(),QString());
+
+ // Make sure it's the same when loaded from the cache again
+ c.config().setCacheLookupEnabled(true);
+ c.config().setFreedbLookupEnabled(false);
+ c.config().setMusicBrainzLookupEnabled(false);
+
+ c.lookup(list);
+
+ response = c.lookupResponse();
+ QVERIFY(response.count() > 0);
+
+ CDInfo cacheInfo(response.first());
+ QCOMPARE(i.get(Artist).toString(),cacheInfo.get(Artist).toString());
+ QCOMPARE(i.get(Title).toString(),cacheInfo.get(Title).toString());
+ QCOMPARE(i.get(Year).toInt(),cacheInfo.get(Year).toInt());
+ for (int j=0; j < 19; j++)
+ {
+ QCOMPARE(i.track(j).get(Title).toString(),cacheInfo.track(j).get(Title).toString());
+ QCOMPARE(i.track(j).get(Comment).toString(),cacheInfo.track(j).get(Comment).toString());
+ }
+}
+
+QTEST_KDEMAIN(MusicBrainzTestSeveralDiscs, NoGUI)
+
+#include "musicbrainztest-severaldiscs.moc"
--- /dev/null
+++ b/libkcddb/test/musicbrainztest-severaldiscs.h
@@ -0,0 +1,32 @@
+/*
+ Copyright (C) 2006 Richard Lärkäng <nouseforaname@home.se>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef MUSICBRAINZTESTSEVERALDISCS_H
+#define MUSICBRAINZTESTSEVERALDISCS_H
+
+#include <QObject>
+
+class MusicBrainzTestSeveralDiscs : public QObject
+{
+ Q_OBJECT
+ private slots:
+ void testLookup();
+};
+
+#endif
--- a/libkcddb/test/musicbrainztest.cpp
+++ b/libkcddb/test/musicbrainztest.cpp
@@ -29,7 +29,7 @@ void MusicBrainzTest::testLookup()
{
using namespace KCDDB;
-#ifndef HAVE_MUSICBRAINZ3
+#ifndef HAVE_MUSICBRAINZ5
QSKIP("This test requires libmusicbrainz", SkipAll);
#endif
@@ -71,15 +71,15 @@ void MusicBrainzTest::testLookup()
QVERIFY(response.count() > 0);
- // See http://musicbrainz.org/showalbum.html?albumid=375639 for changes
+ // See http://musicbrainz.org/release/68ec4a09-576c-472e-9103-aed99b6a3ffc for changes
CDInfo i(response.first());
QCOMPARE(i.numberOfTracks(),14);
QCOMPARE(i.get(Artist).toString(),QString("The Liptones"));
QCOMPARE(i.get(Title).toString(),QString("The Latest News"));
- // genre and year not really supported for musicbrainz
+ // genre not really supported for musicbrainz
QCOMPARE(i.get(Genre).toString(),QString());
- QCOMPARE(i.get(Year).toInt(),0);
+ QCOMPARE(i.get(Year).toInt(),2002);
QCOMPARE(i.track(0).get(Title).toString(),QString("Jungle Heat"));
QCOMPARE(i.track(1).get(Title).toString(),QString("It's All I Hear You Say"));
QCOMPARE(i.track(2).get(Title).toString(),QString("Girl for Tonight"));
--- /dev/null
+++ b/cmake/modules/FindMusicBrainz5.cmake
@@ -0,0 +1,26 @@
+# Module to find the musicbrainz-4 library
+#
+# It defines
+# MUSICBRAINZ5_INCLUDE_DIR - the include dir
+# MUSICBRAINZ5_LIBRARIES - the required libraries
+# MUSICBRAINZ5_FOUND - true if both of the above have been found
+
+# Copyright (c) 2006,2007 Laurent Montel, <montel@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+if(MUSICBRAINZ5_INCLUDE_DIR AND MUSICBRAINZ5_LIBRARIES)
+ set(MUSICBRAINZ5_FIND_QUIETLY TRUE)
+endif(MUSICBRAINZ5_INCLUDE_DIR AND MUSICBRAINZ5_LIBRARIES)
+
+FIND_PATH(MUSICBRAINZ5_INCLUDE_DIR musicbrainz5/Disc.h)
+
+FIND_LIBRARY( MUSICBRAINZ5_LIBRARIES NAMES musicbrainz5)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args( MusicBrainz5 DEFAULT_MSG
+ MUSICBRAINZ5_INCLUDE_DIR MUSICBRAINZ5_LIBRARIES)
+
+MARK_AS_ADVANCED(MUSICBRAINZ5_INCLUDE_DIR MUSICBRAINZ5_LIBRARIES)
+
--- /dev/null
+++ b/libkcddb/test/musicbrainztest-fulldate.cpp
@@ -0,0 +1,157 @@
+/*
+ Copyright (C) 2006 Richard Lärkäng <nouseforaname@home.se>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qtest_kde.h>
+#include "musicbrainztest-fulldate.h"
+#include "libkcddb/client.h"
+#include "libkcddb/cache.h"
+#include "libkcddb/lookup.h"
+#include "config-musicbrainz.h"
+
+
+void MusicBrainzTestFullDate::testLookup()
+{
+ using namespace KCDDB;
+
+#ifndef HAVE_MUSICBRAINZ5
+ QSKIP("This test requires libmusicbrainz", SkipAll);
+#endif
+
+ Client c;
+ c.config().setCacheLookupEnabled(false);
+ c.config().setFreedbLookupEnabled(false);
+ c.config().setMusicBrainzLookupEnabled(true);
+
+ TrackOffsetList list;
+
+ list <<
+ 150 <<
+ 11837 <<
+ 20687 <<
+ 29120 <<
+ 35557 <<
+ 50087 <<
+ 58550 <<
+ 72575 <<
+ 81887 <<
+ 95745 <<
+ 104340 <<
+ 115425 <<
+ 124285 <<
+ 132317 <<
+ 142692 <<
+ 160272 <<
+ 169325 <<
+ 181377 <<
+ 194482 <<
+ 205747 <<
+ 216492 <<
+ 229507 <<
+ 242715 <<
+ 252112 <<
+ 274965 <<
+ 285820 <<
+ 308957 <<
+ 322362 <<
+ 338662 <<
+ 350172 <<
+ 356692;
+
+ Result r = c.lookup(list);
+
+ QVERIFY(r == Success);
+
+ kDebug() << "Client::lookup gave : " << resultToString(r);
+
+ CDInfoList response = c.lookupResponse();
+
+ kDebug() << "Client::lookup returned : " << response.count() << " entries"
+ << endl;
+
+ QVERIFY(response.count() > 0);
+
+ // See http://musicbrainz.org/release/04319e80-0948-4e89-8180-7cf6f17fc77a for changes
+ CDInfo i(response.first());
+ QCOMPARE(i.numberOfTracks(),30);
+
+ QCOMPARE(i.get(Artist).toString(),QString("Troublemakers"));
+ QCOMPARE(i.get(Title).toString(),QString("30"));
+ // genre not really supported for musicbrainz
+ QCOMPARE(i.get(Genre).toString(),QString());
+ QCOMPARE(i.get(Year).toInt(),2011);
+ QCOMPARE(i.track(0).get(Title).toString(),QString("30"));
+ QCOMPARE(i.track(1).get(Title).toString(),QString::fromUtf8("Staden Göteborg"));
+ QCOMPARE(i.track(2).get(Title).toString(),QString::fromUtf8("Lilla Blå"));
+ QCOMPARE(i.track(3).get(Title).toString(),QString("Kleptoman"));
+ QCOMPARE(i.track(4).get(Title).toString(),QString::fromUtf8("Grogg å parabol"));
+ QCOMPARE(i.track(5).get(Title).toString(),QString("Majorna brinner"));
+ QCOMPARE(i.track(6).get(Title).toString(),QString::fromUtf8("Utan hjärta stannar Sverige"));
+ QCOMPARE(i.track(7).get(Title).toString(),QString("Dom e efter mig"));
+ QCOMPARE(i.track(8).get(Title).toString(),QString("Mammas flickor"));
+ QCOMPARE(i.track(9).get(Title).toString(),QString("Handgranat"));
+ QCOMPARE(i.track(10).get(Title).toString(),QString("Stenar o blod"));
+ QCOMPARE(i.track(11).get(Title).toString(),QString("Enkel Berlin"));
+ QCOMPARE(i.track(12).get(Title).toString(),QString("Dom ljuger"));
+ QCOMPARE(i.track(13).get(Title).toString(),QString("Jobba"));
+ QCOMPARE(i.track(14).get(Title).toString(),QString::fromUtf8("Varför lyser inga stjärnor"));
+ QCOMPARE(i.track(15).get(Title).toString(),QString("Partytrash"));
+ QCOMPARE(i.track(16).get(Title).toString(),QString::fromUtf8("Förstod ingenting"));
+ QCOMPARE(i.track(17).get(Title).toString(),QString::fromUtf8("Bara om min älskade väntar"));
+ QCOMPARE(i.track(18).get(Title).toString(),QString("Lillebror"));
+ QCOMPARE(i.track(19).get(Title).toString(),QString("Skandaler"));
+ QCOMPARE(i.track(20).get(Title).toString(),QString::fromUtf8("Hjältarna skålar i blod"));
+ QCOMPARE(i.track(21).get(Title).toString(),QString("Bomber o granater"));
+ QCOMPARE(i.track(22).get(Title).toString(),QString::fromUtf8("Vill du bli miljonär"));
+ QCOMPARE(i.track(23).get(Title).toString(),QString::fromUtf8("Stjärnorna kvittar det lika"));
+ QCOMPARE(i.track(24).get(Title).toString(),QString("Naken"));
+ QCOMPARE(i.track(25).get(Title).toString(),QString::fromUtf8("Månen lyser klar"));
+ QCOMPARE(i.track(26).get(Title).toString(),QString("Vild o vacker"));
+ QCOMPARE(i.track(27).get(Title).toString(),QString("Jag fryser"));
+ QCOMPARE(i.track(28).get(Title).toString(),QString("Ein zwei polizei"));
+ QCOMPARE(i.track(29).get(Title).toString(),QString::fromUtf8("Jävla idiot"));
+ for (int j=0; j < 30; j++)
+ QCOMPARE(i.track(j).get(Artist).toString(),QString("Troublemakers"));
+ // comments not supported in a simple way
+ for (int j=0; j < 19; j++)
+ QCOMPARE(i.track(j).get(Comment).toString(),QString());
+
+ // Make sure it's the same when loaded from the cache again
+ c.config().setCacheLookupEnabled(true);
+ c.config().setFreedbLookupEnabled(false);
+ c.config().setMusicBrainzLookupEnabled(false);
+
+ c.lookup(list);
+
+ response = c.lookupResponse();
+ QVERIFY(response.count() > 0);
+
+ CDInfo cacheInfo(response.first());
+ QCOMPARE(i.get(Artist).toString(),cacheInfo.get(Artist).toString());
+ QCOMPARE(i.get(Title).toString(),cacheInfo.get(Title).toString());
+ QCOMPARE(i.get(Year).toInt(),cacheInfo.get(Year).toInt());
+ for (int j=0; j < 19; j++)
+ {
+ QCOMPARE(i.track(j).get(Title).toString(),cacheInfo.track(j).get(Title).toString());
+ QCOMPARE(i.track(j).get(Comment).toString(),cacheInfo.track(j).get(Comment).toString());
+ }
+}
+
+QTEST_KDEMAIN(MusicBrainzTestFullDate, NoGUI)
+
+#include "musicbrainztest-fulldate.moc"
--- /dev/null
+++ b/libkcddb/test/musicbrainztest-fulldate.h
@@ -0,0 +1,32 @@
+/*
+ Copyright (C) 2006 Richard Lärkäng <nouseforaname@home.se>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef MUSICBRAINZTESTFULLDATE_H
+#define MUSICBRAINZTESTFULLDATE_H
+
+#include <QObject>
+
+class MusicBrainzTestFullDate : public QObject
+{
+ Q_OBJECT
+ private slots:
+ void testLookup();
+};
+
+#endif
Attachment:
signature.asc
Description: This is a digitally signed message part.