// Fetch returns a group from the collection with the given path. func (l *Library) Fetch(c index.Collection, path []string) (group, error) { if len(path) == 0 { return build(c, index.Key("Root")), nil } var g index.Group = c k := index.Key(path[0]) g = c.Get(k) if g == nil { return group{}, fmt.Errorf("invalid path: near '%v'", path[0]) } index.Sort(g.Tracks(), index.MultiSort(index.SortByInt("DiscNumber"), index.SortByInt("TrackNumber"))) c = index.Collect(g, index.ByPrefix("Name")) g = index.SubTransform(c, index.TrimEnumPrefix) g = index.SumGroupIntAttr("TotalTime", g) commonFields := []index.Attr{ index.StringAttr("Album"), index.StringAttr("Artist"), index.StringAttr("AlbumArtist"), index.StringAttr("Composer"), index.IntAttr("Year"), index.IntAttr("BitRate"), index.IntAttr("DiscNumber"), } g = index.CommonGroupAttr(commonFields, g) g = index.RemoveEmptyCollections(g) for i, p := range path[1:] { var ok bool c, ok = g.(index.Collection) if !ok { return group{}, fmt.Errorf("retrieved Group is not a Collection") } k = index.Key(p) g = c.Get(k) if g == nil { return group{}, fmt.Errorf("invalid path near '%v'", path[1:][i]) } if _, ok = g.(index.Collection); !ok { if i == len(path[1:])-1 { break } return group{}, fmt.Errorf("retrieved Group isn't a Collection: %v", p) } } if g == nil { return group{}, fmt.Errorf("could not find group") } g = index.FirstTrackAttr(index.StringAttr("TrackID"), g) return build(g, k), nil }
func buildCollection(h group, c index.Collection) group { getField := func(f string, g index.Group, c index.Collection) interface{} { if g.Field(f) == c.Field(f) { return nil } return g.Field(f) } for _, k := range c.Keys() { g := c.Get(k) g = index.FirstTrackAttr(index.StringAttr("AlbumArtist"), g) g = index.CommonGroupAttr([]index.Attr{index.StringAttr("Artist")}, g) h.Groups = append(h.Groups, group{ Name: g.Name(), Key: k, AlbumArtist: getField("AlbumArtist", g, c), Artist: getField("Artist", g, c), }) } return h }