public async Task <FeedResult> Feed(IndexRouteParams indexParams) { WebHelper.VerifyUserAgent(Request); var pageSize = (indexParams.pageSize.HasValue ? Math.Min(indexParams.pageSize.Value, 30) : 30); var sortRule = indexParams.sort ?? SongSortRule.Name; var timeFilter = DateTimeUtils.ParseFromSimpleString(indexParams.since); var filter = indexParams.filter; var songType = indexParams.songType ?? SongType.Unspecified; var matchMode = indexParams.matchMode ?? NameMatchMode.Auto; var onlyWithPVs = indexParams.onlyWithPVs ?? false; var minScore = indexParams.minScore ?? 0; var textQuery = SearchTextQuery.Create(filter, matchMode); var queryParams = new SongQueryParams(textQuery, songType != SongType.Unspecified ? new[] { songType } : new SongType[] { }, 0, pageSize, false, sortRule, false, false, null) { ArtistParticipation = { ArtistIds = !indexParams.artistId.HasValue || indexParams.artistId.Value == 0 ? null : new [] { indexParams.artistId.Value } }, TimeFilter = timeFilter, OnlyWithPVs = onlyWithPVs, MinScore = minScore, UserCollectionId = indexParams.userCollectionId ?? 0, FollowedByUserId = indexParams.followedByUserId ?? 0 }; var result = Service.FindWithThumbPreferNotNico(queryParams); var fac = new SongFeedFactory(); var feed = await fac.CreateAsync(result.Items, VocaUriBuilder.CreateAbsolute(Url.Action("Index", indexParams)), song => RenderPartialViewToStringAsync("SongItem", song), song => Url.Action("Details", new { id = song.Id })); return(new FeedResult(new Atom10FeedFormatter(feed))); }