Beispiel #1
0
        public virtual ArtistForAlbum AddArtist(Artist artist, bool isSupport, ArtistRoles roles)
        {
            ParamIs.NotNull(() => artist);

            return(artist.AddAlbum(this, isSupport, roles));
        }
Beispiel #2
0
        public virtual bool HasPV(PVService service, string pvId)
        {
            ParamIs.NotNullOrEmpty(() => pvId);

            return(PVs.Any(p => p.Service == service && p.PVId == pvId));
        }
Beispiel #3
0
        public virtual bool IsOnAlbum(Album album)
        {
            ParamIs.NotNull(() => album);

            return(Albums.Any(a => a.Album.Equals(album)));
        }
Beispiel #4
0
        /*public virtual SongInAlbum AddAlbum(Album album, int trackNumber) {
         *
         *      var link = new SongInAlbum(this, album, trackNumber);
         *      AllAlbums.Add(link);
         *      return link;
         *
         * }*/

        public virtual ArtistForSong AddArtist(Artist artist)
        {
            ParamIs.NotNull(() => artist);

            return(artist.AddSong(this));
        }
Beispiel #5
0
        /// <summary>
        /// Checks whether this song has a specific artist.
        /// </summary>
        /// <param name="artistLink">Artist to be checked. Cannot be null.</param>
        /// <returns>True if the artist has this album. Otherwise false.</returns>
        public virtual bool HasArtistLink(ArtistForSong artistLink)
        {
            ParamIs.NotNull(() => artistLink);

            return(Artists.Any(a => a.ArtistLinkEquals(artistLink)));
        }
Beispiel #6
0
        public static string EntryDetails(this UrlHelper urlHelper, IEntryBase entryBase)
        {
            ParamIs.NotNull(() => entryBase);

            return(EntryDetails(urlHelper, entryBase.EntryType, entryBase.Id, null));
        }
Beispiel #7
0
        public static string SongDetails(this UrlHelper urlHelper, IEntryBase song, int?albumId = null)
        {
            ParamIs.NotNull(() => song);

            return(urlHelper.Action("Details", "Song", new { id = song.Id, albumId }));
        }
        public ArtistForSongContract(ArtistContract artistContract)
        {
            ParamIs.NotNull(() => artistContract);

            Artist = artistContract;
        }
        public ArtistForSongContract(string name)
        {
            ParamIs.NotNullOrEmpty(() => name);

            Name = name;
        }
Beispiel #10
0
        public ImageThumbGenerator(IEntryImagePersister persister)
        {
            ParamIs.NotNull(() => persister);

            _persister = persister;
        }
Beispiel #11
0
        public AlbumDetails(AlbumDetailsContract contract, IUserPermissionContext permissionContext)
        {
            ParamIs.NotNull(() => contract);

            AdditionalNames            = contract.AdditionalNames;
            ArtistString               = contract.ArtistString;
            CanEdit                    = EntryPermissionManager.CanEdit(permissionContext, contract);
            CanEditPersonalDescription = contract.CanEditPersonalDescription;
            CanRemoveTagUsages         = contract.CanRemoveTagUsages;
            CommentCount               = contract.CommentCount;
            CreateDate                 = contract.CreateDate;
            Description                = contract.Description;
            Deleted                    = contract.Deleted;
            DiscType                   = contract.DiscType;
            Draft                     = contract.Status == EntryStatus.Draft;
            Hits                      = contract.Hits;
            Id                        = contract.Id;
            LatestComments            = contract.LatestComments;
            MergedTo                  = contract.MergedTo;
            Name                      = contract.Name;
            OwnedBy                   = contract.OwnedCount;
            PersonalDescriptionText   = contract.PersonalDescriptionText;
            PersonalDescriptionAuthor = contract.PersonalDescriptionAuthor;
            Pictures                  = contract.Pictures;
            PVs                       = contract.PVs;
            RatingAverage             = contract.RatingAverage;
            RatingCount               = contract.RatingCount;
            Status                    = contract.Status;
            Tags                      = contract.Tags;
            TotalLength               = contract.TotalLength;
            UserHasAlbum              = contract.AlbumForUser != null;
            Version                   = contract.Version;
            WebLinks                  = contract.WebLinks;
            WishlistedBy              = contract.WishlistCount;
            mime                      = contract.CoverPictureMime;

            var songsByDiscs = contract.Songs.GroupBy(s => s.DiscNumber);

            Discs =
                (from songsByDisc in songsByDiscs
                 let dn = songsByDisc.Key
                          select new AlbumDisc(dn, songsByDisc, contract.Discs.ContainsKey(dn) ? contract.Discs[dn] : null))
                .ToArray();

            if (contract.AlbumForUser != null)
            {
                AlbumMediaType      = contract.AlbumForUser.MediaType;
                AlbumPurchaseStatus = contract.AlbumForUser.PurchaseStatus;
                CollectionRating    = contract.AlbumForUser.Rating;
            }

            if (contract.OriginalRelease != null)
            {
                CatNum          = contract.OriginalRelease.CatNum;
                ReleaseEvent    = contract.OriginalRelease.ReleaseEvent;
                ReleaseDate     = contract.OriginalRelease.ReleaseDate;
                FullReleaseDate = ReleaseDate.Year.HasValue && ReleaseDate.Month.HasValue && ReleaseDate.Day.HasValue ? (DateTime?)new DateTime(ReleaseDate.Year.Value, ReleaseDate.Month.Value, ReleaseDate.Day.Value) : null;
            }

            var artists = contract.ArtistLinks;

            Bands        = artists.Where(a => a.Categories.HasFlag(ArtistCategories.Band)).ToArray();
            Circles      = artists.Where(a => a.Categories.HasFlag(ArtistCategories.Circle)).ToArray();
            Labels       = artists.Where(a => a.Categories.HasFlag(ArtistCategories.Label)).ToArray();
            Producers    = artists.Where(a => a.Categories.HasFlag(ArtistCategories.Producer)).ToArray();
            Vocalists    = artists.Where(a => a.Categories.HasFlag(ArtistCategories.Vocalist)).ToArray();
            OtherArtists = artists.Where(a => a.Categories.HasFlag(ArtistCategories.Other) || a.Categories.HasFlag(ArtistCategories.Animator)).ToArray();

            PrimaryPV = PVHelper.PrimaryPV(PVs);
        }
Beispiel #12
0
        public virtual bool IsInUserCollection(User user)
        {
            ParamIs.NotNull(() => user);

            return(UserCollections.Any(w => w.User.Equals(user)));
        }
Beispiel #13
0
        public virtual bool HasSong(Song song)
        {
            ParamIs.NotNull(() => song);

            return(Songs.Any(a => song.Equals(a.Song)));
        }
Beispiel #14
0
        /// <summary>
        /// Checks whether this album has a specific artist.
        /// </summary>
        /// <param name="artistForAlbum">Artist to be checked. Cannot be null.</param>
        /// <returns>True if the artist has this album. Otherwise false.</returns>
        public virtual bool HasArtistForAlbum(ArtistForAlbum artistForAlbum)
        {
            ParamIs.NotNull(() => artistForAlbum);

            return(Artists.Any(a => a.ArtistLinkEquals(artistForAlbum)));
        }
Beispiel #15
0
        /// <summary>
        /// Updates or creates release event.
        ///
        /// Album release event names will be updated as well if the name changed.
        /// </summary>
        /// <param name="contract">Updated contract. Cannot be null.</param>
        /// <returns>Updated release event data. Cannot be null.</returns>
        /// <exception cref="DuplicateEventNameException">If the event name is already in use.</exception>
        public ReleaseEventContract Update(ReleaseEventForEditContract contract, EntryPictureFileContract pictureData)
        {
            ParamIs.NotNull(() => contract);

            PermissionContext.VerifyManageDatabase();

            return(repository.HandleTransaction(session => {
                ReleaseEvent ev;

                if (contract.Id == 0)
                {
                    var diff = new ReleaseEventDiff();

                    if (!contract.Series.IsNullOrDefault())
                    {
                        var series = session.OfType <ReleaseEventSeries>().Load(contract.Series.Id);
                        ev = new ReleaseEvent(contract.Description, contract.Date, series, contract.SeriesNumber, contract.SeriesSuffix,
                                              contract.DefaultNameLanguage, contract.CustomName);
                        series.AllEvents.Add(ev);
                    }
                    else
                    {
                        ev = new ReleaseEvent(contract.Description, contract.Date, contract.DefaultNameLanguage);
                    }

                    ev.Category = contract.Category;
                    ev.EndDate = contract.EndDate;
                    ev.SongList = session.NullSafeLoad <SongList>(contract.SongList);
                    ev.Status = contract.Status;
                    ev.VenueName = contract.VenueName;

                    if (contract.SongList != null)
                    {
                        diff.SongList.Set();
                    }

                    if (!string.IsNullOrEmpty(contract.VenueName))
                    {
                        diff.Venue.Set();
                    }

                    var weblinksDiff = WebLink.Sync(ev.WebLinks, contract.WebLinks, ev);

                    if (weblinksDiff.Changed)
                    {
                        diff.WebLinks.Set();
                    }

                    var pvDiff = ev.PVs.Sync(contract.PVs, ev.CreatePV);
                    session.OfType <PVForAlbum>().Sync(pvDiff);

                    if (pvDiff.Changed)
                    {
                        diff.PVs.Set();
                    }

                    var artistDiff = ev.SyncArtists(contract.Artists, artistId => session.Load <Artist>(artistId));

                    if (artistDiff.Changed)
                    {
                        diff.Artists.Set();
                    }

                    session.Save(ev);

                    var namesChanged = new UpdateEventNamesQuery().UpdateNames(session, ev, contract.Series, contract.CustomName, contract.SeriesNumber, contract.SeriesSuffix, contract.Names);
                    if (namesChanged)
                    {
                        session.Update(ev);
                    }

                    if (pictureData != null)
                    {
                        diff.MainPicture.Set();
                        SaveImage(ev, pictureData);
                        session.Update(ev);
                    }

                    var archived = Archive(session, ev, diff, EntryEditEvent.Created, string.Empty);
                    AddEntryEditedEntry(session.OfType <ActivityEntry>(), archived);

                    session.AuditLogger.AuditLog(string.Format("created {0}", entryLinkFactory.CreateEntryLink(ev)));

                    new FollowedArtistNotifier().SendNotifications(session, ev, ev.Artists.Where(a => a?.Artist != null).Select(a => a.Artist), PermissionContext.LoggedUser, entryLinkFactory, mailer, enumTranslations);
                }
                else
                {
                    ev = session.Load(contract.Id);
                    permissionContext.VerifyEntryEdit(ev);

                    var diff = new ReleaseEventDiff(DoSnapshot(ev, session));

                    if (ev.Category != contract.Category)
                    {
                        diff.Category.Set();
                    }

                    if (!ev.Date.Equals(contract.Date) || !ev.EndDate.Equals(contract.EndDate))
                    {
                        diff.Date.Set();
                    }

                    if (ev.Description != contract.Description)
                    {
                        diff.Description.Set();
                    }

                    var inheritedLanguage = ev.Series == null || contract.CustomName ? contract.DefaultNameLanguage : ev.Series.TranslatedName.DefaultLanguage;
                    if (ev.TranslatedName.DefaultLanguage != inheritedLanguage)
                    {
                        diff.OriginalName.Set();
                    }

                    var namesChanged = new UpdateEventNamesQuery().UpdateNames(session, ev, contract.Series, contract.CustomName, contract.SeriesNumber, contract.SeriesSuffix, contract.Names);

                    if (namesChanged)
                    {
                        diff.Names.Set();
                    }

                    if (!ev.Series.NullSafeIdEquals(contract.Series))
                    {
                        diff.Series.Set();
                    }

                    if (ev.SeriesNumber != contract.SeriesNumber)
                    {
                        diff.SeriesNumber.Set();
                    }

                    if (ev.SeriesSuffix != contract.SeriesSuffix)
                    {
                        diff.SeriesSuffix.Set();
                    }

                    if (!ev.SongList.NullSafeIdEquals(contract.SongList))
                    {
                        diff.SongList.Set();
                    }

                    if (ev.Status != contract.Status)
                    {
                        diff.Status.Set();
                    }

                    if (!string.Equals(ev.VenueName, contract.VenueName))
                    {
                        diff.Venue.Set();
                    }

                    ev.SetSeries(session.NullSafeLoad <ReleaseEventSeries>(contract.Series));
                    ev.Category = contract.Category;
                    ev.CustomName = contract.CustomName;
                    ev.Date = contract.Date;
                    ev.Description = contract.Description;
                    ev.EndDate = contract.EndDate > contract.Date ? contract.EndDate : null;
                    ev.SeriesNumber = contract.SeriesNumber;
                    ev.SeriesSuffix = contract.SeriesSuffix;
                    ev.SongList = session.NullSafeLoad <SongList>(contract.SongList);
                    ev.Status = contract.Status;
                    ev.TranslatedName.DefaultLanguage = inheritedLanguage;
                    ev.VenueName = contract.VenueName;

                    var weblinksDiff = WebLink.Sync(ev.WebLinks, contract.WebLinks, ev);

                    if (weblinksDiff.Changed)
                    {
                        diff.WebLinks.Set();
                        session.OfType <ReleaseEventWebLink>().Sync(weblinksDiff);
                    }

                    var pvDiff = ev.PVs.Sync(contract.PVs, ev.CreatePV);
                    session.OfType <PVForAlbum>().Sync(pvDiff);

                    if (pvDiff.Changed)
                    {
                        diff.PVs.Set();
                    }

                    var artistDiff = ev.SyncArtists(contract.Artists, artistId => session.Load <Artist>(artistId));

                    if (artistDiff.Changed)
                    {
                        diff.Artists.Set();
                    }

                    if (pictureData != null)
                    {
                        diff.MainPicture.Set();
                        SaveImage(ev, pictureData);
                    }

                    session.Update(ev);

                    var archived = Archive(session, ev, diff, EntryEditEvent.Updated, string.Empty);
                    AddEntryEditedEntry(session.OfType <ActivityEntry>(), archived);

                    var logStr = string.Format("updated properties for {0} ({1})", entryLinkFactory.CreateEntryLink(ev), diff.ChangedFieldsString);
                    session.AuditLogger.AuditLog(logStr);

                    var newSongCutoff = TimeSpan.FromHours(1);
                    if (artistDiff.Added.Any() && ev.CreateDate >= DateTime.Now - newSongCutoff)
                    {
                        var addedArtists = artistDiff.Added.Where(a => a.Artist != null).Select(a => a.Artist).Distinct().ToArray();

                        if (addedArtists.Any())
                        {
                            new FollowedArtistNotifier().SendNotifications(session, ev, addedArtists, PermissionContext.LoggedUser, entryLinkFactory, mailer, enumTranslations);
                        }
                    }
                }

                return new ReleaseEventContract(ev, LanguagePreference);
            }));
        }
Beispiel #16
0
        public static ArtistCategories GetCategories(IArtistWithSupport artist)
        {
            ParamIs.NotNull(() => artist);

            return(GetCategories(artist.Artist != null ? artist.Artist.ArtistType : ArtistType.Unknown, artist.Roles));
        }
Beispiel #17
0
        public int UpdateSeries(ReleaseEventSeriesForEditContract contract, EntryPictureFileContract pictureData)
        {
            ParamIs.NotNull(() => contract);

            PermissionContext.VerifyManageDatabase();

            return(HandleTransaction(session => {
                ReleaseEventSeries series;

                if (contract.Id == 0)
                {
                    series = new ReleaseEventSeries(contract.DefaultNameLanguage, contract.Names, contract.Description)
                    {
                        Category = contract.Category,
                        Status = contract.Status
                    };
                    session.Save(series);

                    var diff = new ReleaseEventSeriesDiff(ReleaseEventSeriesEditableFields.OriginalName | ReleaseEventSeriesEditableFields.Names);

                    diff.Description.Set(!string.IsNullOrEmpty(contract.Description));

                    var weblinksDiff = WebLink.Sync(series.WebLinks, contract.WebLinks, series);

                    if (weblinksDiff.Changed)
                    {
                        diff.WebLinks.Set();
                        session.OfType <ReleaseEventWebLink>().Sync(weblinksDiff);
                    }

                    if (pictureData != null)
                    {
                        diff.Picture.Set();
                        SaveImage(series, pictureData);
                        session.Update(series);
                    }

                    session.Update(series);

                    Archive(session, series, diff, EntryEditEvent.Created, string.Empty);

                    AuditLog(string.Format("created {0}", entryLinkFactory.CreateEntryLink(series)), session);
                }
                else
                {
                    series = session.Load <ReleaseEventSeries>(contract.Id);
                    permissionContext.VerifyEntryEdit(series);
                    var diff = new ReleaseEventSeriesDiff(ReleaseEventSeriesEditableFields.Nothing);

                    if (series.TranslatedName.DefaultLanguage != contract.DefaultNameLanguage)
                    {
                        series.TranslatedName.DefaultLanguage = contract.DefaultNameLanguage;
                        diff.OriginalName.Set();
                    }

                    var nameDiff = series.Names.Sync(contract.Names, series);
                    session.Sync(nameDiff);

                    if (nameDiff.Changed)
                    {
                        diff.Names.Set();
                    }


                    if (series.Category != contract.Category)
                    {
                        diff.Category.Set();
                        series.Category = contract.Category;
                    }

                    if (series.Description != contract.Description)
                    {
                        diff.Description.Set();
                        series.Description = contract.Description;
                    }

                    if (series.Status != contract.Status)
                    {
                        diff.Status.Set();
                        series.Status = contract.Status;
                    }

                    if (pictureData != null)
                    {
                        diff.Picture.Set();
                        SaveImage(series, pictureData);
                    }

                    var weblinksDiff = WebLink.Sync(series.WebLinks, contract.WebLinks, series);

                    if (weblinksDiff.Changed)
                    {
                        diff.WebLinks.Set();
                        session.OfType <ReleaseEventWebLink>().Sync(weblinksDiff);
                    }

                    session.Update(series);

                    if (diff.Names.IsChanged || diff.OriginalName.IsChanged)
                    {
                        var eventNamesQuery = new UpdateEventNamesQuery();
                        foreach (var ev in series.Events.Where(e => !e.CustomName))
                        {
                            eventNamesQuery.UpdateNames(session, ev, series, ev.CustomName, ev.SeriesNumber, ev.SeriesSuffix, ev.Names);
                            session.Update(ev);
                        }
                    }

                    Archive(session, series, diff, EntryEditEvent.Updated, string.Empty);

                    AuditLog(string.Format("updated {0}", entryLinkFactory.CreateEntryLink(series)), session);
                }

                return series.Id;
            }));
        }
Beispiel #18
0
        public AlbumForEditContract UpdateBasicProperties(AlbumForEditContract properties, EntryPictureFileContract pictureData)
        {
            ParamIs.NotNull(() => properties);

            return(repository.HandleTransaction(session => {
                var album = session.Load(properties.Id);

                VerifyEntryEdit(album);

                var diff = new AlbumDiff(DoSnapshot(album.ArchivedVersionsManager.GetLatestVersion(), session.OfType <User>().GetLoggedUser(PermissionContext)));

                session.AuditLogger.SysLog(string.Format("updating properties for {0}", album));

                if (album.DiscType != properties.DiscType)
                {
                    album.DiscType = properties.DiscType;
                    album.UpdateArtistString();
                    diff.DiscType.Set();
                }

                diff.Description.Set(album.Description.CopyFrom(properties.Description));

                var parsedBarcodes = properties.Identifiers.Select(Album.ParseBarcode).ToArray();
                var barcodeDiff = album.SyncIdentifiers(parsedBarcodes);
                session.Sync(barcodeDiff);
                if (barcodeDiff.Changed)
                {
                    diff.Identifiers.Set();
                }

                if (album.TranslatedName.DefaultLanguage != properties.DefaultNameLanguage)
                {
                    album.TranslatedName.DefaultLanguage = properties.DefaultNameLanguage;
                    diff.OriginalName.Set();
                }

                var validNames = properties.Names;
                var nameDiff = album.Names.Sync(validNames, album);
                session.OfType <AlbumName>().Sync(nameDiff);

                album.Names.UpdateSortNames();

                if (nameDiff.Changed)
                {
                    diff.Names.Set();
                }

                var webLinkDiff = WebLink.Sync(album.WebLinks, properties.WebLinks, album);
                session.OfType <AlbumWebLink>().Sync(webLinkDiff);

                if (webLinkDiff.Changed)
                {
                    diff.WebLinks.Set();
                }

                var newEvent = new CreateEventQuery().FindOrCreate(session, PermissionContext, properties.OriginalRelease.ReleaseEvent, album);
                var newOriginalRelease = (properties.OriginalRelease != null ? new AlbumRelease(properties.OriginalRelease, newEvent) : new AlbumRelease());

                if (album.OriginalRelease == null)
                {
                    album.OriginalRelease = new AlbumRelease();
                }

                if (!album.OriginalRelease.Equals(newOriginalRelease))
                {
                    album.OriginalRelease = newOriginalRelease;
                    diff.OriginalRelease.Set();
                }

                // Required because of a bug in NHibernate
                NHibernateUtil.Initialize(album.CoverPictureData);

                if (pictureData != null)
                {
                    var parsed = ImageHelper.GetOriginal(pictureData.UploadedFile, pictureData.ContentLength, pictureData.Mime);
                    album.CoverPictureData = new PictureData(parsed);
                    album.CoverPictureMime = parsed.Mime;

                    pictureData.Id = album.Id;
                    pictureData.EntryType = EntryType.Album;
                    var thumbGenerator = new ImageThumbGenerator(imagePersister);
                    thumbGenerator.GenerateThumbsAndMoveImage(pictureData.UploadedFile, pictureData, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);

                    diff.Cover.Set();
                }

                if (album.Status != properties.Status)
                {
                    album.Status = properties.Status;
                    diff.Status.Set();
                }

                var artistGetter = new Func <ArtistContract, Artist>(artist =>
                                                                     session.OfType <Artist>().Load(artist.Id));

                var artistsDiff = album.SyncArtists(properties.ArtistLinks, artistGetter);
                session.OfType <ArtistForAlbum>().Sync(artistsDiff);

                if (artistsDiff.Changed)
                {
                    diff.Artists.Set();
                }

                var discsDiff = album.SyncDiscs(properties.Discs);
                session.OfType <AlbumDiscProperties>().Sync(discsDiff);

                if (discsDiff.Changed)
                {
                    diff.Discs.Set();
                }

                var songGetter = new Func <SongInAlbumEditContract, Song>(contract => {
                    if (contract.SongId != 0)
                    {
                        return session.Load <Album, Song>(contract.SongId);
                    }
                    else
                    {
                        var songName = StringHelper.TrimIfNotWhitespace(contract.SongName);

                        session.AuditLogger.SysLog(string.Format("creating a new song '{0}' to {1}", songName, album));

                        var song = new Song(new LocalizedString(songName, ContentLanguageSelection.Unspecified));
                        session.Save(song);

                        var songDiff = new SongDiff();
                        songDiff.Names.Set();
                        var songArtistDiff = song.SyncArtists(contract.Artists,
                                                              addedArtistContracts => GetArtists(session, addedArtistContracts));

                        if (songArtistDiff.Changed)
                        {
                            songDiff.Artists.Set();
                            session.Update(song);
                        }

                        session.Sync(songArtistDiff);

                        var archived = ArchiveSong(session.OfType <Song>(), song, songDiff, SongArchiveReason.Created,
                                                   string.Format("Created for album '{0}'", album.DefaultName.TruncateWithEllipsis(100)));

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

                        return song;
                    }
                });

                var tracksDiff = album.SyncSongs(properties.Songs, songGetter,
                                                 (song, artistContracts) => UpdateSongArtists(session, song, artistContracts));

                session.OfType <SongInAlbum>().Sync(tracksDiff);

                if (tracksDiff.Changed)
                {
                    var add = string.Join(", ", tracksDiff.Added.Select(i => HttpUtility.HtmlEncode(i.SongToStringOrName)));
                    var rem = string.Join(", ", tracksDiff.Removed.Select(i => HttpUtility.HtmlEncode(i.SongToStringOrName)));
                    var edit = string.Join(", ", tracksDiff.Edited.Select(i => HttpUtility.HtmlEncode(i.SongToStringOrName)));

                    var str = string.Format("edited tracks (added: {0}, removed: {1}, reordered: {2})", add, rem, edit)
                              .Truncate(300);

                    session.AuditLogger.AuditLog(str);

                    diff.Tracks.Set();
                }

                var picsDiff = album.Pictures.SyncPictures(properties.Pictures, session.OfType <User>().GetLoggedUser(PermissionContext), album.CreatePicture);
                session.OfType <AlbumPictureFile>().Sync(picsDiff);
                var entryPictureFileThumbGenerator = new ImageThumbGenerator(pictureFilePersister);
                album.Pictures.GenerateThumbsAndMoveImage(entryPictureFileThumbGenerator, picsDiff.Added, ImageSizes.Original | ImageSizes.Thumb);

                if (picsDiff.Changed)
                {
                    diff.Pictures.Set();
                }

                var pvDiff = album.SyncPVs(properties.PVs);
                session.OfType <PVForAlbum>().Sync(pvDiff);

                if (pvDiff.Changed)
                {
                    diff.PVs.Set();
                }

                var logStr = string.Format("updated properties for album {0} ({1})",
                                           entryLinkFactory.CreateEntryLink(album), diff.ChangedFieldsString)
                             + (properties.UpdateNotes != string.Empty ? " " + properties.UpdateNotes : string.Empty)
                             .Truncate(400);

                session.AuditLogger.AuditLog(logStr);

                var archivedAlbum = Archive(session, album, diff, AlbumArchiveReason.PropertiesUpdated, properties.UpdateNotes);
                session.Update(album);

                AddEntryEditedEntry(session.OfType <ActivityEntry>(), album, EntryEditEvent.Updated, archivedAlbum);

                var newSongCutoff = TimeSpan.FromHours(1);
                if (artistsDiff.Added.Any() && album.CreateDate >= DateTime.Now - newSongCutoff)
                {
                    var addedArtists = artistsDiff.Added.Where(a => a.Artist != null).Select(a => a.Artist).Distinct().ToArray();

                    if (addedArtists.Any())
                    {
                        new FollowedArtistNotifier().SendNotifications(session, album, addedArtists, PermissionContext.LoggedUser, entryLinkFactory, mailer, enumTranslations);
                    }
                }

                return new AlbumForEditContract(album, PermissionContext.LanguagePreference, pictureFilePersister);
            }));
        }
Beispiel #19
0
        public static string EntryDetails(this UrlHelper urlHelper, EntryForApiContract entry)
        {
            ParamIs.NotNull(() => entry);

            return(EntryDetails(urlHelper, entry.EntryType, entry.Id, entry.UrlSlug));
        }
Beispiel #20
0
        public virtual bool HasTag(Tag tag)
        {
            ParamIs.NotNull(() => tag);

            return(Usages.Any(u => u.Tag.Equals(tag)));
        }
Beispiel #21
0
        public static string UserDetails(this UrlHelper urlHelper, IUser user)
        {
            ParamIs.NotNull(() => user);

            return(urlHelper.Action("Profile", "User", new { id = user.Name }));
        }
Beispiel #22
0
        public virtual bool HasTag(string tagName)
        {
            ParamIs.NotNull(() => tagName);

            return(Usages.Any(u => u.Tag.Name.Equals(tagName)));
        }
Beispiel #23
0
        public virtual SongName CreateName(string val, ContentLanguageSelection language)
        {
            ParamIs.NotNullOrEmpty(() => val);

            return(CreateName(new LocalizedString(val, language)));
        }
Beispiel #24
0
        public SongDetails(SongDetailsContract contract, IUserPermissionContext userContext, PVHelper pvHelper)
        {
            ParamIs.NotNull(() => contract);

            Contract                   = contract;
            AdditionalNames            = contract.AdditionalNames;
            Albums                     = contract.Albums;
            AlternateVersions          = contract.AlternateVersions.Where(a => a.SongType != SongType.Original).ToArray();
            ArtistString               = contract.ArtistString;
            BrowsedAlbumId             = contract.Album?.Id;
            CanEdit                    = EntryPermissionManager.CanEdit(userContext, contract.Song);
            CanEditPersonalDescription = contract.CanEditPersonalDescription;
            CanRemoveTagUsages         = contract.CanRemoveTagUsages;
            CommentCount               = contract.CommentCount;
            CreateDate                 = contract.CreateDate;
            DefaultLanguageSelection   = contract.TranslatedName.DefaultLanguage;
            Deleted                    = contract.Deleted;
            Draft                     = contract.Song.Status == EntryStatus.Draft;
            FavoritedTimes            = contract.Song.FavoritedTimes;
            Hits                      = contract.Hits;
            Id                        = contract.Song.Id;
            IsFavorited               = contract.UserRating != SongVoteRating.Nothing;
            LatestComments            = contract.LatestComments;
            Length                    = contract.Song.LengthSeconds;
            LikedTimes                = contract.LikeCount;
            ListCount                 = contract.ListCount;
            Lyrics                    = contract.LyricsFromParents;
            MergedTo                  = contract.MergedTo;
            Name                      = contract.Song.Name;
            NicoId                    = contract.Song.NicoId;
            Notes                     = contract.Notes;
            OriginalVersion           = (contract.Song.SongType != SongType.Original ? contract.OriginalVersion : null);
            Pools                     = contract.Pools;
            PublishDate               = contract.Song.PublishDate;
            RatingScore               = contract.Song.RatingScore;
            ReleaseEvent              = contract.ReleaseEvent;
            PersonalDescriptionText   = contract.PersonalDescriptionText;
            PersonalDescriptionAuthor = contract.PersonalDescriptionAuthor;
            SongType                  = contract.Song.SongType;
            SongTypeTag               = contract.SongTypeTag;
            Status                    = contract.Song.Status;
            Suggestions               = contract.Suggestions;
            Tags                      = contract.Tags;
            UserRating                = contract.UserRating;
            WebLinks                  = contract.WebLinks.ToList();
            ContentFocus              = SongHelper.GetContentFocus(SongType);

            Animators    = contract.Artists.Where(a => a.Categories.HasFlag(ArtistCategories.Animator)).ToArray();
            Bands        = contract.Artists.Where(a => a.Categories.HasFlag(ArtistCategories.Band)).ToArray();
            Illustrators = ContentFocus == ContentFocus.Illustration ? contract.Artists.Where(a => a.Categories.HasFlag(ArtistCategories.Illustrator)).ToArray() : null;
            Performers   = contract.Artists.Where(a => a.Categories.HasFlag(ArtistCategories.Vocalist)).ToArray();
            Producers    = contract.Artists.Where(a => a.Categories.HasFlag(ArtistCategories.Producer)).ToArray();
            var subjectsForThis = contract.Artists.Where(a => a.Categories.HasFlag(ArtistCategories.Subject)).ToArray();

            Subject      = subjectsForThis.Any() ? subjectsForThis : contract.SubjectsFromParents;
            OtherArtists = contract.Artists.Where(a => a.Categories.HasFlag(ArtistCategories.Circle) ||
                                                  a.Categories.HasFlag(ArtistCategories.Label) ||
                                                  a.Categories.HasFlag(ArtistCategories.Other) ||
                                                  (ContentFocus != ContentFocus.Illustration && a.Categories.HasFlag(ArtistCategories.Illustrator))).ToArray();

            var pvs = contract.PVs;

            OriginalPVs     = pvs.Where(p => p.PVType == PVType.Original).ToArray();
            OtherPVs        = pvs.Where(p => p.PVType != PVType.Original).ToArray();
            PrimaryPV       = pvHelper.PrimaryPV(pvs);
            ThumbUrl        = VideoServiceHelper.GetThumbUrlPreferNotNico(pvs);
            ThumbUrlMaxSize = VideoServiceHelper.GetMaxSizeThumbUrl(pvs) ?? ThumbUrl;

            if (PrimaryPV == null && !string.IsNullOrEmpty(NicoId))
            {
                PrimaryPV = new PVContract {
                    PVId = NicoId, Service = PVService.NicoNicoDouga
                }
            }
            ;

            if (pvs.All(p => p.Service != PVService.Youtube))
            {
                var nicoPV = VideoServiceHelper.PrimaryPV(pvs, PVService.NicoNicoDouga);
                var query  = HttpUtility.UrlEncode((nicoPV != null && !string.IsNullOrEmpty(nicoPV.Name))
                                        ? nicoPV.Name
                                        : $"{ArtistString} {Name}");

                WebLinks.Add(new WebLinkContract($"http://www.youtube.com/results?search_query={query}",
                                                 ViewRes.Song.DetailsStrings.SearchYoutube, WebLinkCategory.Other, disabled: false));
            }

            JsonModel = new SongDetailsAjax(this, contract.PreferredLyrics, contract.Song.Version);

            MinMilliBpm = contract.MinMilliBpm;
            MaxMilliBpm = contract.MaxMilliBpm;
        }
Beispiel #25
0
        public virtual bool HasName(LocalizedString name)
        {
            ParamIs.NotNull(() => name);

            return(Names.HasName(name));
        }
Beispiel #26
0
        public TagBaseContract Update(TagForEditContract contract, UploadedFileContract uploadedImage)
        {
            ParamIs.NotNull(() => contract);

            PermissionContext.VerifyPermission(PermissionToken.EditTags);

            return(repository.HandleTransaction(ctx => {
                var tag = LoadTagById(ctx, contract.Id);

                permissionContext.VerifyEntryEdit(tag);

                var diff = new TagDiff();

                if (tag.CategoryName != contract.CategoryName)
                {
                    diff.CategoryName.Set();
                }

                diff.Description.Set(tag.Description.CopyFrom(contract.Description));

                if (tag.HideFromSuggestions != contract.HideFromSuggestions)
                {
                    diff.HideFromSuggestions.Set();
                }

                if (tag.Targets != contract.Targets)
                {
                    diff.Targets.Set();
                }

                if (tag.TranslatedName.DefaultLanguage != contract.DefaultNameLanguage)
                {
                    tag.TranslatedName.DefaultLanguage = contract.DefaultNameLanguage;
                    diff.OriginalName.Set();
                }

                var nameDiff = SyncNames(ctx.OfType <TagName>(), tag, contract.Names);

                if (nameDiff.Changed)
                {
                    diff.Names.Set();
                }

                if (!Tag.Equals(tag.Parent, contract.Parent))
                {
                    var newParent = GetRealTag(ctx, contract.Parent, tag);

                    if (!Equals(newParent, tag.Parent))
                    {
                        diff.Parent.Set();
                        tag.SetParent(newParent);
                    }
                }

                var relatedTagsDiff = tag.SyncRelatedTags(contract.RelatedTags, tagId => ctx.Load(tagId));
                ctx.Sync(relatedTagsDiff);
                diff.RelatedTags.Set(relatedTagsDiff.Changed);

                var webLinkDiff = tag.WebLinks.Sync(contract.WebLinks, tag);
                ctx.OfType <TagWebLink>().Sync(webLinkDiff);

                if (webLinkDiff.Changed)
                {
                    diff.WebLinks.Set();
                }

                if (tag.Status != contract.Status)
                {
                    diff.Status.Set();
                }

                tag.CategoryName = contract.CategoryName;
                tag.HideFromSuggestions = contract.HideFromSuggestions;
                tag.Status = contract.Status;
                tag.Targets = contract.Targets;

                if (uploadedImage != null)
                {
                    diff.Picture.Set();

                    var thumb = new EntryThumb(tag, uploadedImage.Mime);
                    tag.Thumb = thumb;
                    var thumbGenerator = new ImageThumbGenerator(imagePersister);
                    thumbGenerator.GenerateThumbsAndMoveImage(uploadedImage.Stream, thumb, Tag.ImageSizes, originalSize: Constants.RestrictedImageOriginalSize);
                }

                var logStr = string.Format("updated properties for tag {0} ({1})", entryLinkFactory.CreateEntryLink(tag), diff.ChangedFieldsString);
                ctx.AuditLogger.AuditLog(logStr);

                var archived = Archive(ctx, tag, diff, EntryEditEvent.Updated, contract.UpdateNotes);
                AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), tag, EntryEditEvent.Updated, archived);

                ctx.Update(tag);

                return new TagBaseContract(tag, LanguagePreference);
            }));
        }
Beispiel #27
0
        public virtual bool HasWebLink(string url)
        {
            ParamIs.NotNull(() => url);

            return(WebLinks.Any(w => w.Url == url));
        }
Beispiel #28
0
		public virtual T GetTagUsage(Tag tag) {
			ParamIs.NotNull(() => tag);
			return Usages.FirstOrDefault(t => t.Tag.Equals(tag));
		}
Beispiel #29
0
        public virtual bool IsFavoritedBy(User user)
        {
            ParamIs.NotNull(() => user);

            return(UserFavorites.Any(a => a.User.Equals(user)));
        }
Beispiel #30
0
        public virtual ArtistForAlbum AddArtist(Artist artist)
        {
            ParamIs.NotNull(() => artist);

            return(artist.AddAlbum(this));
        }