fixed: reimplementing Latin1StringHandler.parse() to get non-ISO-8859-1 tags correctly
authortaxigps <taxigps@sina.com>
Tue, 27 Nov 2012 15:40:52 +0000 (23:40 +0800)
committertaxigps <taxigps@sina.com>
Tue, 27 Nov 2012 15:40:52 +0000 (23:40 +0800)
xbmc/music/tags/TagLoaderTagLib.cpp

index 5e9ce9f..48dcd4d 100644 (file)
 #include "utils/URIUtils.h"
 #include "utils/log.h"
 #include "utils/StringUtils.h"
+#include "utils/CharsetConverter.h"
 #include "settings/AdvancedSettings.h"
 
 using namespace std;
 using namespace TagLib;
 using namespace MUSIC_INFO;
 
+class TagStringHandler : public ID3v2::Latin1StringHandler
+{
+public:
+  TagStringHandler() {}
+  virtual ~TagStringHandler() {}
+  virtual String parse(const ByteVector &data) const
+  {
+    CStdString strSource(data.data(), data.size());
+    CStdString strUTF8;
+    g_charsetConverter.unknownToUTF8(strSource, strUTF8);
+    return String(strUTF8, String::UTF8);
+  }
+};
+
+static const TagStringHandler StringHandler;
+
 CTagLoaderTagLib::CTagLoaderTagLib()
 {
 }
@@ -84,6 +101,7 @@ bool CTagLoaderTagLib::Load(const string& strFileName, CMusicInfoTag& tag, Embed
     return false;
   }
   
+  ID3v2::Tag::setLatin1StringHandler(&StringHandler);
   TagLib::File*              file = NULL;
   TagLib::APE::File*         apeFile = NULL;
   TagLib::ASF::File*         asfFile = NULL;