Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
            }));
        }
Beispiel #3
0
        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);
        }