File indexing completed on 2024-05-19 08:42:52
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"