summaryrefslogtreecommitdiff
path: root/libs/mediaScan/src/FSMediaScanner.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/mediaScan/src/FSMediaScanner.cc')
-rw-r--r--libs/mediaScan/src/FSMediaScanner.cc111
1 files changed, 111 insertions, 0 deletions
diff --git a/libs/mediaScan/src/FSMediaScanner.cc b/libs/mediaScan/src/FSMediaScanner.cc
new file mode 100644
index 0000000..f4ac14e
--- /dev/null
+++ b/libs/mediaScan/src/FSMediaScanner.cc
@@ -0,0 +1,111 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: FSMediaScanner.cc
+ * Created: 2. Juli 2012, 13
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * Project: libfsScan: mediatypes and filesystem scanning
+ *
+ * CMP - compound media player
+ *
+ * is a client/server mediaplayer intended to play any media from any workstation
+ * without the need to export or mount shares. cmps is an easy to use backend
+ * with a (ready to use) HTML-interface. Additionally the backend supports
+ * authentication via HTTP-digest authorization.
+ * cmpc is a client with vdr-like osd-menues.
+ *
+ * Copyright (c) 2012 Reinhard Mantey, some rights reserved!
+ * published under Creative Commons by-sa
+ * For details see http://creativecommons.org/licenses/by-sa/3.0/
+ *
+ * The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
+ *
+ * --------------------------------------------------------------
+ */
+#include <FSMediaScanner.h>
+#include <AbstractMedia.h>
+#include <Logging.h>
+#include <stddef.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/dir.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <errno.h>
+#include <util.h>
+
+void freeMediaCallback(void *elem)
+{
+ delete (cAbstractMedia *)elem;
+}
+
+cFSMediaScanner::cFSMediaScanner()
+ : fileBufSize(512)
+ , pool(freeMediaCallback)
+ , mediaFactory(NULL)
+{
+}
+
+cFSMediaScanner::~cFSMediaScanner()
+{
+ pool.clear();
+ if (mediaFactory) delete mediaFactory;
+}
+
+void cFSMediaScanner::SetMediaFactory(cMediaFactory* factory)
+{
+ mediaFactory = factory;
+}
+
+// return true if "a" should be ordered before "b"
+bool defaultMediaSortOrder(void *a, void *b)
+{
+ if (a == b) return false;
+ if (!a) return false;
+ if (!b) return true;
+ cAbstractMedia *m0 = (cAbstractMedia *)a;
+ cAbstractMedia *m1 = (cAbstractMedia *)b;
+ bool rv = false;
+
+ if (m0->MediaType() == m1->MediaType())
+ rv = strcasecmp(m0->Name(), m1->Name()) < 0;
+ else
+ rv = (m0->MediaType() - m1->MediaType()) < 0;
+
+ return rv;
+}
+
+void cFSMediaScanner::Refresh()
+{
+ if (!mediaFactory) return;
+ pool.clear();
+ categories.clear();
+
+ mediaFactory->Scan4Media(pool);
+ cAbstractMedia::SupportedMediaType ot = cAbstractMedia::Invalid;
+ cAbstractMedia *m;
+
+ pool.sort(defaultMediaSortOrder);
+ for (size_t i=0; i < pool.size(); ++i) {
+ m = (cAbstractMedia *) pool[i];
+ if (m->MediaType() != ot) {
+ ot = m->MediaType();
+ categories[ot] = i;
+ }
+ }
+}
+
+cAbstractMedia *cFSMediaScanner::FindMedia(const char *Path)
+{
+ cAbstractMedia *rv = NULL, *tmp;
+
+ for (size_t i=0; i < pool.size(); ++i) {
+ tmp = (cAbstractMedia *) pool[i];
+ if (!strcmp(tmp->LogicalPath(), Path)) {
+ rv = tmp;
+ break;
+ }
+ }
+ return rv;
+}