private VideoUrlParseResult ParsePV(IDatabaseContext <PVForSong> ctx, string url) { if (string.IsNullOrEmpty(url)) { return(null); } var pvResult = pvParser.ParseByUrl(url, true, PermissionContext); if (!pvResult.IsOk) { throw pvResult.Exception; } var existing = ctx.Query().FirstOrDefault( s => s.Service == pvResult.Service && s.PVId == pvResult.Id && !s.Song.Deleted); if (existing != null) { throw new VideoParseException(string.Format("Song '{0}' already contains this PV", existing.Song.TranslatedName[PermissionContext.LanguagePreference])); } return(pvResult); }
public TagUsageForApiContract[] GetTagSuggestions(int albumId) { var maxResults = 3; return(repository.HandleQuery(ctx => { var album = ctx.Load <Album>(albumId); var albumTags = album.Tags.Tags.Select(t => t.Id); var songUsages = ctx.Query <SongTagUsage>() .Where(u => !albumTags.Contains(u.Tag.Id) && !u.Tag.Deleted && !u.Tag.HideFromSuggestions && u.Song.AllAlbums.Any(a => a.Album.Id == albumId)) .WhereTagHasTarget(TagTargetTypes.Album) .GroupBy(t => t.Tag.Id) .Select(t => new { TagId = t.Key, Count = t.Count() }) .Where(t => t.Count > 1) .OrderByDescending(t => t.Count) .Take(maxResults) .ToArray(); var tags = ctx.LoadMultiple <Tag>(songUsages.Select(t => t.TagId)).ToDictionary(t => t.Id); var results = songUsages.Select(t => new TagUsageForApiContract(tags[t.TagId], t.Count, LanguagePreference)); if (songUsages.Length < 3) { var pvResults = album.PVs .Where(pv => pv.Service == PVService.NicoNicoDouga) .Select(pv => pvParser.ParseByUrl(pv.Url, true, permissionContext)) .Where(p => p != null); var nicoTags = pvResults.SelectMany(pv => pv.Tags).Distinct().ToArray(); var mappedTags = new TagMapper().MapTags(ctx, nicoTags) .Where(tag => !albumTags.Contains(tag.Id) && !tags.ContainsKey(tag.Id)); results = results .Concat(mappedTags.Select(tag => new TagUsageForApiContract(tag, 0, LanguagePreference))) .Take(maxResults); } return results.ToArray(); })); }
public PVContract GetPVByUrl(string pvUrl, PVType type = PVType.Original) { if (string.IsNullOrEmpty(pvUrl)) { throw new HttpResponseException(HttpStatusCode.BadRequest); } var result = pvParser.ParseByUrl(pvUrl, true, permissionContext); if (!result.IsOk) { throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest) { ReasonPhrase = result.Exception.Message }); } var contract = new PVContract(result, type); return(contract); }