TrackReader::TrackReadResult TrackReader::loadTrackFile(const QUrl& url) { // TODO: store some kind of error message TrackReadResult parsedData; parsedData.track.url = url; parsedData.isValid = false; QFile file(url.toLocalFile()); if (!file.open(QFile::ReadOnly | QFile::Text)) { parsedData.loadError = i18n("Could not open: %1", file.errorString()); return parsedData; } if (file.size() == 0) { parsedData.loadError = i18n("File is empty."); return parsedData; } // TODO: load the file TrackReader trackReader(&parsedData); QXmlSimpleReader reader; reader.setContentHandler(&trackReader); reader.setErrorHandler(&trackReader); QXmlInputSource xmlInputSource(&file); // TODO: error handling parsedData.isValid = reader.parse(xmlInputSource); if (!parsedData.isValid) { parsedData.loadError = i18n("Parsing error: %1", trackReader.errorString()); return parsedData; } parsedData.isValid = !parsedData.track.points.isEmpty(); if (!parsedData.isValid) { if (!trackReader.d->verifyFoundGPXElement) { parsedData.loadError = i18n("No GPX element found - probably not a GPX file."); } else { parsedData.loadError = i18n("File is a GPX file, but no datapoints were found."); } return parsedData; } // the correlation algorithm relies on sorted data, therefore sort now qSort(parsedData.track.points.begin(), parsedData.track.points.end(), TrackManager::TrackPoint::EarlierThan); return parsedData; }
bool K3b::MusicBrainzTrackLookupJob::run() { if ( !d->track ) { emit infoMessage( "Internal error: no track set. This is a bug!", MessageError ); return false; } emit infoMessage( i18n("Generating fingerprint for track %1.", d->track->trackNumber()), MessageInfo ); AudioTrackReader trackReader( *d->track ); d->trm.start( d->track->length() ); char buffer[2352*10]; qint64 len = 0; qint64 dataRead = 0; while( !canceled() && (len = trackReader.read( buffer, sizeof(buffer) )) > 0 ) { dataRead += len; // swap data char buf; for( qint64 i = 0; i < len-1; i+=2 ) { buf = buffer[i]; buffer[i] = buffer[i+1]; buffer[i+1] = buf; } if( d->trm.generate( buffer, len ) ) { len = 0; break; } // FIXME: useless since libmusicbrainz does never need all the data emit percent( 100LL*dataRead/trackReader.size() ); } if( canceled() ) { return false; } else if( len != 0 || !d->trm.finalize() ) { return false; } emit infoMessage( i18n("Querying MusicBrainz for track %1.", d->track->trackNumber()), MessageInfo ); d->results = d->mb.query( d->trm.signature() ); return( d->results > 0 ); }