16 : m_app_data_dir(app_data_dir)
19 if (!std::filesystem::exists(m_app_data_dir)) {
21 std::filesystem::create_directories(m_app_data_dir);
22 spdlog::info(
"AppDataXmpPathStrategy: Created AppData base directory: {}", m_app_data_dir);
23 }
catch (
const std::exception& e) {
24 spdlog::error(
"AppDataXmpPathStrategy: Failed to create AppData base directory '{}': {}", m_app_data_dir, e.what());
27 spdlog::debug(
"AppDataXmpPathStrategy: Initialized with AppData directory: {}", m_app_data_dir);
32 if (source_image_path.empty()) {
33 spdlog::error(
"AppDataXmpPathStrategy::getXmpPathForImage: Source image path is empty.");
37 std::filesystem::path image_path_obj(source_image_path);
42 std::filesystem::path relative_path = image_path_obj.lexically_relative(image_path_obj.root_path());
46 std::filesystem::path xmp_final_path = m_app_data_dir / relative_path;
47 xmp_final_path +=
".xmp";
49 spdlog::debug(
"AppDataXmpPathStrategy::getXmpPathForImage: Mapped '{}' to XMP path: '{}'", source_image_path, xmp_final_path.string());
50 return xmp_final_path.string();
55 if (xmp_path.empty()) {
56 spdlog::error(
"AppDataXmpPathStrategy::getImagePathFromXmp: XMP path is empty.");
60 spdlog::debug(
"AppDataXmpPathStrategy::getImagePathFromXmp: Attempting to read original image path from XMP: {}", xmp_path);
63 std::string xmp_packet = m_xmp_provider->readXmp(xmp_path);
64 if (xmp_packet.empty()) {
65 spdlog::warn(
"AppDataXmpPathStrategy::getImagePathFromXmp: IXmpProvider returned an empty XMP packet for file: {}", xmp_path);
70 Exiv2::XmpData xmp_data;
73 if (Exiv2::XmpParser::decode(xmp_data, xmp_packet.c_str()) != 0) {
74 spdlog::error(
"AppDataXmpPathStrategy::getImagePathFromXmp: Failed to decode XMP packet from file: {}", xmp_path);
79 std::string source_image_path_from_xmp = xmp_data[
"Xmp.cm.sourceImagePath"].toString();
81 if (source_image_path_from_xmp.empty()) {
82 spdlog::warn(
"AppDataXmpPathStrategy::getImagePathFromXmp: XMP packet in file '{}' does not contain the 'Xmp.cm.sourceImagePath' key.", xmp_path);
84 spdlog::debug(
"AppDataXmpPathStrategy::getImagePathFromXmp: Found source image path in XMP: '{}'", source_image_path_from_xmp);
87 return source_image_path_from_xmp;
89 }
catch (
const Exiv2::Error& e) {
90 spdlog::error(
"Context::AppDataXmpPathStrategy::getImagePathFromXmp: Exiv2 error during parsing XMP file '{}': {}", xmp_path, e.what());
92 }
catch (
const std::exception& e) {
93 spdlog::error(
"Context::AppDataXmpPathStrategy::getImagePathFromXmp: General error during parsing XMP file '{}': {}", xmp_path, e.what());