[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: Re: [plasma-mediacenter] plugins: Add a basic Filesystem media source which is supposed to be very s
From: Vishesh Handa <me () vhanda ! in>
Date: 2014-03-30 11:22:16
Message-ID: 13183610.CqkrkkNGjp () vlap
[Download RAW message or body]
On Sunday, March 30, 2014 08:38:27 AM Shantanu Tushar wrote:
> Git commit c140e2382a56c4bfde2fe99b2fdaf19897424e88 by Shantanu Tushar.
> Committed on 30/03/2014 at 08:38.
> Pushed by shantanu into branch 'master'.
>
> Add a basic Filesystem media source which is supposed to be very simple and
> only scan the home dir. CMake output makes it clear that this is a limited
> source and should only be used when Baloo and Nepomuk can't be installed.
>
You may want to follow the standard commit format.
http://techbase.kde.org/Development/Git/Configuration#Commit_Template
> M +20 -7 plugins/CMakeLists.txt
> A +16 -0 plugins/filesystemsearch/CMakeLists.txt
> A +14 -0 plugins/filesystemsearch/filesystemsearch.desktop
> A +108 -0 plugins/filesystemsearch/filesystemsearchmediasource.cpp
> [License: LGPL (v2.1+)] A +57 -0
> plugins/filesystemsearch/filesystemsearchmediasource.h [License: LGPL
> (v2.1+)]
>
> http://commits.kde.org/plasma-mediacenter/c140e2382a56c4bfde2fe99b2fdaf19897
> 424e88
>
> diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
> index 7f89498..7458861 100644
> --- a/plugins/CMakeLists.txt
> +++ b/plugins/CMakeLists.txt
> @@ -1,11 +1,24 @@
> -find_package(NepomukCore)
> -if(NepomukCore_FOUND)
> - message(STATUS "********** Found Nepomuk, building Nepomuk Search
> plugin") - add_subdirectory(kdedesktopsearch)
> -endif(NepomukCore_FOUND)
> -
> -find_package(Baloo)
> +find_package(Baloo QUIET)
> if(Baloo_FOUND)
> message(STATUS "********** Found Baloo, building Baloo Search plugin")
> add_subdirectory(baloosearch)
> +else(Baloo_FOUND)
> + find_package(NepomukCore QUIET)
> +
> + if(NepomukCore_FOUND)
> + message(STATUS "********** Found Nepomuk, building Nepomuk Search
> plugin") + add_subdirectory(kdedesktopsearch)
> + else(NepomukCore_FOUND)
> + message(STATUS "********** Neither Baloo nor Nepomuk was found,
> install one of them to get more functionality") +
> + if(USE_FILESYSTEM_MEDIA_SOURCE)
> + message(STATUS "********** Building the limited Filesystem
> Search plugin") + add_subdirectory(filesystemsearch)
> + else(USE_FILESYSTEM_MEDIA_SOURCE)
> + message(STATUS "********** Because of this, no media sources
> are being built. Only local browsing will be available") +
> message(STATUS "********** If you not on KDE or cannot install Baloo or
> Nepomuk, set USE_FILESYSTEM_MEDIA_SOURCE=ON to cmake to build the limited
> Filesystem Search plugin") + endif(USE_FILESYSTEM_MEDIA_SOURCE)
> +
> + endif(NepomukCore_FOUND)
> +
> endif(Baloo_FOUND)
> diff --git a/plugins/filesystemsearch/CMakeLists.txt
> b/plugins/filesystemsearch/CMakeLists.txt new file mode 100644
> index 0000000..e6c6b6b
> --- /dev/null
> +++ b/plugins/filesystemsearch/CMakeLists.txt
> @@ -0,0 +1,16 @@
> +set(filesystemsearch_SRCS
> + filesystemsearchmediasource.cpp
> +)
> +
> +qt4_automoc(${filesystemsearch_SRCS})
> +
> +kde4_add_plugin(pmc_filesystemsearch ${filesystemsearch_SRCS})
> +
> +target_link_libraries(pmc_filesystemsearch
> + plasmamediacenter
> + ${KDE4_KDECORE_LIBS}
> + ${QT_QTGUI_LIBRARIES}
> +)
> +
> +install(TARGETS pmc_filesystemsearch DESTINATION ${PLUGIN_INSTALL_DIR})
> +install(FILES filesystemsearch.desktop DESTINATION ${SERVICES_INSTALL_DIR})
> diff --git a/plugins/filesystemsearch/filesystemsearch.desktop
> b/plugins/filesystemsearch/filesystemsearch.desktop new file mode 100644
> index 0000000..f1c63e5
> --- /dev/null
> +++ b/plugins/filesystemsearch/filesystemsearch.desktop
> @@ -0,0 +1,14 @@
> +[Desktop Entry]
> +Type=Service
> +Icon=drive-harddisk
> +Name=Filesystem Search
> +Comment=Get media from your local files
> +
> +X-KDE-ServiceTypes=Plasma/MediaCenter/MediaSource
> +
> +X-KDE-PluginInfo-Author=Shantanu Tushar
> +X-KDE-PluginInfo-Email=shantanu@kde.org
> +X-KDE-PluginInfo-Version=1.0
> +X-KDE-PluginInfo-License=GPL
> +X-KDE-PluginInfo-EnabledByDefault=true
> +X-KDE-Library=pmc_filesystemsearch
> diff --git a/plugins/filesystemsearch/filesystemsearchmediasource.cpp
> b/plugins/filesystemsearch/filesystemsearchmediasource.cpp new file mode
> 100644
> index 0000000..44ba844
> --- /dev/null
> +++ b/plugins/filesystemsearch/filesystemsearchmediasource.cpp
> @@ -0,0 +1,108 @@
> +/**************************************************************************
> ********* + * Copyright 2014 Shantanu Tushar <shantanu@kde.org>
> * + *
> * + * This library is free software; you can
> redistribute it and/or * + * modify it under the terms of
> the GNU Lesser General Public * + * License as
> published by the Free Software Foundation; either * + *
> version 2.1 of the License, or (at your option) any later version.
> * + *
> * + * This library is distributed in the hope that it will be
> useful, * + * but WITHOUT ANY WARRANTY; without even the
> implied warranty of * + * MERCHANTABILITY or FITNESS FOR A
> PARTICULAR PURPOSE. See the GNU * + * Lesser General Public
> License for more details. * + *
> * + *
> You should have received a copy of the GNU Lesser General Public
> * + * License along with this library. If not, see
> <http://www.gnu.org/licenses/>. * +
> ***************************************************************************
> ********/ +
> +#include "filesystemsearchmediasource.h"
> +
> +#include <mediacenter/singletonfactory.h>
> +#include <mediacenter/medialibrary.h>
> +#include <mediacenter/mediacenter.h>
> +
> +#include <KMimeType>
> +
> +#include <QDir>
> +#include <QDebug>
> +
> +MEDIACENTER_EXPORT_MEDIASOURCE(FilesystemSearchMediaSource)
> +
> +FilesystemSearchMediaSource::FilesystemSearchMediaSource(QObject* parent,
> const QVariantList&) + : m_quit(false)
> +{
> + m_allowedMimes << "audio" << "image" << "video";
> +}
> +
> +FilesystemSearchMediaSource::~FilesystemSearchMediaSource()
> +{
> + qDebug() << "Waiting for Filesystem Search to quit...";
> + stop();
> + wait();
> +}
> +
> +void FilesystemSearchMediaSource::run()
> +{
> + setPriority(IdlePriority);
> + recursiveSearch(QDir::home());
> + qDebug() << "Done scanning the Filesystem";
> +}
> +
> +bool FilesystemSearchMediaSource::recursiveSearch(const QDir &dir)
> +{
> + if (shouldQuit()) return false;
Coding style? There is similar stuff all over.
> +
> + foreach(const QFileInfo &fileInfo, dir.entryInfoList(QDir::Files)) {
> + if (shouldQuit()) return false;
> + checkAndAddFile(fileInfo);
> + }
> +
> + foreach(const QFileInfo &dirInfo, dir.entryInfoList(QDir::Dirs |
> QDir::NoDotAndDotDot)) { + if (shouldQuit()) return false;
> + if (!recursiveSearch(QDir(dirInfo.absoluteFilePath()))) {
> + break;
> + }
> + }
> +
> + return true;
> +}
oh boy. This is going to take quite some time.
> +
> +bool FilesystemSearchMediaSource::shouldQuit() const
> +{
> + QMutexLocker l(&m_quitMutex);
> + return m_quit;
> +}
> +
> +void FilesystemSearchMediaSource::stop()
> +{
> + QMutexLocker l(&m_quitMutex);
> + m_quit = true;
> +}
If you want you can also use a QAtomicInt instead of the bool + mutex.
> +
> +bool FilesystemSearchMediaSource::checkAndAddFile(const QFileInfo&
> fileInfo) +{
> + const QString mimeType = KMimeType::findByUrl(
> + KUrl::fromLocalFile(fileInfo.absoluteFilePath()))->name();
> +
Warning: This will cause very high io usage since it is looking into the file
to determine the mimetype. And considering that you're doing this for every
file in $HOME ...
> + const QString topLevelTypeName = mimeType.split("/").at(0);
> +
> + if (!topLevelTypeName.isEmpty() &&
> m_allowedMimes.contains(topLevelTypeName)) { + addFile(fileInfo,
> topLevelTypeName);
> + return true;
> + }
> +
> + return false;
> +}
> +
> +void FilesystemSearchMediaSource::addFile(const QFileInfo& fileInfo,
> + const QString &type)
> +{
> + qDebug() << "Adding " << type << fileInfo.fileName();
> + QHash<int, QVariant> values;
> +
> + values.insert(Qt::DisplayRole, fileInfo.fileName());
> + values.insert(MediaCenter::MediaUrlRole,
> QUrl::fromLocalFile(fileInfo.absoluteFilePath()).toString()); +
> values.insert(MediaCenter::MediaTypeRole, type);
> +
> + SingletonFactory::instanceFor<MediaLibrary>()->updateMedia(values);
> +}
> diff --git a/plugins/filesystemsearch/filesystemsearchmediasource.h
> b/plugins/filesystemsearch/filesystemsearchmediasource.h new file mode
> 100644
> index 0000000..88740b8
> --- /dev/null
> +++ b/plugins/filesystemsearch/filesystemsearchmediasource.h
> @@ -0,0 +1,57 @@
> +/**************************************************************************
> ********* + * Copyright 2014 Shantanu Tushar <shantanu@kde.org>
> * + *
> * + * This library is free software; you can
> redistribute it and/or * + * modify it under the terms of
> the GNU Lesser General Public * + * License as
> published by the Free Software Foundation; either * + *
> version 2.1 of the License, or (at your option) any later version.
> * + *
> * + * This library is distributed in the hope that it will be
> useful, * + * but WITHOUT ANY WARRANTY; without even the
> implied warranty of * + * MERCHANTABILITY or FITNESS FOR A
> PARTICULAR PURPOSE. See the GNU * + * Lesser General Public
> License for more details. * + *
> * + *
> You should have received a copy of the GNU Lesser General Public
> * + * License along with this library. If not, see
> <http://www.gnu.org/licenses/>. * +
> ***************************************************************************
> ********/ +
> +#ifndef FILESYSTEMSEARCHMEDIASOURCE_H
> +#define FILESYSTEMSEARCHMEDIASOURCE_H
> +
> +#include <mediacenter/abstractmediasource.h>
> +
> +#include <QMutex>
> +
> +class QFileInfo;
> +class QDir;
> +
> +/**
> + * \brief Goes through the user's home dir and searches for media
> + *
> + * This MediaSource is supposed to be used for a better-than-nothing
> scenario + * when none of Baloo or Nepomuk are installed. As such this
> MediaSource does + * not attempt 100% correctness and is not configurable
> at all.
> + */
> +class FilesystemSearchMediaSource : public MediaCenter::AbstractMediaSource
> +{
> +public:
> + explicit FilesystemSearchMediaSource(QObject* parent = 0, const
> QVariantList& = QVariantList()); + virtual
> ~FilesystemSearchMediaSource();
> +
> +protected:
> + virtual void run();
> +
> +private:
> + mutable QMutex m_quitMutex;
> + bool m_quit;
> +
> + QStringList m_allowedMimes;
> +
> + bool shouldQuit() const;
> + bool recursiveSearch(const QDir& dir);
> + void stop();
> + bool checkAndAddFile(const QFileInfo &fileInfo);
> + void addFile(const QFileInfo &fileInfo, const QString &type);
> +};
> +
> +#endif // FILESYSTEMSEARCHMEDIASOURCE_H
--
Vishesh Handa
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic