Exemple #1
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());
        }
Exemple #2
0
        public SongContract Create(CreateSongContract contract)
        {
            ParamIs.NotNull(() => contract);

            if (contract.Names == null || !contract.Names.Any())
            {
                throw new ArgumentException("Song needs at least one name", "contract");
            }

            VerifyManageDatabase();

            return(repository.HandleTransaction(ctx => {
                var pvResult = ParsePV(ctx.OfType <PVForSong>(), contract.PVUrl);
                var reprintPvResult = ParsePV(ctx.OfType <PVForSong>(), contract.ReprintPVUrl);

                ctx.AuditLogger.SysLog(string.Format("creating a new song with name '{0}'", contract.Names.First().Value));

                var song = new Song {
                    SongType = contract.SongType,
                    Status = contract.Draft ? EntryStatus.Draft : EntryStatus.Finished
                };

                song.Names.Init(contract.Names, song);

                ctx.Save(song);

                foreach (var artistContract in contract.Artists)
                {
                    var artist = ctx.OfType <Artist>().Load(artistContract.Id);
                    if (!song.HasArtist(artist))
                    {
                        ctx.OfType <ArtistForSong>().Save(song.AddArtist(artist));
                    }
                }

                if (pvResult != null)
                {
                    ctx.OfType <PVForSong>().Save(song.CreatePV(new PVContract(pvResult, PVType.Original)));

                    AddTagsFromPV(pvResult, song, ctx);
                }

                if (reprintPvResult != null)
                {
                    ctx.OfType <PVForSong>().Save(song.CreatePV(new PVContract(reprintPvResult, PVType.Reprint)));
                }

                song.UpdateArtistString();
                Archive(ctx, song, SongArchiveReason.Created);
                ctx.Update(song);

                ctx.AuditLogger.AuditLog(string.Format("created song {0} ({1})", entryLinkFactory.CreateEntryLink(song), song.SongType));
                AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), song, EntryEditEvent.Created);

                new FollowedArtistNotifier().SendNotifications(ctx.OfType <UserMessage>(), song, song.ArtistList, PermissionContext.LoggedUser, entryLinkFactory, mailer);

                return new SongContract(song, PermissionContext.LanguagePreference);
            }));
        }
Exemple #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 {
                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());
        }
Exemple #4
0
        public SongContract PostNewSong(CreateSongContract contract)
        {
            if (contract == null)
            {
                throw new HttpBadRequestException("Message was empty");
            }

            try {
                return(queries.Create(contract));
            } catch (VideoParseException x) {
                throw new HttpBadRequestException(x.Message);
            } catch (ArgumentException x) {
                throw new HttpBadRequestException(x.Message);
            }
        }
Exemple #5
0
        public async Task <ActionResult <SongContract> > PostNewSong(CreateSongContract contract)
        {
            if (contract == null)
            {
                return(BadRequest("Message was empty"));
            }

            try
            {
                return(await _queries.Create(contract));
            }
            catch (VideoParseException x)
            {
                return(BadRequest(x.Message));
            }
            catch (ArgumentException x)
            {
                return(BadRequest(x.Message));
            }
        }
Exemple #6
0
        protected void DoCreateSong(object sender, EventArgs e)
        {
            string name       = nameBox.Text;
            string nicoId     = nicoIdBox.Text;
            int    albumId    = int.Parse(albumList.SelectedValue);
            int    producerId = int.Parse(producerList.SelectedValue);
            int    vocaloidId = int.Parse(vocaloidList.SelectedValue);

            if (name == string.Empty)
            {
                ErrorMsg = "Name cannot be empty";
            }

            if (HasErrors)
            {
                DataBind();
                return;
            }

            var song = new CreateSongContract {
                BasicData = new SongContract {
                    Name   = name,
                    NicoId = nicoId
                },
                AlbumId     = albumId,
                ProducerId  = producerId,
                PerformerId = vocaloidId
            };

            try {
                CreatedSong = Services.Songs.CreateSong(song);
                DataBind();
            } catch (ServiceException x) {
                ErrorMsg = x.Message;
                DataBind();
                return;
            }
        }
Exemple #7
0
        public SongContract CreateSong(CreateSongContract contract)
        {
            return(HandleTransaction(session => {
                if (!string.IsNullOrEmpty(contract.BasicData.NicoId))
                {
                    var existing = session.Linq <Song>().FirstOrDefault(s => s.NicoId == contract.BasicData.NicoId);

                    if (existing != null)
                    {
                        throw new ServiceException("Song with NicoId '" + contract.BasicData.NicoId + "' has already been added");
                    }
                }

                var song = new Song(new LocalizedString(contract.BasicData.Name), contract.BasicData.NicoId);

                if (contract.AlbumId != null)
                {
                    song.AddAlbum(session.Load <Album>(contract.AlbumId.Value), 0);
                }

                if (contract.PerformerId != null)
                {
                    song.AddArtist(session.Load <Artist>(contract.PerformerId.Value));
                }

                if (contract.ProducerId != null)
                {
                    song.AddArtist(session.Load <Artist>(contract.ProducerId.Value));
                }

                song.UpdateArtistString();
                session.Save(song);

                return new SongContract(song);
            }));
        }
Exemple #8
0
        public SongContract Create(CreateSongContract contract)
        {
            ParamIs.NotNull(() => contract);

            if (contract.Names == null || !contract.Names.Any())
            {
                throw new ArgumentException("Song needs at least one name", nameof(contract));
            }

            VerifyManageDatabase();

            return(repository.HandleTransaction(ctx => {
                var pvResult = ParsePV(ctx.OfType <PVForSong>(), contract.PVUrl);
                var reprintPvResult = ParsePV(ctx.OfType <PVForSong>(), contract.ReprintPVUrl);

                ctx.AuditLogger.SysLog(string.Format("creating a new song with name '{0}'", contract.Names.First().Value));

                var diff = new SongDiff {
                    Names = true
                };
                var song = new Song {
                    SongType = contract.SongType
                };

                if (contract.OriginalVersion != null && contract.OriginalVersion.Id != 0)
                {
                    song.OriginalVersion = ctx.Load(contract.OriginalVersion.Id);
                    diff.OriginalVersion = true;
                }

                song.Names.Init(contract.Names, song);

                ctx.Save(song);

                foreach (var artistContract in contract.Artists)
                {
                    if (artistContract.Artist != null)
                    {
                        var artist = ctx.OfType <Artist>().Load(artistContract.Artist.Id);
                        if (!song.HasArtist(artist))
                        {
                            ctx.OfType <ArtistForSong>().Save(song.AddArtist(artist, artistContract.IsSupport, artistContract.Roles));
                        }
                    }
                    else
                    {
                        ctx.OfType <ArtistForSong>().Save(song.AddArtist(artistContract.Name, artistContract.IsSupport, artistContract.Roles));
                    }
                }

                diff.Artists = contract.Artists.Any();

                var pvs = new List <PVContract>();

                if (pvResult != null)
                {
                    pvs.Add(new PVContract(pvResult, PVType.Original));

                    AddTagsFromPV(pvResult, song, ctx);
                }

                if (reprintPvResult != null)
                {
                    pvs.Add(new PVContract(reprintPvResult, PVType.Reprint));
                }

                var pvDiff = song.SyncPVs(pvs);
                ctx.OfType <PVForSong>().Sync(pvDiff);
                diff.PVs = pvs.Any();

                if (contract.WebLinks != null)
                {
                    var weblinksDiff = ctx.Sync(WebLink.Sync(song.WebLinks, contract.WebLinks, song));
                    diff.WebLinks = weblinksDiff.Changed;
                }

                if (contract.Lyrics != null && contract.Lyrics.Any())
                {
                    contract.Lyrics.ForEach(song.CreateLyrics);
                    diff.Lyrics = true;
                }

                song.Status = (contract.Draft || !(new SongValidator().IsValid(song, config.SpecialTags.Instrumental))) ? EntryStatus.Draft : EntryStatus.Finished;

                song.UpdateArtistString();

                var archived = Archive(ctx, song, diff, SongArchiveReason.Created, contract.UpdateNotes ?? string.Empty);
                ctx.Update(song);

                ctx.AuditLogger.AuditLog(string.Format("created song {0} ({1})", entryLinkFactory.CreateEntryLink(song), song.SongType));
                AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), song, EntryEditEvent.Created, archived);

                new FollowedArtistNotifier().SendNotifications(ctx.OfType <UserMessage>(), song, song.ArtistList, PermissionContext.LoggedUser, entryLinkFactory, mailer);

                return new SongContract(song, PermissionContext.LanguagePreference);
            }));
        }
Exemple #9
0
        public SongContract Create(CreateSongContract contract)
        {
            ParamIs.NotNull(() => contract);

            if (contract.Names == null || !contract.Names.Any())
            {
                throw new ArgumentException("Song needs at least one name", nameof(contract));
            }

            VerifyManageDatabase();

            return(repository.HandleTransaction(ctx => {
                var pvResult = ParsePV(ctx.OfType <PVForSong>(), contract.PVUrl);
                var reprintPvResult = ParsePV(ctx.OfType <PVForSong>(), contract.ReprintPVUrl);

                ctx.AuditLogger.SysLog(string.Format("creating a new song with name '{0}'", contract.Names.First().Value));

                var diff = new SongDiff();
                diff.Names.Set();
                var song = new Song {
                    SongType = contract.SongType
                };

                if (contract.OriginalVersion != null && contract.OriginalVersion.Id != 0)
                {
                    song.OriginalVersion = ctx.Load(contract.OriginalVersion.Id);
                    diff.OriginalVersion.Set();
                }

                song.Names.Init(contract.Names, song);

                ctx.Save(song);

                foreach (var artistContract in contract.Artists)
                {
                    if (artistContract.Artist != null)
                    {
                        var artist = ctx.OfType <Artist>().Load(artistContract.Artist.Id);
                        if (!song.HasArtist(artist))
                        {
                            ctx.OfType <ArtistForSong>().Save(song.AddArtist(artist, artistContract.IsSupport, artistContract.Roles));
                        }
                    }
                    else
                    {
                        ctx.OfType <ArtistForSong>().Save(song.AddArtist(artistContract.Name, artistContract.IsSupport, artistContract.Roles));
                    }
                }

                diff.Artists.Set(contract.Artists.Any());

                var pvs = new List <PVContract>();
                Tag[] addedTags = null;

                if (pvResult != null)
                {
                    pvs.Add(new PVContract(pvResult, PVType.Original));

                    addedTags = AddTagsFromPV(pvResult, song, ctx);
                }

                if (reprintPvResult != null)
                {
                    pvs.Add(new PVContract(reprintPvResult, PVType.Reprint));
                }

                var pvDiff = song.SyncPVs(pvs);
                ctx.OfType <PVForSong>().Sync(pvDiff);
                diff.PVs.Set(pvs.Any());

                if (contract.WebLinks != null)
                {
                    var weblinksDiff = ctx.Sync(WebLink.Sync(song.WebLinks, contract.WebLinks, song));
                    diff.WebLinks.Set(weblinksDiff.Changed);
                }

                if (contract.Lyrics != null && contract.Lyrics.Any())
                {
                    contract.Lyrics.ForEach(song.CreateLyrics);
                    diff.Lyrics.Set();
                }

                song.Status = (contract.Draft || !(new SongValidator().IsValid(song, config.SpecialTags.Instrumental))) ? EntryStatus.Draft : EntryStatus.Finished;

                song.UpdateArtistString();

                var archived = Archive(ctx, song, diff, SongArchiveReason.Created, contract.UpdateNotes ?? string.Empty);
                ctx.Update(song);

                var logStr = string.Format("created song {0} of type {1} ({2})", entryLinkFactory.CreateEntryLink(song), song.SongType, diff.ChangedFieldsString)
                             + (!string.IsNullOrEmpty(contract.UpdateNotes) ? " " + HttpUtility.HtmlEncode(contract.UpdateNotes) : string.Empty)
                             .Truncate(400);

                ctx.AuditLogger.AuditLog(logStr);
                AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), song, EntryEditEvent.Created, archived);

                var user = PermissionContext.LoggedUser;

                // Send notifications. Avoid sending notification to the same users twice.
                var notifiedUsers = new FollowedArtistNotifier().SendNotifications(ctx, song, song.ArtistList, user, entryLinkFactory, mailer, enumTranslations);

                if (addedTags != null && addedTags.Length > 0)
                {
                    new FollowedTagNotifier().SendNotifications(ctx, song, addedTags, notifiedUsers.Select(u => u.Id).Concat(new[] { user.Id }).ToArray(), entryLinkFactory, enumTranslations);
                }

                return new SongContract(song, PermissionContext.LanguagePreference);
            }));
        }