From 9539d3a3489b7a63cf7b9f83963cbc3352f049c7 Mon Sep 17 00:00:00 2001 From: Ken McGaugh Date: Sat, 15 Nov 2025 11:52:10 +1300 Subject: [PATCH 1/8] Allow udta metadata tags to be passed through. Signed-off-by: Ken McGaugh --- src/plugin/media_metadata/ffprobe/src/ffprobe_lib.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugin/media_metadata/ffprobe/src/ffprobe_lib.cpp b/src/plugin/media_metadata/ffprobe/src/ffprobe_lib.cpp index 7c91200e7..ec301a35f 100644 --- a/src/plugin/media_metadata/ffprobe/src/ffprobe_lib.cpp +++ b/src/plugin/media_metadata/ffprobe/src/ffprobe_lib.cpp @@ -553,6 +553,9 @@ std::shared_ptr FFProbe::open_file(const std::string &path) { av_dict_set(&format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE); auto scan_all_pmts_set = 1; + // Tell ffmpeg to export custom "udta" metadata tags. + av_dict_set_int(&format_opts, "export_all", 1, 0); + iformat = av_find_input_format("format"); if (not iformat) { // throw std::runtime_error("Unknown input format"); From c6a72efaaa2d7a7739b51fb51e06125cd0503179 Mon Sep 17 00:00:00 2001 From: Ken McGaugh Date: Sat, 15 Nov 2025 11:53:59 +1300 Subject: [PATCH 2/8] Fixed incorrect keycode for MetaModifier. Signed-off-by: Ken McGaugh --- include/xstudio/ui/keyboard.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/xstudio/ui/keyboard.hpp b/include/xstudio/ui/keyboard.hpp index 6288499a6..c80b1b8c8 100644 --- a/include/xstudio/ui/keyboard.hpp +++ b/include/xstudio/ui/keyboard.hpp @@ -22,8 +22,8 @@ namespace ui { inline static const std::map key_to_modifier = { {16777248, (int)ShiftModifier}, {16777249, (int)ControlModifier}, - {16777251, (int)AltModifier}, - {16777249, (int)MetaModifier}}; + {16777250, (int)MetaModifier}, + {16777251, (int)AltModifier}}; // This is very rough and ready, needs a lot more work! class Hotkey { From 88861dddcabe7bfa7f554da2c429b485628c2881 Mon Sep 17 00:00:00 2001 From: Ken McGaugh Date: Sat, 15 Nov 2025 11:56:48 +1300 Subject: [PATCH 3/8] Fixed missing parentheses reported by compiler. This now matches the annotation_serialiser.cpp. Signed-off-by: Ken McGaugh --- src/plugin/colour_op/grading/src/grading_data_serialiser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugin/colour_op/grading/src/grading_data_serialiser.cpp b/src/plugin/colour_op/grading/src/grading_data_serialiser.cpp index 4bfc9f414..4a5afec52 100644 --- a/src/plugin/colour_op/grading/src/grading_data_serialiser.cpp +++ b/src/plugin/colour_op/grading/src/grading_data_serialiser.cpp @@ -44,7 +44,7 @@ void GradingDataSerialiser::register_serialiser( const unsigned char maj_ver, const unsigned char minor_ver, std::shared_ptr sptr) { - int fver = maj_ver << 8 + minor_ver; + int fver = (maj_ver << 8) + minor_ver; assert(sptr); if (serialisers.find(fver) != serialisers.end()) { throw std::runtime_error("Attempt to register Annotation Serialiser with a used " From a74145be5d8a063b57c30c7bacbb7237efd7cbc7 Mon Sep 17 00:00:00 2001 From: Ken McGaugh Date: Sat, 15 Nov 2025 11:59:48 +1300 Subject: [PATCH 4/8] Exposed additional methods and constructors for MediaReference, FrameList, and Timecode. Signed-off-by: Ken McGaugh --- src/python_module/src/py_register.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/python_module/src/py_register.cpp b/src/python_module/src/py_register.cpp index 158b7de7a..423ffc147 100644 --- a/src/python_module/src/py_register.cpp +++ b/src/python_module/src/py_register.cpp @@ -257,6 +257,7 @@ void register_timecode_class(py::module &m, const std::string &name) { auto str_impl = [](const utility::Timecode &x) { return to_string(x); }; py::class_(m, name.c_str()) .def(py::init<>()) + .def(py::init()) .def("__str__", str_impl) .def("hours", [](const utility::Timecode &x) { return x.hours(); }) .def("minutes", [](const utility::Timecode &x) { return x.minutes(); }) @@ -289,9 +290,10 @@ void register_mediareference_class(py::module &m, const std::string &name) { &utility::MediaReference::uri, py::const_), "URI of mediareference", py::arg("fpf") = utility::MediaReference::FramePadFormat::FPF_XSTUDIO) - + .def("set_frame_list", &utility::MediaReference::set_frame_list) .def("uri_from_frame", &utility::MediaReference::uri_from_frame) .def("timecode", &utility::MediaReference::timecode) + .def("set_timecode", &utility::MediaReference::set_timecode) .def("offset", &utility::MediaReference::offset) .def("set_offset", &utility::MediaReference::set_offset) .def("start_frame_offset", &utility::MediaReference::start_frame_offset) @@ -569,6 +571,7 @@ void register_frame_list_class(py::module &m, const std::string &name) { auto str_impl = [](const utility::FrameList &x) { return to_string(x); }; py::class_(m, name.c_str()) .def(py::init<>()) + .def(py::init()) .def(py::init()) .def("__str__", str_impl); } From 734d717ffe8899a6d247cf9f10485437ba626e60 Mon Sep 17 00:00:00 2001 From: Ken McGaugh Date: Sat, 15 Nov 2025 12:01:00 +1300 Subject: [PATCH 5/8] Exposse the AltModifier to python, which was the one modifier missing. Signed-off-by: Ken McGaugh --- src/python_module/src/py_ui.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/python_module/src/py_ui.cpp b/src/python_module/src/py_ui.cpp index ff4dbeb9b..7fe58c896 100644 --- a/src/python_module/src/py_ui.cpp +++ b/src/python_module/src/py_ui.cpp @@ -25,6 +25,7 @@ void py_ui(py::module_ &m) { .value("NoModifier", ui::KeyboardModifier::NoModifier) .value("ShiftModifier", ui::KeyboardModifier::ShiftModifier) .value("ControlModifier", ui::KeyboardModifier::ControlModifier) + .value("AltModifier", ui::KeyboardModifier::AltModifier) .value("MetaModifier", ui::KeyboardModifier::MetaModifier) .value("KeypadModifier", ui::KeyboardModifier::KeypadModifier) .value("GroupSwitchModifier", ui::KeyboardModifier::GroupSwitchModifier) From fa32aa1edb6a3eea3c46279572f2f40495243dd4 Mon Sep 17 00:00:00 2001 From: Ken McGaugh Date: Sat, 15 Nov 2025 12:03:19 +1300 Subject: [PATCH 6/8] Change to prevent sources provided by non-file URL schemes to be marked as MS_MISSING. This allows for media_sources to be provided by http(s). Signed-off-by: Ken McGaugh --- src/scanner/src/scanner_actor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scanner/src/scanner_actor.cpp b/src/scanner/src/scanner_actor.cpp index aa9f6488b..266d8c65e 100644 --- a/src/scanner/src/scanner_actor.cpp +++ b/src/scanner/src/scanner_actor.cpp @@ -35,7 +35,7 @@ media::MediaStatus check_media_status(const MediaReference &mr) { try { if (mr.container()) { - if (not fs::exists(uri_to_posix_path(mr.uri()))) + if (mr.uri().scheme() == "file" and not fs::exists(uri_to_posix_path(mr.uri()))) ms = media::MediaStatus::MS_MISSING; } else { // check first and last frame. From 8da45af538014a903b8cb69195bda59928ff3474 Mon Sep 17 00:00:00 2001 From: Ken McGaugh Date: Sat, 15 Nov 2025 12:05:55 +1300 Subject: [PATCH 7/8] This MacOS-only fix prevents an "stroull" error message when a .DS_Store file exists in a thumbnail cache directory. Signed-off-by: Ken McGaugh --- src/thumbnail/src/thumbnail.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/thumbnail/src/thumbnail.cpp b/src/thumbnail/src/thumbnail.cpp index e51829376..e20b0a2c4 100644 --- a/src/thumbnail/src/thumbnail.cpp +++ b/src/thumbnail/src/thumbnail.cpp @@ -17,8 +17,13 @@ void DiskCacheStat::populate(const std::string &path) { for (const auto &entry : fs::recursive_directory_iterator(path)) { if (fs::is_regular_file(entry.status())) { auto mtime = fs::last_write_time(entry.path()); + const auto stem = entry.path().stem().string(); +#if __apple__ + if (stem == ".DS_Store") + continue; +#endif add_thumbnail( - std::stoull(entry.path().stem().string(), nullptr, 16), + std::stoull(stem, nullptr, 16), fs::file_size(entry.path()), mtime); } From c2556caac187e77e8d0b60c19b0b519631add47b Mon Sep 17 00:00:00 2001 From: Ken McGaugh Date: Sat, 15 Nov 2025 12:36:21 +1300 Subject: [PATCH 8/8] Added empty event_atom/name_atom message handler to prevent error message. Signed-off-by: Ken McGaugh --- src/timeline/src/clip_actor.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/timeline/src/clip_actor.cpp b/src/timeline/src/clip_actor.cpp index d814db166..87ccf3cd7 100644 --- a/src/timeline/src/clip_actor.cpp +++ b/src/timeline/src/clip_actor.cpp @@ -247,6 +247,8 @@ caf::message_handler ClipActor::message_handler() { return jsn; }, + [=](utility::event_atom, utility::name_atom, const std::string & /*name*/) {}, + [=](item_name_atom, const std::string &value) -> JsonStore { auto jsn = base_.item().set_name(value); if (not jsn.is_null())