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  }