Blame SOURCES/0003-Fixed-indexing-of-m3u-files.patch

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