func (fe *Newsong) GET(c *kocha.Context) error { data := c.Data.(map[string]interface{}) selectedVocaloids := data["SelectedVocaloids"].([]*model.Vocaloid) p, err := strconv.Atoi(c.Params.Get("p")) if err != nil { p = 1 } offset := int(math.Max(itemsPerPage, 0) * math.Max(float64(p-1), 0)) songs, err := model.Songs.FindByVocaloid(selectedVocaloids, offset, itemsPerPage) if err != nil { return c.RenderError(500, err, nil) } if len(selectedVocaloids) == 0 { selectedVocaloids = append(selectedVocaloids, &model.Vocaloid{Key: "vocaloid", Name: "VOCALOID"}) } latestUpdate, err := model.Songs.LatestUpdate() if err != nil { return c.RenderError(500, err, nil) } feed := &feeds.Feed{ Title: "VOCALOID新曲 - ぼかにゅー", Link: &feeds.Link{Href: c.Request.URL.String(), Rel: "alternate"}, Description: selectedVocaloids[0].Name + "の新曲", Author: &feeds.Author{Name: "ぼかにゅー"}, Updated: latestUpdate, } var buf bytes.Buffer for _, v := range songs { buf.Reset() if err := rssDescription.Execute(&buf, v); err != nil { return c.RenderError(500, err, nil) } feed.Add(&feeds.Item{ Title: v.Title, Link: &feeds.Link{Href: "http://www.nicovideo.jp/watch/" + v.VideoId, Rel: "alternate"}, Description: buf.String(), Updated: v.PostTime, }) } var xml string if c.Params.Get("rss") == "2.0" { c.Response.ContentType = "application/rss+xml" xml, err = feed.ToRss() } else { c.Response.ContentType = "application/atom+xml" xml, err = feed.ToAtom() } if err != nil { return c.RenderError(500, err, nil) } return c.RenderText(xml) }