Ejemplo n.º 1
0
        private NicoTitleParseResult ParseNicoPV(IRepositoryContext <PVForSong> ctx, VideoUrlParseResult res)
        {
            if (res == null || !res.IsOk)
            {
                return(null);
            }

            var titleParseResult = NicoHelper.ParseTitle(res.Title, a => GetArtist(a, ctx, AppConfig.PreferredNicoArtistTypes));

            if (!string.IsNullOrEmpty(titleParseResult.Title))
            {
                titleParseResult.TitleLanguage = languageDetector.Detect(titleParseResult.Title, ContentLanguageSelection.Unspecified);
            }

            if (!string.IsNullOrEmpty(res.AuthorId))
            {
                var authorPage = string.Format("http://www.nicovideo.jp/user/{0}", res.AuthorId);

                var author = ctx.OfType <ArtistWebLink>().Query()
                             .Where(w => w.Url == authorPage && !w.Artist.Deleted)
                             .Select(w => w.Artist)
                             .FirstOrDefault();

                if (author != null)
                {
                    titleParseResult.Artists.Add(author);
                }
            }

            return(titleParseResult);
        }
Ejemplo n.º 2
0
        private void AddTagsFromPV(VideoUrlParseResult pvResult, Song song, IDatabaseContext <Song> ctx)
        {
            if (pvResult.Tags == null || !pvResult.Tags.Any())
            {
                return;
            }

            var user = ctx.OfType <User>().GetLoggedUser(PermissionContext);
            var tags = GetTags(ctx.OfType <Tag>(), pvResult.Tags);

            foreach (var tag in tags)
            {
                if (song.SongType == SongType.Cover && tag.Id == config.SpecialTags.Cover)
                {
                    continue;
                }

                var usage = song.AddTag(tag);

                // Only add the vote if the tag usage isn't added yet.
                if (usage.IsNew)
                {
                    ctx.Save(usage.Result);

                    var vote = usage.Result.CreateVote(user);
                    ctx.Save(vote);

                    ctx.Update(usage.Result.Tag);
                }
            }
        }
Ejemplo n.º 3
0
        public void SetUp()
        {
            producer  = CreateEntry.Producer(id: 1, name: "Tripshots");
            vocalist  = CreateEntry.Vocalist(id: 39, name: "Hatsune Miku");
            vocalist2 = CreateEntry.Vocalist(id: 40, name: "Kagamine Rin");

            song = CreateEntry.Song(id: 1, name: "Nebula");
            song.LengthSeconds = 39;
            repository         = new FakeSongRepository(song);
            Save(song.AddArtist(producer));
            Save(song.AddArtist(vocalist));
            Save(song.CreatePV(new PVContract {
                Id = 1, Service = PVService.Youtube, PVId = "hoLu7c2XZYU", Name = "Nebula", PVType = PVType.Original
            }));
            repository.SaveNames(song);

            user         = CreateEntry.User(id: 1, name: "Miku");
            user.GroupId = UserGroupId.Trusted;
            user2        = CreateEntry.User(id: 2, name: "Rin", email: "*****@*****.**");
            user3        = CreateEntry.User(id: 3, name: "Luka", email: "*****@*****.**");
            repository.Add(user, user2);
            repository.Add(producer, vocalist);

            tag = new Tag("vocarock");
            repository.Add(tag, new Tag("vocaloud"));

            releaseEvent = repository.Save(new ReleaseEvent {
                Name = "Comiket 39"
            });

            permissionContext = new FakePermissionContext(user);
            entryLinkFactory  = new EntryAnchorFactory("http://test.vocadb.net");

            newSongContract = new CreateSongContract {
                SongType = SongType.Original,
                Names    = new[] {
                    new LocalizedStringContract("Resistance", ContentLanguageSelection.English)
                },
                Artists = new[] {
                    new ArtistForSongContract {
                        Artist = new ArtistContract(producer, ContentLanguagePreference.Default)
                    },
                    new ArtistForSongContract {
                        Artist = new ArtistContract(vocalist, ContentLanguagePreference.Default)
                    },
                },
                PVUrl = "http://test.vocadb.net/"
            };

            pvParser            = new FakePVParser();
            pvParser.ResultFunc = (url, getMeta) =>
                                  VideoUrlParseResult.CreateOk(url, PVService.NicoNicoDouga, "sm393939",
                                                               getMeta ? VideoTitleParseResult.CreateSuccess("Resistance", "Tripshots", "testimg.jpg", 39) : VideoTitleParseResult.Empty);

            mailer = new FakeUserMessageMailer();

            queries = new SongQueries(repository, permissionContext, entryLinkFactory, pvParser, mailer,
                                      new FakeLanguageDetector(), new FakeUserIconFactory(), new EnumTranslations(), new InMemoryImagePersister(), new FakeObjectCache(), new Model.Utils.Config.VdbConfigManager());
        }
Ejemplo n.º 4
0
        private VideoUrlParseResult ParseByUrl(string url, bool getTitle, IUserPermissionContext permissionContext)
        {
            if (!MatchedPVs.ContainsKey(url))
            {
                return(ResultFunc != null?ResultFunc(url, getTitle) : VideoUrlParseResult.CreateOk(url, PVService.NicoNicoDouga, "sm393939", VideoTitleParseResult.Empty));
            }

            return(MatchedPVs[url]);
        }
Ejemplo n.º 5
0
        public async Task FindDuplicates_CoverInSongTitle_CoverType()
        {
            pvParser.MatchedPVs.Add("http://www.nicovideo.jp/watch/sm27114783",
                                    VideoUrlParseResult.CreateOk("http://www.nicovideo.jp/watch/sm27114783", PVService.NicoNicoDouga, "123456567",
                                                                 VideoTitleParseResult.CreateSuccess("【GUMI】 光(宇多田ヒカル) 【アレンジカバー】", string.Empty, null, "testimg2.jpg", 33)));

            var result = await CallFindDuplicates(anyPv : new[] { "http://www.nicovideo.jp/watch/sm27114783" });

            Assert.AreEqual(SongType.Cover, result.SongType, "SongType is cover because of the 'cover' in title");
        }
Ejemplo n.º 6
0
        private bool HasCoverTag(IDatabaseContext <PVForSong> ctx, VideoUrlParseResult res)
        {
            if (config.SpecialTags.Cover == 0)
            {
                return(false);
            }

            var coverSourceTag = ctx.Query <TagMapping>().FirstOrDefault(t => t.Tag.Id == config.SpecialTags.Cover)?.SourceTag;

            return(coverSourceTag != null && res.Tags.Contains(coverSourceTag, StringComparer.InvariantCultureIgnoreCase));
        }
Ejemplo n.º 7
0
        private bool HasCoverTag(IDatabaseContext <PVForSong> ctx, VideoUrlParseResult res)
        {
            if (config.SpecialTags.Cover == 0)
            {
                return(false);
            }

            var coverTag = ctx.Load <Tag>(config.SpecialTags.Cover);

            return(res.Tags.Any(t => coverTag.Names.AllValues.Contains(t)));
        }
Ejemplo n.º 8
0
 public static VideoUrlParseResult VideoUrlParseResultWithTitle(
     string url        = "http://nicovideo.jp/watch/sm1234567",
     PVService service = PVService.NicoNicoDouga,
     string id         = "sm1234567",
     string title      = "Resistance",
     string author     = "tripshots",
     string thumbUrl   = "",
     int?length        = null,
     string[] tags     = null)
 {
     return(VideoUrlParseResult.CreateOk(url, service, id, VideoTitleParseResult.CreateSuccess(title, author, thumbUrl, length, tags)));
 }
Ejemplo n.º 9
0
        public void SetUp()
        {
            producer  = CreateEntry.Producer(id: 1, name: "Tripshots");
            vocalist  = CreateEntry.Vocalist(id: 39, name: "Hatsune Miku");
            vocalist2 = CreateEntry.Vocalist(id: 40, name: "Kagamine Rin");

            song = CreateEntry.Song(id: 1, name: "Nebula");
            song.LengthSeconds = 39;
            repository         = new FakeSongRepository(song);
            Save(song.AddArtist(producer));
            Save(song.AddArtist(vocalist));
            Save(song.CreatePV(new PVContract {
                Service = PVService.Youtube, PVId = "hoLu7c2XZYU", Name = "Nebula", PVType = PVType.Original
            }));

            foreach (var name in song.Names)
            {
                repository.Save(name);
            }

            user         = CreateEntry.User(id: 1, name: "Miku");
            user.GroupId = UserGroupId.Trusted;
            user2        = CreateEntry.User(id: 2, name: "Rin", email: "*****@*****.**");
            repository.Add(user, user2);
            repository.Add(producer, vocalist);

            repository.Add(new Tag("vocarock"), new Tag("vocaloud"));

            permissionContext = new FakePermissionContext(user);
            var entryLinkFactory = new EntryAnchorFactory("http://test.vocadb.net");

            newSongContract = new CreateSongContract {
                SongType = SongType.Original,
                Names    = new[] {
                    new LocalizedStringContract("Resistance", ContentLanguageSelection.English)
                },
                Artists = new[] {
                    new ArtistContract(producer, ContentLanguagePreference.Default),
                    new ArtistContract(vocalist, ContentLanguagePreference.Default),
                },
                PVUrl = "http://test.vocadb.net/"
            };

            pvParser            = new FakePVParser();
            pvParser.ResultFunc = (url, getMeta) =>
                                  VideoUrlParseResult.CreateOk(url, PVService.NicoNicoDouga, "sm393939",
                                                               getMeta ? VideoTitleParseResult.CreateSuccess("Resistance", "Tripshots", "testimg.jpg", 39) : VideoTitleParseResult.Empty);

            mailer = new FakeUserMessageMailer();

            queries = new SongQueries(repository, permissionContext, entryLinkFactory, pvParser, mailer, new FakeLanguageDetector());
        }
Ejemplo n.º 10
0
        public async Task FindDuplicates_MatchPV()
        {
            pvParser.MatchedPVs.Add("http://youtu.be/hoLu7c2XZYU",
                                    VideoUrlParseResult.CreateOk("http://youtu.be/hoLu7c2XZYU", PVService.Youtube, "hoLu7c2XZYU", VideoTitleParseResult.Empty));

            var result = await CallFindDuplicates(anyPv : new [] { "http://youtu.be/hoLu7c2XZYU" });

            Assert.AreEqual(1, result.Matches.Length, "Matches");
            var match = result.Matches.First();

            Assert.AreEqual(song.Id, match.Entry.Id, "Matched song");
            Assert.AreEqual(SongMatchProperty.PV, match.MatchProperty, "Matched property");
        }
Ejemplo n.º 11
0
        public PVContract(VideoUrlParseResult parseResult, PVType type)
        {
            ParamIs.NotNull(() => parseResult);

            Author   = parseResult.Author;
            Name     = parseResult.Title;
            PVId     = parseResult.Id;
            Service  = parseResult.Service;
            ThumbUrl = parseResult.ThumbUrl;
            PVType   = type;

            Url = PV.GetUrl(Service, PVId);
        }
Ejemplo n.º 12
0
        public PVContract(VideoUrlParseResult parseResult, PVType type)
        {
            ParamIs.NotNull(() => parseResult);

            Author      = parseResult.Author;
            Length      = parseResult.LengthSeconds ?? 0;
            Name        = parseResult.Title;
            PVId        = parseResult.Id;
            PublishDate = parseResult.UploadDate;
            Service     = parseResult.Service;
            ThumbUrl    = parseResult.ThumbUrl;
            PVType      = type;

            Url = PV.GetUrl(Service, PVId);
        }
Ejemplo n.º 13
0
        public void FindDuplicates_NoMatches_ParsePVInfo()
        {
            // Note: for now only NNDPV will be used for song metadata parsing.
            pvParser.MatchedPVs.Add("http://youtu.be/123456567",
                                    VideoUrlParseResult.CreateOk("http://youtu.be/123456567", PVService.Youtube, "123456567",
                                                                 VideoTitleParseResult.CreateSuccess("Resistance", "Tripshots", "testimg2.jpg", 33)));

            pvParser.MatchedPVs.Add("http://www.nicovideo.jp/watch/sm3183550",
                                    VideoUrlParseResult.CreateOk("http://www.nicovideo.jp/watch/sm3183550", PVService.NicoNicoDouga, "sm3183550",
                                                                 VideoTitleParseResult.CreateSuccess("anger", "Tripshots", "testimg.jpg", 39)));

            var result = CallFindDuplicates(new [] { "【初音ミク】anger PV EDIT【VOCALOID3DPV】" }, new [] { "http://youtu.be/123456567", "http://www.nicovideo.jp/watch/sm3183550" });

            Assert.AreEqual("anger", result.Title, "Title");             // Title from PV
            Assert.AreEqual(0, result.Matches.Length, "No matches");
        }
Ejemplo n.º 14
0
        public async Task FindDuplicates_NoMatches_ParsePVInfo()
        {
            // Note: Nico will be preferred, if available
            pvParser.MatchedPVs.Add("http://youtu.be/123456567",
                                    VideoUrlParseResult.CreateOk("http://youtu.be/123456567", PVService.Youtube, "123456567",
                                                                 VideoTitleParseResult.CreateSuccess("anger PV", "Tripshots", null, "testimg2.jpg", 33)));

            pvParser.MatchedPVs.Add("http://www.nicovideo.jp/watch/sm3183550",
                                    VideoUrlParseResult.CreateOk("http://www.nicovideo.jp/watch/sm3183550", PVService.NicoNicoDouga, "sm3183550",
                                                                 VideoTitleParseResult.CreateSuccess("【初音ミク】anger【VOCALOID3DPV】", "Tripshots", null, "testimg.jpg", 39)));

            var result = await CallFindDuplicates(new [] { "【初音ミク】anger【VOCALOID3DPV】" }, new [] { "http://youtu.be/123456567", "http://www.nicovideo.jp/watch/sm3183550" });

            Assert.AreEqual("anger", result.Title, "Title");             // Title from PV
            Assert.AreEqual(0, result.Matches.Length, "No matches");
        }
Ejemplo n.º 15
0
        public async Task FindDuplicates_ParsePVInfo_YouTube()
        {
            var artist = repository.Save(CreateEntry.Artist(ArtistType.Producer, name: "Clean Tears"));

            repository.Save(artist.CreateWebLink("YouTube", "https://www.youtube.com/channel/UCnHGCQ0pwnRFF5Oe2YTeOcA", WebLinkCategory.Official));

            var titleParseResult = VideoTitleParseResult.CreateSuccess("Clean Tears - Ruby", "Clean Tears", null, "http://tn.smilevideo.jp/smile?i=32347786", 39);

            titleParseResult.Author   = "Clean Tears";
            titleParseResult.AuthorId = "UCnHGCQ0pwnRFF5Oe2YTeOcA";

            pvParser.MatchedPVs.Add("https://youtu.be/aJKY_EeAeYc",
                                    VideoUrlParseResult.CreateOk("https://youtu.be/aJKY_EeAeYc", PVService.Youtube, "aJKY_EeAeYc", titleParseResult));

            var result = await CallFindDuplicates(new string[0], new[] { "https://youtu.be/aJKY_EeAeYc" });

            Assert.AreEqual("Clean Tears - Ruby", result.Title, "Title");             // Title from PV
            Assert.AreEqual(1, result.Artists.Length, "Number of matched artists");
            Assert.AreEqual(artist.Id, result.Artists[0].Id, "Matched artist");
        }
Ejemplo n.º 16
0
        public async Task GetTagSuggestions()
        {
            var tag2 = repository.Save(CreateEntry.Tag("metalcore"));

            repository.Save(new TagMapping(tag, "vocarock"));
            repository.Save(new TagMapping(tag2, "vocacore"));

            pvParser.ResultFunc = (url, getMeta) =>
                                  VideoUrlParseResult.CreateOk(url, PVService.NicoNicoDouga, "sm393939",
                                                               getMeta ? VideoTitleParseResult.CreateSuccess("Resistance", "Tripshots", null, "testimg.jpg", tags: new [] { "vocarock", "vocacore" }) : VideoTitleParseResult.Empty);

            song.AddTag(tag);
            song.PVs.Add(new PVForSong(song, new PVContract {
                Service = PVService.NicoNicoDouga, PVType = PVType.Original, PVId = "sm393939"
            }));

            var result = await queries.GetTagSuggestionsAsync(song.Id);

            Assert.AreEqual(1, result.Count, "One suggestion");
            Assert.AreEqual("metalcore", result[0].Tag.Name, "Tag name");
        }
Ejemplo n.º 17
0
        private void AddTagsFromPV(VideoUrlParseResult pvResult, Song song, IRepositoryContext <Song> ctx)
        {
            if (pvResult.Tags == null || !pvResult.Tags.Any())
            {
                return;
            }

            var user = ctx.OfType <User>().GetLoggedUser(PermissionContext);
            var tags = GetTags(ctx.OfType <Tag>(), pvResult.Tags);

            foreach (var tag in tags)
            {
                var usage = song.AddTag(tag.ActualTag);

                if (usage.IsNew)
                {
                    ctx.Save(usage.Result);

                    var vote = usage.Result.CreateVote(user);
                    ctx.Save(vote);
                }
            }
        }
Ejemplo n.º 18
0
        private NicoTitleParseResult ParseNicoPV(IDatabaseContext <PVForSong> ctx, VideoUrlParseResult res)
        {
            if (res == null || !res.IsOk)
            {
                return(null);
            }

            var titleParseResult = NicoHelper.ParseTitle(res.Title, a => GetArtist(a, ctx, AppConfig.PreferredNicoArtistTypes));

            if (!string.IsNullOrEmpty(titleParseResult.Title))
            {
                titleParseResult.TitleLanguage = languageDetector.Detect(titleParseResult.Title, ContentLanguageSelection.Unspecified);
            }

            if (titleParseResult.SongType == SongType.Unspecified)
            {
                titleParseResult.SongType = HasCoverTag(ctx, res) ? SongType.Cover : SongType.Original;
            }

            if (!string.IsNullOrEmpty(res.AuthorId))
            {
                var authorPage = NicoHelper.GetUserProfileUrlById(res.AuthorId);

                var author = ctx.OfType <ArtistWebLink>().Query()
                             .Where(w => w.Url == authorPage && !w.Entry.Deleted)
                             .Select(w => w.Entry)
                             .FirstOrDefault();

                if (author != null && !titleParseResult.Artists.Contains(author))
                {
                    titleParseResult.Artists.Add(author);
                }
            }

            return(titleParseResult);
        }