app/vidispine/MetadataValues.scala (52 lines of code) (raw):
package vidispine
/*
Data models for constructing metadata updates that go to Vidispine.
These "write" variants contain only the fields you need to _push_ data, not the extra fields that come back
when you read it
*/
case class MetadataValuesWrite(value:String)
case class MetadataFieldWrite(name:String, value:Seq[MetadataValuesWrite])
case class MetadataFieldGroupWrite(name:String, field:Seq[MetadataFieldWrite])
case class Timespan(field:Seq[MetadataFieldWrite], group:Seq[MetadataFieldGroupWrite], start:String="-INF", end:String="+INF")
case class MetadataWrite(timespan:Seq[Timespan])
object MetadataWrite {
/**
* Convenience method that builds a serializable object to write a key/value pair to item metadata
* @param field Field name to set
* @param value Value to set
* @return A MetadataWrite document, that can be serialized with `.asJson.noSpaces`
*/
def simpleKeyValue(field:String, value:String):MetadataWrite = MetadataWrite(
Seq(
Timespan(
field = Seq(
MetadataFieldWrite(field, value=Seq(MetadataValuesWrite(value)))
),
group = Seq()
)
)
)
def groupedKeyValue(groupName:String, field:String, value:String):MetadataWrite = MetadataWrite(
Seq(
Timespan(
group = Seq(
MetadataFieldGroupWrite(groupName, field=Seq(
MetadataFieldWrite(field, value=Seq(MetadataValuesWrite(value)))
))
),
field = Seq()
)
)
)
/**
* Convenience method that builds a serializable object to write a number of values to the same field in item metadata
* @param field Field name to set
* @param values Values to set
* @return A MetadataWrite document, that can be serialized with `.asJson.noSpaces`
*/
def keyMultipleValue(field: String, values:Seq[String]):MetadataWrite = MetadataWrite(
Seq(
Timespan(
field = Seq(
MetadataFieldWrite(field, value=values.map(MetadataValuesWrite.apply))
),
group = Seq()
)
)
)
}
case class ItemMetadataSimplified(revision:String, timespan:Seq[Timespan])
case class ItemResponseContentSimplified(metadata:ItemMetadataSimplified)
case class ItemResponseSimplified(item:Seq[ItemResponseContentSimplified]) {
/**
* Returns the metadata values, as a string, for the given field. By default only "root" level fields are searched
* but you can look inside a group instead by setting `maybeGroupname`
* @param fieldName Field to look for
* @param maybeGroupname Group name to search within
* @return A sequence of `MetadataValuesWrite`
*/
def valuesForField(fieldName:String, maybeGroupname:Option[String]=None) = {
val timespans = item.flatMap(_.metadata.timespan.filter(t=>t.start=="-INF" && t.end=="+INF"))
val fieldsToSearch = maybeGroupname match {
case None=>timespans.flatMap(_.field)
case Some(groupName)=>timespans.flatMap(_.group.filter(_.name==groupName).flatMap(_.field))
}
fieldsToSearch.filter(_.name==fieldName).flatMap(_.value)
}
}