File indexing completed on 2024-04-28 04:45:51

0001 /****************************************************************************************
0002  * Copyright    (C) 2003-2005 Max Howell <max.howell@methylblue.com>                    *
0003  *              (C) 2003-2010 Mark Kretschmann <kretschmann@kde.org>                    *
0004  *              (C) 2005-2007 Alexandre Oliveira <aleprj@gmail.com>                     *
0005  *              (C) 2008 Dan Meltzer <parallelgrapefruit@gmail.com>                     *
0006  *              (C) 2008-2009 Jeff Mitchell <mitchell@kde.org>                          *
0007  *              (C) 2010 Ralf Engels <ralf-engels@gmx.de>                               *
0008  *              (c) 2010 Sergey Ivanov <123kash@gmail.com>                              *
0009  *                                                                                      *
0010  * This program is free software; you can redistribute it and/or modify it under        *
0011  * the terms of the GNU General Public License as published by the Free Software        *
0012  * Foundation; either version 2 of the License, or (at your option) any later           *
0013  * version.                                                                             *
0014  *                                                                                      *
0015  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
0016  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
0017  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
0018  *                                                                                      *
0019  * You should have received a copy of the GNU General Public License along with         *
0020  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
0021  ****************************************************************************************/
0022 
0023 #include "APETagHelper.h"
0024 
0025 #include "StringHelper.h"
0026 
0027 using namespace Meta::Tag;
0028 
0029 APETagHelper::APETagHelper( TagLib::Tag *tag, TagLib::APE::Tag *apeTag, Amarok::FileType fileType )
0030             : TagHelper( tag, fileType )
0031             , m_tag( apeTag )
0032 {
0033     m_fieldMap.insert( Meta::valAlbumArtist, TagLib::String( "ALBUM ARTIST" ) );
0034     m_fieldMap.insert( Meta::valBpm,         TagLib::String( "BPM" ) );
0035     m_fieldMap.insert( Meta::valCompilation, TagLib::String( "COMPILATION" ) );
0036     m_fieldMap.insert( Meta::valComposer,    TagLib::String( "Composer" ) );
0037     m_fieldMap.insert( Meta::valDiscNr,      TagLib::String( "DISC" ) );
0038     m_fieldMap.insert( Meta::valPlaycount,   TagLib::String( "FMPS_PLAYCOUNT" ) );
0039     m_fieldMap.insert( Meta::valRating,      TagLib::String( "FMPS_RATING" ) );
0040     m_fieldMap.insert( Meta::valScore,       TagLib::String( "FMPS_RATING_AMAROK_SCORE" ) );
0041     m_fieldMap.insert( Meta::valLyrics,      TagLib::String( "UNSYNCED LYRICS" ) );
0042 
0043     m_uidFieldMap.insert( UIDAFT,            TagLib::String( "Amarok 2 AFTv1 - amarok.kde.org" ) );
0044 }
0045 
0046 Meta::FieldHash
0047 APETagHelper::tags() const
0048 {
0049     Meta::FieldHash data = TagHelper::tags();
0050 
0051     TagLib::APE::ItemListMap map =  m_tag->itemListMap();
0052     for( TagLib::APE::ItemListMap::ConstIterator it = map.begin(); it != map.end(); ++it )
0053     {
0054         qint64 field;
0055         QString value = TStringToQString( it->second.toString() );
0056         if( ( field = fieldName( it->first ) ) )
0057         {
0058             if( field == Meta::valRating )
0059                 data.insert( field, qRound( value.toFloat() * 10.0 ) );
0060             else if( field == Meta::valScore )
0061                 data.insert( field, value.toFloat() * 100.0 );
0062             else if( field == Meta::valDiscNr ) {
0063                 int disc;
0064                 disc = splitDiscNr( value ).first;
0065                 data.insert( field, disc );
0066             }
0067             else
0068                 data.insert( field, value );
0069         }
0070         else if( it->first == uidFieldName( UIDAFT ) && isValidUID( value, UIDAFT ) )
0071             data.insert( Meta::valUniqueId, value );
0072     }
0073 
0074     return data;
0075 }
0076 
0077 bool
0078 APETagHelper::setTags( const Meta::FieldHash &changes )
0079 {
0080     bool modified = TagHelper::setTags( changes );
0081 
0082     foreach( const qint64 key, changes.keys() )
0083     {
0084         QVariant value = changes.value( key );
0085         TagLib::String field = fieldName( key );
0086 
0087         if( !field.isNull() && !field.isEmpty() )
0088         {
0089             if( key == Meta::valRating )
0090                 m_tag->addValue( field, Qt4QStringToTString( QString::number( value.toFloat() / 10.0 ) ) );
0091             else if( key == Meta::valScore )
0092                 m_tag->addValue( field, Qt4QStringToTString( QString::number( value.toFloat() / 100.0 ) ) );
0093             else
0094                 m_tag->addValue( field, Qt4QStringToTString( value.toString() ) );
0095 
0096             modified = true;
0097         }
0098         else if( key == Meta::valUniqueId )
0099         {
0100             QPair < UIDType, QString > uidPair = splitUID( value.toString() );
0101             if( uidPair.first == UIDInvalid )
0102                 continue;
0103 
0104             m_tag->addValue( uidFieldName( uidPair.first ), Qt4QStringToTString( uidPair.second ) );
0105             modified = true;
0106         }
0107     }
0108 
0109     return modified;
0110 }
0111 
0112 TagLib::ByteVector
0113 APETagHelper::render() const
0114 {
0115     return m_tag->render();
0116 }