Esempio n. 1
0
        public SongDetailsContract(Song song, ContentLanguagePreference languagePreference,
                                   SongListBaseContract[] pools, ISpecialTags specialTags)
        {
            Song = new SongContract(song, languagePreference);

            AdditionalNames   = string.Join(", ", song.AllNames.Where(n => n != Song.Name).Distinct());
            Albums            = song.OnAlbums.Select(a => new AlbumContract(a, languagePreference)).OrderBy(a => a.Name).ToArray();
            AlternateVersions = song.AlternateVersions.Select(s => new SongContract(s, languagePreference)).ToArray();
            Artists           = song.Artists.Select(a => new ArtistForSongContract(a, languagePreference)).OrderBy(a => a.Name).ToArray();
            ArtistString      = song.ArtistString[languagePreference];
            CreateDate        = song.CreateDate;
            Deleted           = song.Deleted;
            LikeCount         = song.UserFavorites.Count(f => f.Rating == SongVoteRating.Like);
            LyricsFromParents = song.GetLyricsFromParents(specialTags).Select(l => new LyricsForSongContract(l, false)).ToArray();
            Notes             = song.Notes;
            OriginalVersion   = (song.OriginalVersion != null && !song.OriginalVersion.Deleted ?
                                 new SongForApiContract(song.OriginalVersion, null, languagePreference, SongOptionalFields.AdditionalNames | SongOptionalFields.ThumbUrl) : null);

            PVs            = song.PVs.Select(p => new PVContract(p)).ToArray();
            ReleaseEvent   = song.ReleaseEvent != null ? new ReleaseEventForApiContract(song.ReleaseEvent, ReleaseEventOptionalFields.None) : null;
            Tags           = song.Tags.ActiveUsages.Select(u => new TagUsageForApiContract(u, languagePreference)).OrderByDescending(t => t.Count).ToArray();
            TranslatedName = new TranslatedStringContract(song.TranslatedName);
            WebLinks       = song.WebLinks.Select(w => new WebLinkContract(w)).OrderBy(w => w.DescriptionOrUrl).ToArray();

            Pools = pools;
        }
Esempio n. 2
0
        public SongDetailsContract(Song song, ContentLanguagePreference languagePreference,
                                   SongListBaseContract[] pools, ISpecialTags specialTags, IUserPermissionContext userContext, IEntryThumbPersister thumbPersister)
        {
            Song = new SongContract(song, languagePreference);

            AdditionalNames            = song.Names.GetAdditionalNamesStringForLanguage(languagePreference);
            Albums                     = song.OnAlbums.OrderBy(a => a.OriginalReleaseDate.SortableDateTime).Select(a => new AlbumContract(a, languagePreference)).ToArray();
            AlternateVersions          = song.AlternateVersions.Select(s => new SongContract(s, languagePreference, getThumbUrl: false)).OrderBy(s => s.PublishDate).ToArray();
            Artists                    = song.Artists.Select(a => new ArtistForSongContract(a, languagePreference)).OrderBy(a => a.Name).ToArray();
            ArtistString               = song.ArtistString[languagePreference];
            CanEditPersonalDescription = EntryPermissionManager.CanEditPersonalDescription(userContext, song);
            CanRemoveTagUsages         = EntryPermissionManager.CanRemoveTagUsages(userContext, song);
            CreateDate                 = song.CreateDate;
            Deleted                    = song.Deleted;
            LikeCount                  = song.UserFavorites.Count(f => f.Rating == SongVoteRating.Like);
            LyricsFromParents          = song.GetLyricsFromParents(specialTags).Select(l => new LyricsForSongContract(l, false)).ToArray();
            Notes           = song.Notes;
            OriginalVersion = (song.OriginalVersion != null && !song.OriginalVersion.Deleted ?
                               new SongForApiContract(song.OriginalVersion, null, languagePreference, SongOptionalFields.AdditionalNames | SongOptionalFields.ThumbUrl) : null);

            PVs                     = song.PVs.Select(p => new PVContract(p)).ToArray();
            ReleaseEvent            = song.ReleaseEvent != null && !song.ReleaseEvent.Deleted ? new ReleaseEventForApiContract(song.ReleaseEvent, languagePreference, ReleaseEventOptionalFields.None, thumbPersister, true) : null;
            PersonalDescriptionText = song.PersonalDescriptionText;
            var author = song.PersonalDescriptionAuthor;

            PersonalDescriptionAuthor = author != null ? new ArtistForApiContract(author, languagePreference, thumbPersister, true, ArtistOptionalFields.MainPicture) : null;
            SubjectsFromParents       = song.GetCharactersFromParents().Select(c => new ArtistForSongContract(c, languagePreference)).ToArray();
            Tags           = song.Tags.ActiveUsages.Select(u => new TagUsageForApiContract(u, languagePreference)).OrderByDescending(t => t.Count).ToArray();
            TranslatedName = new TranslatedStringContract(song.TranslatedName);
            WebLinks       = song.WebLinks.Select(w => new WebLinkContract(w)).OrderBy(w => w.DescriptionOrUrl).ToArray();

            Pools = pools;
        }
Esempio n. 3
0
        /// <summary>
        /// Tests if a particular tag is redundant for a song and should be skipped from automatic mapping.
        /// </summary>
        public bool TagIsRedundantForSong(SongType songType, int tagId, ISpecialTags specialTags)
        {
            if (songType == SongType.Cover && tagId == specialTags.Cover)
            {
                return(true);
            }

            if (songType == SongType.Remix && tagId == specialTags.Remix)
            {
                return(true);
            }

            return(false);
        }
Esempio n. 4
0
        /// <summary>
        /// Lyrics for this song, either from the song entry itself, or its original version.
        /// </summary>
        /// <param name="specialTags">Special tags. Can be null, which will cause no lyrics to be inherited.</param>
        /// <param name="allowInstrumental">
        /// Whether to allow inheriting lyrics for instrumental songs.
        /// This is mostly the case when the instrumental version is in the middle, for example original -> instrumental -> cover (with lyrics)
        /// </param>
        /// <param name="levels">Current level of traversing the parent chain.</param>
        private IList <LyricsForSong> GetLyricsFromParents(ISpecialTags specialTags, bool allowInstrumental, int levels)
        {
            int maxLevels = 10;

            if (specialTags != null &&
                (allowInstrumental || SongType != SongType.Instrumental) &&
                HasOriginalVersion &&
                !OriginalVersion.Deleted &&
                !Lyrics.Any() &&
                !Tags.HasTag(specialTags.ChangedLyrics) &&
                (allowInstrumental || !Tags.HasTag(specialTags.Instrumental)) &&
                levels < maxLevels)
            {
                return(OriginalVersion.GetLyricsFromParents(specialTags, true, levels + 1));
            }

            return(Lyrics);
        }
Esempio n. 5
0
 /// <summary>
 /// Lyrics for this song, either from the song entry itself, or its original version.
 /// </summary>
 /// <param name="specialTags">Special tags. Can be null, which will cause no lyrics to be inherited.</param>
 public virtual IList <LyricsForSong> GetLyricsFromParents(ISpecialTags specialTags)
 {
     return(GetLyricsFromParents(specialTags, false, 0));
 }