mirror of
https://github.com/kiwix/libkiwix.git
synced 2026-02-20 08:05:28 -05:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42a2ce2534 | ||
|
|
3945dda5d0 | ||
|
|
d65dd859da | ||
|
|
d94d2c1e8a | ||
|
|
a20b135f80 | ||
|
|
6d520a8aa7 |
@@ -155,6 +155,15 @@ class Manager
|
|||||||
const std::string& url = "",
|
const std::string& url = "",
|
||||||
const bool checkMetaData = false);
|
const bool checkMetaData = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add all books from the directory tree into the library.
|
||||||
|
*
|
||||||
|
* @param path The path of the directory to scan.
|
||||||
|
* @param verboseFlag Verbose logs flag.
|
||||||
|
*/
|
||||||
|
void addBooksFromDirectory(const std::string& path,
|
||||||
|
const bool verboseFlag = false);
|
||||||
|
|
||||||
std::string writableLibraryPath;
|
std::string writableLibraryPath;
|
||||||
|
|
||||||
bool m_hasSearchResult = false;
|
bool m_hasSearchResult = false;
|
||||||
|
|||||||
@@ -23,6 +23,14 @@
|
|||||||
#include "tools/pathTools.h"
|
#include "tools/pathTools.h"
|
||||||
|
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <iostream>
|
||||||
|
#include <set>
|
||||||
|
#include <queue>
|
||||||
|
#include <cctype>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
namespace kiwix
|
namespace kiwix
|
||||||
{
|
{
|
||||||
@@ -251,6 +259,58 @@ bool Manager::addBookFromPath(const std::string& pathToOpen,
|
|||||||
.empty());
|
.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Manager::addBooksFromDirectory(const std::string& path,
|
||||||
|
const bool verboseFlag)
|
||||||
|
{
|
||||||
|
std::set<std::string> iteratedDirs;
|
||||||
|
std::queue<std::string> dirQueue;
|
||||||
|
dirQueue.push(fs::absolute(path).u8string());
|
||||||
|
int totalBooksAdded = 0;
|
||||||
|
if (verboseFlag)
|
||||||
|
std::cout << "Adding books from the directory tree: " << dirQueue.front() << std::endl;
|
||||||
|
|
||||||
|
while (!dirQueue.empty()) {
|
||||||
|
const auto currentPath = dirQueue.front();
|
||||||
|
dirQueue.pop();
|
||||||
|
if (verboseFlag)
|
||||||
|
std::cout << "Visiting directory: " << currentPath << std::endl;
|
||||||
|
for (const auto& dirEntry : fs::directory_iterator(currentPath)) {
|
||||||
|
auto resolvedPath = dirEntry.path();
|
||||||
|
if (fs::is_symlink(dirEntry)) {
|
||||||
|
try {
|
||||||
|
resolvedPath = fs::canonical(dirEntry.path());
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
std::cerr << "Could not resolve symlink " << resolvedPath.u8string() << " to a valid path. Skipping..." << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const std::string pathString = resolvedPath.u8string();
|
||||||
|
std::string resolvedPathExtension = resolvedPath.extension();
|
||||||
|
std::transform(resolvedPathExtension.begin(), resolvedPathExtension.end(), resolvedPathExtension.begin(),
|
||||||
|
[](unsigned char c){ return std::tolower(c); });
|
||||||
|
if (fs::is_directory(resolvedPath)) {
|
||||||
|
if (iteratedDirs.find(pathString) == iteratedDirs.end())
|
||||||
|
dirQueue.push(pathString);
|
||||||
|
else if (verboseFlag)
|
||||||
|
std::cout << "Already iterated over " << pathString << ". Skipping..." << std::endl;
|
||||||
|
} else if (resolvedPathExtension == ".zim" || resolvedPathExtension == ".zimaa") {
|
||||||
|
if (!this->addBookFromPath(pathString, pathString, "", false)) {
|
||||||
|
std::cerr << "Could not add " << pathString << " into the library." << std::endl;
|
||||||
|
} else if (verboseFlag) {
|
||||||
|
std::cout << "Added " << pathString << " into the library." << std::endl;
|
||||||
|
totalBooksAdded++;
|
||||||
|
}
|
||||||
|
} else if (verboseFlag) {
|
||||||
|
std::cout << "Skipped " << pathString << " - unsupported file type or permission denied." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iteratedDirs.insert(currentPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verboseFlag)
|
||||||
|
std::cout << "Traversal completed. Total books added: " << totalBooksAdded << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
bool Manager::readBookFromPath(const std::string& path, kiwix::Book* book)
|
bool Manager::readBookFromPath(const std::string& path, kiwix::Book* book)
|
||||||
{
|
{
|
||||||
std::string tmp_path = path;
|
std::string tmp_path = path;
|
||||||
|
|||||||
Reference in New Issue
Block a user