diff --git a/src/libtomahawk/filemetadata/MetadataEditor.cpp b/src/libtomahawk/filemetadata/MetadataEditor.cpp index f05971e90..963323112 100644 --- a/src/libtomahawk/filemetadata/MetadataEditor.cpp +++ b/src/libtomahawk/filemetadata/MetadataEditor.cpp @@ -42,6 +42,7 @@ #include <QDialogButtonBox> #include <QFileInfo> #include <QFile> +#include <QMessageBox> MetadataEditor::MetadataEditor( const Tomahawk::query_ptr& query, const Tomahawk::playlistinterface_ptr& plInterface, QWidget* parent ) @@ -85,9 +86,12 @@ MetadataEditor::init( const Tomahawk::playlistinterface_ptr& plInterface ) void MetadataEditor::writeMetadata( bool closeDlg ) { + bool failed = false; + QFileInfo fi; + if ( m_result ) { - QFileInfo fi( QUrl( m_result->url() ).toLocalFile() ); + fi = QFileInfo( QUrl( m_result->url() ).toLocalFile() ); bool changed = false; QByteArray fileName = QFile::encodeName( fi.canonicalFilePath() ); @@ -99,77 +103,88 @@ MetadataEditor::writeMetadata( bool closeDlg ) TagLib::FileRef f( encodedName ); QSharedPointer<Tomahawk::Tag> tag( Tomahawk::Tag::fromFile( f ) ); - - if ( title() != m_result->track()->track() ) + if ( !tag ) { - tDebug() << Q_FUNC_INFO << "Track changed" << title() << m_result->track(); - - tag->setTitle( title() ); - m_result->track()->setTrack( title() ); - - changed = true; + failed = true; } - - Tomahawk::artist_ptr newArtist = Tomahawk::Artist::get( artist(), true ); - if ( newArtist != m_result->track()->artistPtr() ) + else { - tDebug() << Q_FUNC_INFO << "Artist changed" << artist() << m_result->track()->artist(); - - tag->setArtist( artist() ); - m_result->track()->setArtist( artist() ); - - changed = true; - } - - Tomahawk::album_ptr newAlbum = Tomahawk::Album::get( newArtist, album(), true ); - if ( newAlbum != m_result->track()->albumPtr() ) - { - tDebug() << Q_FUNC_INFO << "Album changed" << album() << newAlbum->id() << m_result->track()->album() << m_result->track()->albumPtr()->id() << newAlbum.data() << m_result->track()->albumPtr().data(); - if ( newAlbum->id() != m_result->track()->albumPtr()->id() ) + if ( title() != m_result->track()->track() ) { - tag->setAlbum( album() ); - m_result->track()->setAlbum( album() ); + tDebug() << Q_FUNC_INFO << "Track changed" << title() << m_result->track(); + tag->setTitle( title() ); changed = true; } - } - // FIXME: Ugly workaround for the min value of 0 - if ( albumPos() != 0 && albumPos() != (int)m_result->track()->albumpos() ) - { - tag->setTrack( albumPos() ); - m_result->track()->setAlbumPos( albumPos() ); - - tDebug() << Q_FUNC_INFO << "Albumpos changed"; - changed = true; - } - - // FIXME: Ugly workaround for the min value of 1900 - if ( year() != 1900 && year() != m_result->track()->year() ) - { - tag->setYear( year() ); + Tomahawk::artist_ptr newArtist = Tomahawk::Artist::get( artist(), true ); + if ( newArtist != m_result->track()->artistPtr() ) { - QVariantMap attr = m_result->track()->attributes(); - attr[ "releaseyear" ] = year(); - m_result->track()->setAttributes( attr ); + tDebug() << Q_FUNC_INFO << "Artist changed" << artist() << m_result->track()->artist(); + + tag->setArtist( artist() ); + changed = true; } - tDebug() << Q_FUNC_INFO << "Year changed"; - changed = true; - } + Tomahawk::album_ptr newAlbum = Tomahawk::Album::get( newArtist, album(), true ); + if ( newAlbum != m_result->track()->albumPtr() ) + { + tDebug() << Q_FUNC_INFO << "Album changed" << album() << newAlbum->id() << m_result->track()->album() << m_result->track()->albumPtr()->id() << newAlbum.data() << m_result->track()->albumPtr().data(); + if ( newAlbum->id() != m_result->track()->albumPtr()->id() ) + { + tag->setAlbum( album() ); + changed = true; + } + } - if ( changed ) - { - f.save(); + // FIXME: Ugly workaround for the min value of 0 + if ( albumPos() != 0 && albumPos() != (int)m_result->track()->albumpos() ) + { + tag->setTrack( albumPos() ); - m_editFiles.append( fileName ); - m_result->doneEditing(); + tDebug() << Q_FUNC_INFO << "Albumpos changed"; + changed = true; + } - tDebug() << Q_FUNC_INFO << m_result->toString() << m_result->track()->toString(); + // FIXME: Ugly workaround for the min value of 1900 + if ( year() != 1900 && year() != m_result->track()->year() ) + { + tag->setYear( year() ); + + tDebug() << Q_FUNC_INFO << "Year changed"; + changed = true; + } + + if ( changed ) + { + if ( f.save() ) + { + m_result->track()->setTrack( title() ); + m_result->track()->setArtist( artist() ); + m_result->track()->setAlbum( album() ); + m_result->track()->setAlbumPos( albumPos() ); + { + QVariantMap attr = m_result->track()->attributes(); + attr[ "releaseyear" ] = year(); + m_result->track()->setAttributes( attr ); + } + + m_editFiles.append( fileName ); + m_result->doneEditing(); + + tDebug() << Q_FUNC_INFO << m_result->toString() << m_result->track()->toString(); + } + else + failed = true; + } } } - if ( closeDlg ) + if ( failed ) + { + QMessageBox::critical( 0, tr( "Error" ), tr( "Could not write tags to file:\n%1" ).arg( fi.canonicalFilePath() ) ); + } + else if ( closeDlg ) { if ( m_editFiles.count() ) ScanManager::instance()->runFileScan( m_editFiles, false ); diff --git a/src/libtomahawk/filemetadata/MusicScanner.cpp b/src/libtomahawk/filemetadata/MusicScanner.cpp index 2dc32dc0a..6b86ecc2a 100644 --- a/src/libtomahawk/filemetadata/MusicScanner.cpp +++ b/src/libtomahawk/filemetadata/MusicScanner.cpp @@ -408,6 +408,9 @@ MusicScanner::readTags( const QFileInfo& fi ) int bitrate = 0; int duration = 0; QSharedPointer<Tag> tag( Tag::fromFile( f ) ); + if ( !tag ) + return QVariantMap(); + if ( f.audioProperties() ) { TagLib::AudioProperties *properties = f.audioProperties(); @@ -415,18 +418,14 @@ MusicScanner::readTags( const QFileInfo& fi ) bitrate = properties->bitrate(); } - QString artist, album, track; - if ( tag ) - { - artist = tag->artist().trimmed(); - album = tag->album().trimmed(); - track = tag->title().trimmed(); - } - if ( !tag || artist.isEmpty() || track.isEmpty() ) + const QString artist = tag->artist().trimmed(); + const QString album = tag->album().trimmed(); + const QString track = tag->title().trimmed(); + if ( artist.isEmpty() || track.isEmpty() ) return QVariantMap(); - QString mimetype = TomahawkUtils::extensionToMimetype( suffix ); - QString url( "file://%1" ); + const QString mimetype = TomahawkUtils::extensionToMimetype( suffix ); + const QString url( "file://%1" ); QVariantMap m; m["url"] = url.arg( fi.canonicalFilePath() );