From d3c417dba94f037ec615c5d4b7bf5fa34ce9eb37 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Thu, 3 Sep 2026 03:02:38 +0200 Subject: [PATCH 1/2] feat(ocdav): expose the video, motionPhoto and livePhoto facets --- .../owncloud/ocdav/propfind/propfind.go | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/internal/http/services/owncloud/ocdav/propfind/propfind.go b/internal/http/services/owncloud/ocdav/propfind/propfind.go index d86367a2c5c..f376d43c399 100644 --- a/internal/http/services/owncloud/ocdav/propfind/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind/propfind.go @@ -96,6 +96,30 @@ var ( "width", "height", } + videoKeys = []string{ + "audioBitsPerSample", + "audioChannels", + "audioFormat", + "audioSamplesPerSecond", + "bitrate", + "duration", + "fourCC", + "frameRate", + "height", + "width", + } + motionPhotoKeys = []string{ + "presentationTimestampUs", + "version", + "videoSize", + } + livePhotoKeys = []string{ + "auto", + "contentId", + "stillImageTimeUs", + "vitalityScore", + "vitalityScoringVersion", + } photoKeys = []string{ "cameraMake", "cameraModel", @@ -887,6 +911,12 @@ func metadataKeys(pf XML) ([]string, []string) { metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.image", imageKeys)...) case "http://owncloud.org/ns/photo": metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.photo", photoKeys)...) + case "http://owncloud.org/ns/video": + metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.video", videoKeys)...) + case "http://owncloud.org/ns/motionPhoto": + metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.motionPhoto", motionPhotoKeys)...) + case "http://owncloud.org/ns/livePhoto": + metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.livePhoto", livePhotoKeys)...) default: metadataKeys = append(metadataKeys, key) } @@ -944,7 +974,7 @@ func requiresExplicitFetching(n *xml.Name) bool { } case net.NsOwncloud: switch n.Local { - case "favorite", "share-types", "checksums", "size", "tags", "audio", "location", "image", "photo": + case "favorite", "share-types", "checksums", "size", "tags", "audio", "location", "image", "photo", "video", "motionPhoto", "livePhoto": return true default: return false @@ -1292,6 +1322,9 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p appendMetadataProp(k, "oc", "location", "libre.graph.location", locationKeys) appendMetadataProp(k, "oc", "image", "libre.graph.image", imageKeys) appendMetadataProp(k, "oc", "photo", "libre.graph.photo", photoKeys) + appendMetadataProp(k, "oc", "video", "libre.graph.video", videoKeys) + appendMetadataProp(k, "oc", "motionPhoto", "libre.graph.motionPhoto", motionPhotoKeys) + appendMetadataProp(k, "oc", "livePhoto", "libre.graph.livePhoto", livePhotoKeys) } if md.Type == provider.ResourceType_RESOURCE_TYPE_CONTAINER { @@ -1579,6 +1612,18 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p if k := md.GetArbitraryMetadata().GetMetadata(); k != nil { appendMetadataProp(k, "oc", "photo", "libre.graph.photo", photoKeys) } + case "video": + if k := md.GetArbitraryMetadata().GetMetadata(); k != nil { + appendMetadataProp(k, "oc", "video", "libre.graph.video", videoKeys) + } + case "motionPhoto": + if k := md.GetArbitraryMetadata().GetMetadata(); k != nil { + appendMetadataProp(k, "oc", "motionPhoto", "libre.graph.motionPhoto", motionPhotoKeys) + } + case "livePhoto": + if k := md.GetArbitraryMetadata().GetMetadata(); k != nil { + appendMetadataProp(k, "oc", "livePhoto", "libre.graph.livePhoto", livePhotoKeys) + } case "name": appendToOK(prop.Escaped("oc:name", md.Name)) case "shareid": From d289ac11cfbc85634a28e5f55c05ec9fb8348f36 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Thu, 3 Sep 2026 03:22:15 +0200 Subject: [PATCH 2/2] refactor(ocdav): name the new props kebab-case like the rest --- .../owncloud/ocdav/propfind/propfind.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/internal/http/services/owncloud/ocdav/propfind/propfind.go b/internal/http/services/owncloud/ocdav/propfind/propfind.go index f376d43c399..d3a7a24f8f0 100644 --- a/internal/http/services/owncloud/ocdav/propfind/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind/propfind.go @@ -913,9 +913,9 @@ func metadataKeys(pf XML) ([]string, []string) { metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.photo", photoKeys)...) case "http://owncloud.org/ns/video": metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.video", videoKeys)...) - case "http://owncloud.org/ns/motionPhoto": + case "http://owncloud.org/ns/motion-photo": metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.motionPhoto", motionPhotoKeys)...) - case "http://owncloud.org/ns/livePhoto": + case "http://owncloud.org/ns/live-photo": metadataKeys = append(metadataKeys, metadataKeysWithPrefix("libre.graph.livePhoto", livePhotoKeys)...) default: metadataKeys = append(metadataKeys, key) @@ -974,7 +974,7 @@ func requiresExplicitFetching(n *xml.Name) bool { } case net.NsOwncloud: switch n.Local { - case "favorite", "share-types", "checksums", "size", "tags", "audio", "location", "image", "photo", "video", "motionPhoto", "livePhoto": + case "favorite", "share-types", "checksums", "size", "tags", "audio", "location", "image", "photo", "video", "motion-photo", "live-photo": return true default: return false @@ -1323,8 +1323,8 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p appendMetadataProp(k, "oc", "image", "libre.graph.image", imageKeys) appendMetadataProp(k, "oc", "photo", "libre.graph.photo", photoKeys) appendMetadataProp(k, "oc", "video", "libre.graph.video", videoKeys) - appendMetadataProp(k, "oc", "motionPhoto", "libre.graph.motionPhoto", motionPhotoKeys) - appendMetadataProp(k, "oc", "livePhoto", "libre.graph.livePhoto", livePhotoKeys) + appendMetadataProp(k, "oc", "motion-photo", "libre.graph.motionPhoto", motionPhotoKeys) + appendMetadataProp(k, "oc", "live-photo", "libre.graph.livePhoto", livePhotoKeys) } if md.Type == provider.ResourceType_RESOURCE_TYPE_CONTAINER { @@ -1616,13 +1616,13 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p if k := md.GetArbitraryMetadata().GetMetadata(); k != nil { appendMetadataProp(k, "oc", "video", "libre.graph.video", videoKeys) } - case "motionPhoto": + case "motion-photo": if k := md.GetArbitraryMetadata().GetMetadata(); k != nil { - appendMetadataProp(k, "oc", "motionPhoto", "libre.graph.motionPhoto", motionPhotoKeys) + appendMetadataProp(k, "oc", "motion-photo", "libre.graph.motionPhoto", motionPhotoKeys) } - case "livePhoto": + case "live-photo": if k := md.GetArbitraryMetadata().GetMetadata(); k != nil { - appendMetadataProp(k, "oc", "livePhoto", "libre.graph.livePhoto", livePhotoKeys) + appendMetadataProp(k, "oc", "live-photo", "libre.graph.livePhoto", livePhotoKeys) } case "name": appendToOK(prop.Escaped("oc:name", md.Name))