private InspectedAlbum Inspect(ISession session, MikuDbAlbum imported, ImportedAlbumOptions options) { Album albumMatch; var foundAlbums = FindAlbums(session, imported); switch (options.MergedAlbumId) { case null: albumMatch = foundAlbums.FirstOrDefault(); break; case 0: albumMatch = null; break; default: albumMatch = session.Load <Album>(options.MergedAlbumId); if (!foundAlbums.Contains(albumMatch)) { foundAlbums.Add(albumMatch); } break; } var importedContract = new MikuDbAlbumContract(imported); var data = importedContract.Data; var artists = data.ArtistNames.Concat(data.VocalistNames).Concat(!string.IsNullOrEmpty(data.CircleName) ? new[] { data.CircleName } : new string[] { }) .Select(a => InspectArtist(session, a)) .ToArray(); var matchedArtists = artists.Where(a => a.ExistingArtist != null).Select(a => a.ExistingArtist).ToArray(); var tracks = data.Tracks.Select(t => InspectTrack(session, t, matchedArtists, albumMatch)).ToArray(); var result = new InspectedAlbum(importedContract); result.MergeTracks = options.MergeTracks ?? true; if (albumMatch != null) { result.MergedAlbum = new AlbumContract(albumMatch, PermissionContext.LanguagePreference); result.MergedAlbumId = albumMatch.Id; } result.ExistingAlbums = foundAlbums.Select(a => new AlbumContract(a, PermissionContext.LanguagePreference)) .Concat(new[] { new AlbumContract { Name = "Nothing" } }).ToArray(); result.Artists = artists.Select(a => a.InspectedArtist).ToArray(); result.Tracks = tracks; return(result); }
public ActionResult AcceptImported(InspectedAlbum album, string commit) { if (commit != "Accept") { //var options = albums.Select(a => new ImportedAlbumOptions(a)).ToArray(); var options = new ImportedAlbumOptions(album); var inspectResult = Service.Inspect(options); return(View("PrepareForImport", inspectResult)); } var ids = new ImportedAlbumOptions(album); var selectedSongIds = (album.Tracks != null ? album.Tracks.Where(t => t.Selected).Select(t => t.ExistingSong.Id).ToArray() : new int[] { }); Service.AcceptImportedAlbum(ids, selectedSongIds); TempData.SetSuccessMessage("Imported album approved successfully."); return(RedirectToAction("Index")); }
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)); }
public PrepareAlbumsForImport(InspectedAlbum album) { Album = album; }
private AlbumContract AcceptImportedAlbum(ISession session, ContentLanguageSelection languageSelection, InspectedAlbum acceptedAlbum, int[] selectedSongIds) { Album album; var diff = new AlbumDiff(false); if (acceptedAlbum.MergedAlbum == null) { album = new Album(new LocalizedString(acceptedAlbum.ImportedAlbum.Title, languageSelection)); if (languageSelection != ContentLanguageSelection.Unspecified) { album.Names.SortNames.DefaultLanguage = languageSelection; } album.DiscType = DiscType.Unknown; diff.Names = true; session.Save(album); } else { album = session.Load <Album>(acceptedAlbum.MergedAlbum.Id); NHibernateUtil.Initialize(album.CoverPictureData); if (!album.Names.HasName(acceptedAlbum.ImportedAlbum.Title)) { album.CreateName(acceptedAlbum.ImportedAlbum.Title, languageSelection); diff.Names = true; } } 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 = true; } } else { album.AddArtist(inspectedArtist.Name, false, ArtistRoles.Default); diff.Artists = true; } } if (acceptedAlbum.MergedAlbum == null || acceptedAlbum.MergeTracks) { foreach (var inspectedTrack in acceptedAlbum.Tracks) { if (AcceptImportedSong(session, album, inspectedTrack, languageSelection, selectedSongIds)) { diff.Tracks = true; } } } var importedAlbum = session.Load <MikuDbAlbum>(acceptedAlbum.ImportedAlbum.Id); importedAlbum.Status = AlbumStatus.Approved; if (importedAlbum.CoverPicture != null && album.CoverPictureData == null) { album.CoverPictureData = importedAlbum.CoverPicture; using (var stream = new MemoryStream(album.CoverPictureData.Bytes)) { var thumbs = ImageHelper.GenerateThumbs(stream, new[] { 250 }); if (thumbs.Any()) { album.CoverPictureData.Thumb250 = new PictureThumb250(thumbs.First().Bytes); } } diff.Cover = true; } if (acceptedAlbum.ImportedAlbum.Data.ReleaseYear != null && album.OriginalReleaseDate.Year == null) { album.OriginalReleaseDate.Year = acceptedAlbum.ImportedAlbum.Data.ReleaseYear; diff.OriginalRelease = true; } if (!album.WebLinks.Any(w => w.Url.Contains("mikudb.com"))) { album.CreateWebLink("MikuDB", acceptedAlbum.ImportedAlbum.SourceUrl, WebLinkCategory.Reference); diff.WebLinks = true; } album.UpdateArtistString(); AuditLog(string.Format("accepted imported album '{0}'", acceptedAlbum.ImportedAlbum.Title), session); AddEntryEditedEntry(session, album, EntryEditEvent.Created); Services.Albums.Archive(session, album, diff, AlbumArchiveReason.AutoImportedFromMikuDb); session.Update(album); session.Update(importedAlbum); return(new AlbumContract(album, PermissionContext.LanguagePreference)); }