Skip to content

Commit 91d2334

Browse files
committed
Trigger metadata re-load when MediaReference on a MediaSouerce is changed
1 parent 9a8e1c7 commit 91d2334

File tree

12 files changed

+54
-45
lines changed

12 files changed

+54
-45
lines changed

include/xstudio/atoms.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ namespace media {
106106
AVFrameIDsAndTimePoints;
107107
typedef std::vector<std::shared_ptr<const AVFrameID>> AVFrameIDs;
108108
typedef std::vector<MediaKey> MediaKeyVector;
109+
typedef std::tuple<std::string, std::string, uintmax_t> MediaSourceChecksum;
109110
} // namespace media
110111

111112
namespace conform {
@@ -403,7 +404,7 @@ CAF_BEGIN_TYPE_ID_BLOCK(xstudio_complex_types, FIRST_CUSTOM_ID + 200)
403404

404405
CAF_ADD_TYPE_ID(xstudio_complex_types, (std::vector<xstudio::utility::Notification>))
405406

406-
CAF_ADD_TYPE_ID(xstudio_complex_types, (std::tuple<std::string, std::string, uintmax_t>))
407+
CAF_ADD_TYPE_ID(xstudio_complex_types, (xstudio::media::MediaSourceChecksum))
407408

408409
CAF_END_TYPE_ID_BLOCK(xstudio_complex_types)
409410

include/xstudio/media/media.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ namespace media {
383383
typedef std::map<timebase::flicks, std::shared_ptr<const AVFrameID>> FrameTimeMap;
384384
typedef std::shared_ptr<const std::map<timebase::flicks, std::shared_ptr<const AVFrameID>>>
385385
FrameTimeMapPtr;
386+
typedef std::tuple<std::string, std::string, uintmax_t> MediaSourceChecksum;
386387
387388
class Media : public utility::Container {
388389
public:
@@ -483,9 +484,9 @@ namespace media {
483484
484485
[[nodiscard]] const std::list<utility::Uuid> &streams(const MediaType media_type) const;
485486
486-
[[nodiscard]] std::tuple<std::string, std::string, uintmax_t> checksum() const;
487+
[[nodiscard]] MediaSourceChecksum checksum() const;
487488
488-
[[nodiscard]] bool checksum(const std::pair<std::string, uintmax_t> &checksum) {
489+
[[nodiscard]] bool set_checksum(const std::pair<std::string, uintmax_t> &checksum) {
489490
auto changed = false;
490491
if (checksum_ != checksum.first or size_ != checksum.second) {
491492
checksum_ = checksum.first;

include/xstudio/media/media_actor.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ namespace media {
172172
caf::actor_addr parent_;
173173
utility::Uuid parent_uuid_;
174174
std::vector<caf::typed_response_promise<bool>> pending_stream_detail_requests_;
175-
bool media_metadata_up_to_date_ = {false};
175+
MediaSourceChecksum media_metadata_ref_checksum_;
176176
std::set<media::MediaKey> all_requested_frames_;
177177
std::filesystem::file_time_type container_file_timestamp_;
178178

src/media/src/media_actor.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -885,8 +885,8 @@ caf::message_handler MediaActor::message_handler() {
885885
return rp;
886886
},
887887

888-
[=](media::checksum_atom) -> result<std::tuple<std::string, std::string, uintmax_t>> {
889-
auto rp = make_response_promise<std::tuple<std::string, std::string, uintmax_t>>();
888+
[=](media::checksum_atom) -> result<MediaSourceChecksum> {
889+
auto rp = make_response_promise<MediaSourceChecksum>();
890890

891891
if (base_.empty())
892892
rp.deliver(make_error(xstudio_error::error, "No MediaSources"));
@@ -897,8 +897,8 @@ caf::message_handler MediaActor::message_handler() {
897897
},
898898

899899
[=](media::checksum_atom, const media::MediaType mt)
900-
-> result<std::tuple<std::string, std::string, uintmax_t>> {
901-
auto rp = make_response_promise<std::tuple<std::string, std::string, uintmax_t>>();
900+
-> result<MediaSourceChecksum> {
901+
auto rp = make_response_promise<MediaSourceChecksum>();
902902

903903
if (base_.empty())
904904
rp.deliver(make_error(xstudio_error::error, "No MediaSources"));

src/media/src/media_source.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ JsonStore MediaSource::serialise() const {
8484
return jsn;
8585
}
8686

87-
std::tuple<std::string, std::string, uintmax_t> MediaSource::checksum() const {
87+
MediaSourceChecksum MediaSource::checksum() const {
8888
return std::make_tuple(
8989
fs::path(utility::uri_to_posix_path(ref_.uri())).filename().string(), checksum_, size_);
9090
}

src/media/src/media_source_actor.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ MediaSourceActor::MediaSourceActor(caf::actor_config &cfg, const JsonStore &jsn)
5959
// What happens if media was added to the session before it was on-disk, but now it
6060
// is on disk? We need to re-scan for media metadata. Setting the
6161
// media_detadata_up_to_date_ flag here will allow for this.
62-
media_metadata_up_to_date_ =
63-
jsn["store"].contains("metadata") && jsn["store"]["metadata"].contains("media");
62+
if (jsn["store"].contains("metadata") && jsn["store"]["metadata"].contains("media")) {
63+
media_metadata_ref_checksum_ = base_.checksum();
64+
}
6465
}
6566
link_to(json_store_);
6667
join_event_group(this, json_store_);
@@ -739,9 +740,9 @@ caf::message_handler MediaSourceActor::message_handler() {
739740

740741
if (mr != base_.media_reference() || force_change_signal) {
741742

742-
base_.set_media_status(MS_UNKNOWN);
743+
if (mr.uri() != base_.media_reference().uri() || mr.duration().duration() == timebase::k_flicks_zero_seconds) {
743744

744-
if (mr.uri() != base_.media_reference().uri()) {
745+
base_.set_media_status(MS_UNKNOWN);
745746

746747
// URI is changing! Need a full rebuild
747748
if (!mr.rate().count())
@@ -949,7 +950,7 @@ caf::message_handler MediaSourceActor::message_handler() {
949950
const std::vector<std::string> &paths) -> caf::result<JsonStore> {
950951
// multi json store value request
951952
auto rp = make_response_promise<JsonStore>();
952-
if (!media_metadata_up_to_date_) {
953+
if (media_metadata_ref_checksum_ != base_.checksum()) {
953954
mail(media_metadata::get_metadata_atom_v)
954955
.request(caf::actor_cast<actor>(this), infinite)
955956
.then(
@@ -1036,7 +1037,7 @@ caf::message_handler MediaSourceActor::message_handler() {
10361037

10371038
[=](media_metadata::get_metadata_atom) -> caf::result<bool> {
10381039
auto rp = make_response_promise<bool>();
1039-
if (media_metadata_up_to_date_) {
1040+
if (media_metadata_ref_checksum_ == base_.checksum()) {
10401041
rp.deliver(true);
10411042
return rp;
10421043
}
@@ -1088,7 +1089,7 @@ caf::message_handler MediaSourceActor::message_handler() {
10881089
.request(json_store_, infinite)
10891090
.then(
10901091
[=](const bool &done) mutable {
1091-
media_metadata_up_to_date_ = true;
1092+
media_metadata_ref_checksum_ = base_.checksum();
10921093
rp.deliver(done);
10931094
// notify any watchers that metadata is updated
10941095
mail(
@@ -1151,7 +1152,7 @@ caf::message_handler MediaSourceActor::message_handler() {
11511152
.request(json_store_, infinite)
11521153
.then(
11531154
[=](const bool &done) mutable {
1154-
media_metadata_up_to_date_ = true;
1155+
media_metadata_ref_checksum_ = base_.checksum();
11551156
rp.deliver(done);
11561157
// notify any watchers that metadata is updated
11571158
mail(
@@ -1217,15 +1218,19 @@ caf::message_handler MediaSourceActor::message_handler() {
12171218
return mail(_get_group_atom).delegate(json_store_);
12181219
},
12191220

1220-
[=](media::checksum_atom) -> std::tuple<std::string, std::string, uintmax_t> {
1221+
[=](media::checksum_atom) -> MediaSourceChecksum {
12211222
return base_.checksum();
12221223
},
12231224

12241225
[=](media::checksum_atom, const std::pair<std::string, uintmax_t> &checksum) {
12251226

12261227
// force thumbnail update on change. Might cause double update..
12271228
auto old_size = std::get<2>(base_.checksum());
1228-
if (base_.checksum(checksum) and old_size) {
1229+
if (base_.set_checksum(checksum) and old_size) {
1230+
1231+
// trigger re-fetch of media metadata. The (checksum is used to test if
1232+
// we really need to re-scan for metadata).
1233+
anon_mail(get_metadata_atom_v).send(caf::actor_cast<caf::actor>(this));
12291234

12301235
mail(utility::event_atom_v, media_status_atom_v, base_.media_status())
12311236
.send(base_.event_group());

src/scanner/src/scanner_actor.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ ScanHelperActor::ScanHelperActor(caf::actor_config &cfg) : caf::event_based_acto
175175
},
176176

177177
[=](media::relink_atom,
178-
const std::tuple<std::string, std::string, uintmax_t> &pin,
178+
const media::MediaSourceChecksum &pin,
179179
const caf::uri &uri,
180180
const bool loose_match) -> result<caf::uri> {
181181
// recursively scan directory
@@ -293,7 +293,7 @@ ScannerActor::ScannerActor(caf::actor_config &cfg) : caf::event_based_actor(cfg)
293293
},
294294

295295
[=](media::relink_atom atom,
296-
const std::tuple<std::string, std::string, uintmax_t> &pin,
296+
const media::MediaSourceChecksum &pin,
297297
const caf::uri &path,
298298
const bool loose_match) {
299299
return mail(atom, pin, path, loose_match).delegate(helper);
@@ -306,7 +306,7 @@ ScannerActor::ScannerActor(caf::actor_config &cfg) : caf::event_based_actor(cfg)
306306
mail(media::checksum_atom_v)
307307
.request(media_source, infinite)
308308
.then(
309-
[=](const std::tuple<std::string, std::string, uintmax_t> &result) mutable {
309+
[=](const media::MediaSourceChecksum &result) mutable {
310310
anon_mail(atom, media_source, result, path, loose_match)
311311
.send(caf::actor_cast<caf::actor>(this));
312312
},
@@ -317,7 +317,7 @@ ScannerActor::ScannerActor(caf::actor_config &cfg) : caf::event_based_actor(cfg)
317317

318318
[=](media::relink_atom atom,
319319
const caf::actor &media_source,
320-
const std::tuple<std::string, std::string, uintmax_t> &pin,
320+
const media::MediaSourceChecksum &pin,
321321
const caf::uri &path,
322322
const bool loose_match) {
323323
mail(atom, pin, path, loose_match)

src/ui/qml/helper/src/helper_ui.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ QString xstudio::ui::qml::getThumbnailURL(
9090
*sys, actor, media::get_media_pointer_atom_v, media::MT_IMAGE, frame);
9191

9292
auto mhash =
93-
utility::request_receive<std::tuple<std::string, std::string, uintmax_t>>(
93+
utility::request_receive<media::MediaSourceChecksum>(
9494
*sys, actor, media::checksum_atom_v);
9595

9696
auto display_transform_hash = utility::request_receive<size_t>(

src/ui/qml/session/src/session_model_ui.cpp

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,8 @@ void SessionModel::receivedData(
777777

778778
// this might be inefficient, we need a new event for media changing underneath
779779
// us
780-
case Roles::mediaStatusRole:
780+
case Roles::mediaStatusRole: {
781+
781782
if (j.count(role_to_key[role]) and j.at(role_to_key[role]) != result) {
782783
j[role_to_key[role]] = result;
783784

@@ -790,29 +791,28 @@ void SessionModel::receivedData(
790791
// update error counts in parents.
791792
updateErroredCount(index);
792793

793-
} else {
794+
}
794795

795-
// if media status has changed it may be because the MediaReference on a
796-
// MediaSourceActor has changed. We may need to re-generate the thumbnail
797-
// if we already have one.
798-
auto type = j.value("type", "");
799-
if (type == "Media" && j.count("actor") and not j.at("actor").is_null()) {
800-
auto actor_str = j.at("actor");
801-
auto p = media_thumbnails_.find(QStringFromStd(actor_str));
802-
if (p != media_thumbnails_.end()) {
803-
media_thumbnails_.erase(p);
804-
emit dataChanged(index, index, QVector<int>({Roles::thumbnailImageRole}));
805-
}
796+
// if media status has changed it may be because the MediaReference on a
797+
// MediaSourceActor has changed. We may need to re-generate the thumbnail
798+
// if we already have one.
799+
auto type = j.value("type", "");
800+
if (type == "Media" && j.count("actor") and not j.at("actor").is_null()) {
801+
auto actor_str = j.at("actor");
802+
auto p = media_thumbnails_.find(QStringFromStd(actor_str));
803+
if (p != media_thumbnails_.end()) {
804+
media_thumbnails_.erase(p);
805+
emit dataChanged(index, index, QVector<int>({Roles::thumbnailImageRole}));
806806
}
807+
}
807808

808-
if (j.count(role_to_key[Roles::thumbnailURLRole])) {
809-
roles.clear();
810-
roles.push_back(Roles::thumbnailURLRole);
811-
j[role_to_key[Roles::thumbnailURLRole]] = nullptr;
812-
emit dataChanged(index, index, roles);
813-
}
809+
if (j.count(role_to_key[Roles::thumbnailURLRole])) {
810+
roles.clear();
811+
roles.push_back(Roles::thumbnailURLRole);
812+
j[role_to_key[Roles::thumbnailURLRole]] = nullptr;
813+
emit dataChanged(index, index, roles);
814814
}
815-
break;
815+
} break;
816816

817817
case Roles::flagTextRole:
818818
case Roles::flagColourRole: {

ui/qml/xstudio/qml.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@
257257
<file>fonts/Inter/Inter-Regular.ttf</file>
258258
<file>fonts/Inter/Inter-SemiBold.ttf</file>
259259
<file>fonts/Inter/Inter-Thin.ttf</file>
260+
<file>fonts/VeraMono.ttf</file>
260261

261262
</qresource>
262263

0 commit comments

Comments
 (0)