File indexing completed on 2024-05-05 04:51:47

0001 /*
0002     SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl>
0003     SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "k3bmusicbrainztrackloopupjob.h"
0008 #include "k3btrm.h"
0009 #include "k3bmusicbrainz.h"
0010 #include "k3baudiotrack.h"
0011 #include "k3baudiotrackreader.h"
0012 
0013 #include <KLocalizedString>
0014 
0015 
0016 class K3b::MusicBrainzTrackLookupJob::Private
0017 {
0018 public:
0019     K3b::AudioTrack* track;
0020     K3b::TRM trm;
0021     K3b::MusicBrainz mb;
0022     int results;
0023 };
0024 
0025 
0026 K3b::MusicBrainzTrackLookupJob::MusicBrainzTrackLookupJob( K3b::JobHandler* hdl, QObject* parent )
0027     : K3b::ThreadJob( hdl, parent ),
0028       d( new Private() )
0029 {
0030     d->track = 0;
0031 }
0032 
0033 
0034 K3b::MusicBrainzTrackLookupJob::~MusicBrainzTrackLookupJob()
0035 {
0036     delete d;
0037 }
0038 
0039 
0040 void K3b::MusicBrainzTrackLookupJob::setAudioTrack( K3b::AudioTrack* track )
0041 {
0042     d->track = track;
0043 }
0044 
0045 
0046 int K3b::MusicBrainzTrackLookupJob::results()
0047 {
0048     return d->results;
0049 }
0050 
0051 
0052 QString K3b::MusicBrainzTrackLookupJob::title( int i ) const
0053 {
0054     return d->mb.title( i );
0055 }
0056 
0057 
0058 QString K3b::MusicBrainzTrackLookupJob::artist( int i ) const
0059 {
0060     return d->mb.artist( i );
0061 }
0062 
0063 
0064 bool K3b::MusicBrainzTrackLookupJob::run()
0065 {
0066     if ( !d->track ) {
0067         emit infoMessage( "Internal error: no track set. This is a bug!", MessageError );
0068         return false;
0069     }
0070 
0071     emit infoMessage( i18n("Generating fingerprint for track %1.",
0072                            d->track->trackNumber()), MessageInfo );
0073 
0074     AudioTrackReader trackReader( *d->track );
0075     d->trm.start( d->track->length() );
0076 
0077     char buffer[2352*10];
0078     qint64 len = 0;
0079     qint64 dataRead = 0;
0080     while( !canceled() &&
0081            (len = trackReader.read( buffer, sizeof(buffer) )) > 0 ) {
0082 
0083         dataRead += len;
0084 
0085         // swap data
0086         char buf;
0087         for( qint64 i = 0; i < len-1; i+=2 ) {
0088             buf = buffer[i];
0089             buffer[i] = buffer[i+1];
0090             buffer[i+1] = buf;
0091         }
0092 
0093         if( d->trm.generate( buffer, len ) ) {
0094             len = 0;
0095             break;
0096         }
0097 
0098         // FIXME: useless since libmusicbrainz does never need all the data
0099         emit percent( 100LL*dataRead/trackReader.size() );
0100     }
0101 
0102     if( canceled() ) {
0103         return false;
0104     }
0105     else if( len != 0 ||
0106              !d->trm.finalize() ) {
0107         return false;
0108     }
0109 
0110     emit infoMessage( i18n("Querying MusicBrainz for track %1.",
0111                            d->track->trackNumber()), MessageInfo );
0112 
0113     d->results = d->mb.query( d->trm.signature() );
0114     return( d->results > 0 );
0115 }
0116 
0117 #include "moc_k3bmusicbrainztrackloopupjob.cpp"