github.com/boki/go-xmp@v1.0.1/models/xmp_mm/model.go (about) 1 // Copyright (c) 2017-2018 Alexander Eichhorn 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"): you may 4 // not use this file except in compliance with the License. You may obtain 5 // a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 // License for the specific language governing permissions and limitations 13 // under the License. 14 15 // Package xmpmm implements the XMP Media Management namespace as defined by XMP Specification Part 2. 16 package xmpmm 17 18 import ( 19 "fmt" 20 "trimmer.io/go-xmp/models/xmp_dm" 21 "trimmer.io/go-xmp/xmp" 22 ) 23 24 var ( 25 NsXmpMM = xmp.NewNamespace("xmpMM", "http://ns.adobe.com/xap/1.0/mm/", NewModel) 26 nsStEvt = xmp.NewNamespace("stEvt", "http://ns.adobe.com/xap/1.0/sType/ResourceEvent#", nil) 27 nsStRef = xmp.NewNamespace("stRef", "http://ns.adobe.com/xap/1.0/sType/ResourceRef#", nil) 28 nsStVer = xmp.NewNamespace("stVer", "http://ns.adobe.com/xap/1.0/sType/Version#", nil) 29 ) 30 31 func init() { 32 xmp.Register(NsXmpMM, xmp.XmpMetadata) 33 xmp.Register(nsStEvt) 34 xmp.Register(nsStRef) 35 xmp.Register(nsStVer) 36 } 37 38 func NewModel(name string) xmp.Model { 39 return &XmpMM{} 40 } 41 42 func MakeModel(d *xmp.Document) (*XmpMM, error) { 43 m, err := d.MakeModel(NsXmpMM) 44 if err != nil { 45 return nil, err 46 } 47 x, _ := m.(*XmpMM) 48 return x, nil 49 } 50 51 func FindModel(d *xmp.Document) *XmpMM { 52 if m := d.FindModel(NsXmpMM); m != nil { 53 return m.(*XmpMM) 54 } 55 return nil 56 } 57 58 type XmpMM struct { 59 DerivedFrom *ResourceRef `xmp:"xmpMM:DerivedFrom"` 60 DocumentID xmp.GUID `xmp:"xmpMM:DocumentID"` 61 History ResourceEventArray `xmp:"xmpMM:History"` 62 Ingredients ResourceRefArray `xmp:"xmpMM:Ingredients"` 63 InstanceID xmp.GUID `xmp:"xmpMM:InstanceID"` 64 ManagedFrom *ResourceRef `xmp:"xmpMM:ManagedFrom"` 65 Manager xmp.AgentName `xmp:"xmpMM:Manager"` 66 ManageTo xmp.Uri `xmp:"xmpMM:ManageTo"` 67 ManageUI xmp.Uri `xmp:"xmpMM:ManageUI"` 68 ManagerVariant string `xmp:"xmpMM:ManagerVariant"` 69 OriginalDocumentID xmp.GUID `xmp:"xmpMM:OriginalDocumentID"` 70 Pantry xmp.ExtensionArray `xmp:"xmpMM:Pantry,omitempty"` 71 RenditionClass xmpdm.RenditionClass `xmp:"xmpMM:RenditionClass"` 72 RenditionParams string `xmp:"xmpMM:RenditionParams"` 73 VersionID string `xmp:"xmpMM:VersionID"` 74 Versions StVersionArray `xmp:"xmpMM:Versions"` 75 } 76 77 func (x XmpMM) Can(nsName string) bool { 78 return NsXmpMM.GetName() == nsName 79 } 80 81 func (x XmpMM) Namespaces() xmp.NamespaceList { 82 return xmp.NamespaceList{NsXmpMM} 83 } 84 85 func (x *XmpMM) SyncModel(d *xmp.Document) error { 86 return nil 87 } 88 89 func (x *XmpMM) SyncFromXMP(d *xmp.Document) error { 90 return nil 91 } 92 93 func (x XmpMM) SyncToXMP(d *xmp.Document) error { 94 return nil 95 } 96 97 func (x *XmpMM) CanTag(tag string) bool { 98 _, err := xmp.GetNativeField(x, tag) 99 return err == nil 100 } 101 102 func (x *XmpMM) GetTag(tag string) (string, error) { 103 if v, err := xmp.GetNativeField(x, tag); err != nil { 104 return "", fmt.Errorf("%s: %v", NsXmpMM.GetName(), err) 105 } else { 106 return v, nil 107 } 108 } 109 110 func (x *XmpMM) SetTag(tag, value string) error { 111 if err := xmp.SetNativeField(x, tag, value); err != nil { 112 return fmt.Errorf("%s: %v", NsXmpMM.GetName(), err) 113 } 114 return nil 115 } 116 117 func (x *XmpMM) AddPantry(d *xmp.Document) { 118 node := xmp.NewNode(xmp.NewName("rdf:Description")) 119 cpy := xmp.NewDocument() 120 cpy.Merge(d, xmp.MERGE) 121 node.Nodes = cpy.Nodes() 122 x.Pantry = append(x.Pantry, (*xmp.Extension)(node)) 123 } 124 125 func (x *XmpMM) AddHistory(e *ResourceEvent) { 126 x.History = append(x.History, e) 127 } 128 129 func (x *XmpMM) AddVersion(v *StVersion) { 130 x.Versions = append(x.Versions, v) 131 } 132 133 func (x *XmpMM) GetLastEvent() *ResourceEvent { 134 if l := len(x.History); l > 0 { 135 return x.History[l-1] 136 } 137 return nil 138 } 139 140 func (x *XmpMM) GetPreviousVersion() *StVersion { 141 if l := len(x.Versions); l > 1 { 142 return x.Versions[l-2] 143 } 144 return nil 145 } 146 147 func (x *XmpMM) GetLastVersion() *StVersion { 148 if l := len(x.Versions); l > 0 { 149 return x.Versions[l-1] 150 } 151 return nil 152 } 153 154 func (x *XmpMM) GetPreviousVersionId() string { 155 if v := x.GetPreviousVersion(); v != nil { 156 return v.Version 157 } 158 return "" 159 } 160 161 func (x *XmpMM) GetLastVersionId() string { 162 if v := x.GetLastVersion(); v != nil { 163 return v.Version 164 } 165 return "" 166 } 167 168 func (x *XmpMM) SetPreviousVersionId(version string) { 169 if l := len(x.Versions); l > 0 { 170 x.Versions[l-1].Version = version 171 } 172 } 173 174 func (x *XmpMM) SelfResourceRef(version string) *ResourceRef { 175 ref := &ResourceRef{ 176 OriginalDocumentID: x.OriginalDocumentID, 177 DocumentID: x.DocumentID, 178 InstanceID: x.InstanceID, 179 Manager: x.Manager, 180 ManagerVariant: x.ManagerVariant, 181 ManageTo: x.ManageTo, 182 ManageUI: x.ManageUI, 183 RenditionClass: x.RenditionClass, 184 RenditionParams: x.RenditionParams, 185 MaskMarkers: xmpdm.MaskNone, 186 VersionID: version, 187 } 188 if e := x.GetLastEvent(); e != nil { 189 ref.LastModifyDate = e.When 190 } 191 return ref 192 } 193 194 // assumes InstanceID and VersionID are changed outside 195 func (x *XmpMM) AppendVersionHistory(action ActionType, modifier, changed string, date xmp.Date) { 196 // append change to last version 197 v := x.GetLastVersion() 198 199 // make new version if none exists or if list does not contain 200 // entry for the current version 201 if v == nil || v.Version != x.VersionID { 202 v = &StVersion{ 203 Event: ResourceEvent{ 204 Action: action, 205 Changed: xmpdm.NewPartList(changed), 206 InstanceID: x.InstanceID, 207 SoftwareAgent: xmp.Agent, 208 When: date, 209 }, 210 Modifier: modifier, 211 ModifyDate: date, 212 Version: x.VersionID, 213 } 214 x.AddVersion(v) 215 return 216 } 217 v.Event.Changed.Add(changed) 218 }