private AlbumContract AcceptImportedAlbum(ISession session, IAlbumImporter importer, ContentLanguageSelection languageSelection, InspectedAlbum acceptedAlbum, int[] selectedSongIds) { Album album; var diff = new AlbumDiff(false); var isNew = acceptedAlbum.MergedAlbum == null; if (isNew) { album = new Album(new LocalizedString(acceptedAlbum.ImportedAlbum.Title, languageSelection)); if (languageSelection != ContentLanguageSelection.Unspecified) { album.Names.SortNames.DefaultLanguage = languageSelection; } album.DiscType = DiscType.Unknown; diff.Names.Set(); session.Save(album); } else { album = session.Load <Album>(acceptedAlbum.MergedAlbum.Id); if (!album.Names.HasName(acceptedAlbum.ImportedAlbum.Title)) { album.CreateName(acceptedAlbum.ImportedAlbum.Title, languageSelection); diff.Names.Set(); } } foreach (var inspectedArtist in acceptedAlbum.Artists) { if (inspectedArtist.ExistingArtist != null) { var artist = session.Load <Artist>(inspectedArtist.ExistingArtist.Id); if (!artist.HasAlbum(album)) { session.Save(artist.AddAlbum(album)); diff.Artists.Set(); } } else { album.AddArtist(inspectedArtist.Name, false, ArtistRoles.Default); diff.Artists.Set(); } } if (acceptedAlbum.MergedAlbum == null || acceptedAlbum.MergeTracks) { foreach (var inspectedTrack in acceptedAlbum.Tracks) { if (AcceptImportedSong(session, importer, album, inspectedTrack, languageSelection, selectedSongIds)) { diff.Tracks.Set(); } } } var importedAlbum = session.Load <MikuDbAlbum>(acceptedAlbum.ImportedAlbum.Id); importedAlbum.Status = AlbumStatus.Approved; if (importedAlbum.CoverPicture != null && album.CoverPictureData == null) { album.CoverPictureData = importedAlbum.CoverPicture; album.CoverPictureMime = importedAlbum.CoverPictureMime; // TODO: should generate thumbnail as well diff.Cover.Set(); } if (acceptedAlbum.ImportedAlbum.Data.ReleaseYear != null && album.OriginalReleaseDate.Year == null) { album.OriginalReleaseDate.Year = acceptedAlbum.ImportedAlbum.Data.ReleaseYear; diff.OriginalRelease.Set(); } // Add link if not already added a link to that service var sourceUrl = acceptedAlbum.ImportedAlbum.SourceUrl; if (importer != null && !string.IsNullOrEmpty(sourceUrl)) { if (album.WebLinks.All(w => !string.Equals(w.Url, sourceUrl, StringComparison.InvariantCultureIgnoreCase) && !importer.IsValidFor(w.Url))) { album.CreateWebLink(importer.ServiceName, sourceUrl, WebLinkCategory.Reference, disabled: false); diff.WebLinks.Set(); } } album.UpdateArtistString(); var importerName = importer != null ? importer.ServiceName : "(unknown)"; var archived = _albumService.Archive(session, album, diff, AlbumArchiveReason.AutoImportedFromMikuDb, "Imported from " + importerName); AuditLog($"accepted imported album '{acceptedAlbum.ImportedAlbum.Title}'", session); AddEntryEditedEntry(session, album, isNew ? EntryEditEvent.Created : EntryEditEvent.Updated, archived); session.Update(album); session.Update(importedAlbum); return(new AlbumContract(album, PermissionContext.LanguagePreference)); }
private bool AcceptImportedSong(ISession session, IAlbumImporter importer, Album album, InspectedTrack inspectedTrack, ContentLanguageSelection languageSelection, int[] selectedSongIds) { Song song = null; var diff = new SongDiff(false); if (NewTrack(inspectedTrack, selectedSongIds, album)) { song = new Song(new LocalizedString(inspectedTrack.ImportedTrack.Title, languageSelection)); session.Save(song); album.AddSong(song, inspectedTrack.ImportedTrack.TrackNum, inspectedTrack.ImportedTrack.DiscNum); diff.Names.Set(); } else if (selectedSongIds.Contains(inspectedTrack.ExistingSong.Id)) { song = session.Load <Song>(inspectedTrack.ExistingSong.Id); if (!album.HasSong(song)) { album.AddSong(song, inspectedTrack.ImportedTrack.TrackNum, inspectedTrack.ImportedTrack.DiscNum); } var newName = inspectedTrack.ImportedTrack.Title; if (!song.Names.HasName(newName) && !song.Names.HasNameForLanguage(languageSelection)) { song.CreateName(new LocalizedString(newName, languageSelection)); diff.Names.Set(); } } if (song != null) { if (inspectedTrack.ImportedTrack != null) { foreach (var artistName in inspectedTrack.ImportedTrack.ArtistNames) { if (CreateArtist(session, song, artistName, ArtistRoles.Composer)) { diff.Artists.Set(); } } foreach (var artistName in inspectedTrack.ImportedTrack.VocalistNames) { if (CreateArtist(session, song, artistName, ArtistRoles.Vocalist)) { diff.Artists.Set(); } } song.UpdateArtistString(); } if (diff.ChangedFields.Value != SongEditableFields.Nothing) { var importerName = importer != null ? importer.ServiceName : "(unknown)"; _songService.Archive(session, song, diff, SongArchiveReason.AutoImportedFromMikuDb, $"Auto-imported from {importerName} for album '{album.DefaultName}'"); } session.Update(song); return(true); } return(false); }