From 902326bf2aac6f728b2e850441de9eab4460d5b3 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 10 Feb 2011 11:18:59 +0100 Subject: [PATCH] * Added support for complex filenames with Taglib. --- CMakeLists.txt | 4 +++- CMakeModules/CheckTagLibFileName.cmake | 15 +++++++++++++++ src/libtomahawk/result.h | 4 ++-- src/musicscanner.cpp | 9 ++++++++- 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 CMakeModules/CheckTagLibFileName.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ca62025a..d0db60c62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,9 @@ ELSE() ENDIF() FIND_PACKAGE( Taglib 1.6.0 REQUIRED ) +include( CheckTagLibFileName ) +check_taglib_filename( COMPLEX_TAGLIB_FILENAME ) + FIND_PACKAGE( LibLastFm 0.3.3 REQUIRED ) FIND_PACKAGE( LibEchonest 1.1.1 REQUIRED ) FIND_PACKAGE( CLucene REQUIRED ) @@ -29,4 +32,3 @@ ADD_SUBDIRECTORY( libportfwd ) ADD_SUBDIRECTORY( qxt ) ADD_SUBDIRECTORY( src/libtomahawk ) ADD_SUBDIRECTORY( src ) - diff --git a/CMakeModules/CheckTagLibFileName.cmake b/CMakeModules/CheckTagLibFileName.cmake new file mode 100644 index 000000000..e5b3706c9 --- /dev/null +++ b/CMakeModules/CheckTagLibFileName.cmake @@ -0,0 +1,15 @@ +# taglib changed filenames to be a char/wchar struct on some platforms, need to check for it +macro (CHECK_TAGLIB_FILENAME TAGLIB_FILENAME_COMPLEX) + include (CheckCXXSourceCompiles) + set (CMAKE_REQUIRED_FLAGS ${TAGLIB_CFLAGS}) + set (CMAKE_REQUIRED_INCLUDES ${TAGLIB_INCLUDES}) + set (CMAKE_REQUIRED_LIBRARIES ${TAGLIB_LIBRARIES}) + check_cxx_source_compiles( + "#include + int main() + { + TagLib::FileName fileName1(\"char\"); + TagLib::FileName fileName2(L\"wchar\"); + return 0; + }" ${TAGLIB_FILENAME_COMPLEX}) +endmacro (CHECK_TAGLIB_FILENAME) diff --git a/src/libtomahawk/result.h b/src/libtomahawk/result.h index ff764d2a2..1c15ab165 100644 --- a/src/libtomahawk/result.h +++ b/src/libtomahawk/result.h @@ -1,6 +1,6 @@ - #ifndef RESULT_H #define RESULT_H + #include #include @@ -18,7 +18,7 @@ class DLLEXPORT Result : public QObject Q_OBJECT public: - Result(); + Result(); explicit Result( const QVariant& v, const collection_ptr& collection ); virtual ~Result(); diff --git a/src/musicscanner.cpp b/src/musicscanner.cpp index 4e8b5ced8..2fa64f5d6 100644 --- a/src/musicscanner.cpp +++ b/src/musicscanner.cpp @@ -160,7 +160,14 @@ MusicScanner::readFile( const QFileInfo& fi ) if( m_scanned % 100 == 0 ) qDebug() << "SCAN" << m_scanned << fi.absoluteFilePath(); - TagLib::FileRef f( fi.absoluteFilePath().toUtf8().constData() ); + #ifdef COMPLEX_TAGLIB_FILENAME + const wchar_t *encodedName = reinterpret_cast< const wchar_t *>(fi.absoluteFilePath().utf16()); + #else + QByteArray fileName = QFile::encodeName( fi.absoluteFilePath() ); + const char *encodedName = fileName.constData(); + #endif + + TagLib::FileRef f( encodedName ); if ( f.isNull() || !f.tag() ) { // qDebug() << "Doesn't seem to be a valid audiofile:" << fi.absoluteFilePath();