Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
        }