From ee49b5e1a8065ae7823c1ee091ace2e7741059e9 Mon Sep 17 00:00:00 2001 From: Sebastian Trueg Date: Mon, 13 Feb 2012 09:20:47 +0100 Subject: [PATCH 3/8] Fixed indexing of m3u files. The analyzer now constructs absolute paths to the containing files and creates nie:links relations to them. nie:hasLogicalPart does not make much sense since the audio files are not actually contained in the playlist, they are just referenced. NFO specifies the usage of rdf:list. However, that is not supported in Nepomuk at the moment. Thus, we cannot put any order on the linked audio files yet. REVIEW: 103961 --- lib/lineanalyzers/m3ustreamanalyzer.cpp | 33 ++++++++++++++++++++++++++----- lib/lineanalyzers/m3ustreamanalyzer.h | 4 ++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/lineanalyzers/m3ustreamanalyzer.cpp b/lib/lineanalyzers/m3ustreamanalyzer.cpp index dacc15a..c20b28a 100644 --- a/lib/lineanalyzers/m3ustreamanalyzer.cpp +++ b/lib/lineanalyzers/m3ustreamanalyzer.cpp @@ -26,13 +26,16 @@ #include #include +#include +#include + // AnalyzerFactory void M3uLineAnalyzerFactory::registerFields(Strigi::FieldRegister& reg) { // track list length is easily obtained via API // tracksField = reg.registerField(); trackPathField = reg.registerField( - "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#hasLogicalPart"); + "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#links"); m3uTypeField = reg.registerField( "http://freedesktop.org/standards/xesam/1.0/core#formatSubtype"); typeField = reg.typeField; @@ -43,7 +46,7 @@ void M3uLineAnalyzerFactory::registerFields(Strigi::FieldRegister& reg) } // Analyzer -void M3uLineAnalyzer::startAnalysis(Strigi::AnalysisResult* i) +void M3uLineAnalyzer::startAnalysis(Strigi::AnalysisResult* i) { extensionOk = i->extension() == "m3u" || i->extension() == "M3U"; @@ -52,7 +55,24 @@ void M3uLineAnalyzer::startAnalysis(Strigi::AnalysisResult* i) count = 0; } -void M3uLineAnalyzer::handleLine(const char* data, uint32_t length) +std::string M3uLineAnalyzer::constructAbsolutePath(const std::string &relative) const +{ + if(char* buf = realpath(analysisResult->path().c_str(), 0)) { +#ifdef _WIN32 + static const char s_pathSeparator = '\\'; +#else + static const char s_pathSeparator = '/'; +#endif + std::string path(buf); + free(buf); + return path.substr(0, path.rfind(s_pathSeparator)+1) + relative; + } + else { + return std::string(); + } +} + +void M3uLineAnalyzer::handleLine(const char* data, uint32_t length) { if (!extensionOk) return; @@ -68,8 +88,11 @@ void M3uLineAnalyzer::handleLine(const char* data, uint32_t length) //if (line == 1) // analysisResult->addValue(factory->m3uTypeField, "simple"); - // TODO: Check for a valid url with QUrl - analysisResult->addValue(factory->trackPathField, std::string(data, length)); + // we create absolute paths and drop links to non-existing files + const std::string path = constructAbsolutePath(std::string(data, length)); + if(!access(path.c_str(), F_OK)) { + analysisResult->addValue(factory->trackPathField, path); + } ++count; } else if (line == 1 && strncmp(data, "#EXTM3U", 7) == 0) { diff --git a/lib/lineanalyzers/m3ustreamanalyzer.h b/lib/lineanalyzers/m3ustreamanalyzer.h index 461def3..9033f14 100644 --- a/lib/lineanalyzers/m3ustreamanalyzer.h +++ b/lib/lineanalyzers/m3ustreamanalyzer.h @@ -26,6 +26,8 @@ #include #include +#include + class M3uLineAnalyzerFactory; class M3uLineAnalyzer : public Strigi::StreamLineAnalyzer @@ -37,6 +39,8 @@ private: bool extensionOk; int32_t count; + std::string constructAbsolutePath(const std::string& relative) const; + public: M3uLineAnalyzer(const M3uLineAnalyzerFactory* f) : factory(f) {} ~M3uLineAnalyzer() {} -- 1.7.10.4