Files
photoprism/internal/commands/show_metadata.go
2025-09-21 13:46:59 +02:00

74 lines
1.9 KiB
Go

package commands
import (
"encoding/json"
"fmt"
"sort"
"github.com/urfave/cli/v2"
"github.com/photoprism/photoprism/internal/meta"
"github.com/photoprism/photoprism/pkg/txt/report"
)
// ShowMetadataCommand configures the command name, flags, and action.
var ShowMetadataCommand = &cli.Command{
Name: "metadata",
Aliases: []string{"meta"},
Usage: "Displays supported metadata tags and standards",
Flags: append(report.CliFlags, &cli.BoolFlag{
Name: "short",
Aliases: []string{"s"},
Usage: "hide links to documentation",
}),
Action: showMetadataAction,
}
// showMetadataAction reports supported Exif and XMP metadata tags.
func showMetadataAction(ctx *cli.Context) error {
rows, cols := meta.Report(&meta.Data{})
// Sort rows by type data type and name.
sort.Slice(rows, func(i, j int) bool {
if rows[i][1] == rows[j][1] {
return rows[i][0] < rows[j][0]
} else {
return rows[i][1] < rows[j][1]
}
})
// Output overview of supported metadata tags.
format, ferr := report.CliFormatStrict(ctx)
if ferr != nil {
return ferr
}
if format == report.JSON {
resp := struct {
Items []map[string]string `json:"items"`
Docs []map[string]string `json:"docs,omitempty"`
}{
Items: report.RowsToObjects(rows, cols),
}
if !ctx.Bool("short") {
resp.Docs = report.RowsToObjects(meta.Docs, []string{"Namespace", "Documentation"})
}
b, err := json.Marshal(resp)
if err != nil {
return err
}
fmt.Println(string(b))
return nil
}
result, err := report.RenderFormat(rows, cols, format)
fmt.Println(result)
if err != nil || ctx.Bool("short") || format == report.TSV {
return err
}
// Documentation links for those who want to delve deeper.
result, err = report.RenderFormat(meta.Docs, []string{"Namespace", "Documentation"}, format)
fmt.Printf("## Metadata Tags by Namespace ##\n\n")
fmt.Println(result)
return err
}