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; }
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; }
/// <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); }
/// <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); }
/// <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)); }