mirror of
https://github.com/sphildreth/roadie
synced 2024-09-20 06:32:02 +00:00
v20190309.1
This commit is contained in:
parent
ee5d5354d6
commit
e58ac0c87d
6 changed files with 266 additions and 191 deletions
|
@ -262,236 +262,246 @@ namespace Roadie.Library.Factories
|
|||
SimpleContract.Requires<ArgumentNullException>(releaseToMergeInto != null, "Invalid Release");
|
||||
SimpleContract.Requires<ArgumentNullException>(releaseToMerge.Artist != null, "Invalid Artist");
|
||||
SimpleContract.Requires<ArgumentNullException>(releaseToMergeInto.Artist != null, "Invalid Artist");
|
||||
|
||||
var result = false;
|
||||
|
||||
var resultErrors = new List<Exception>();
|
||||
var sw = new Stopwatch();
|
||||
sw.Start();
|
||||
|
||||
var mergedFilesToDelete = new List<string>();
|
||||
var mergedTracksToMove = new List<Data.Track>();
|
||||
|
||||
releaseToMergeInto.MediaCount = releaseToMergeInto.MediaCount ?? 0;
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
var releaseToMergeReleaseMedia = this.DbContext.ReleaseMedias.Where(x => x.ReleaseId == releaseToMerge.Id).ToList();
|
||||
var releaseToMergeIntoReleaseMedia = this.DbContext.ReleaseMedias.Where(x => x.ReleaseId == releaseToMergeInto.Id).ToList();
|
||||
var releaseToMergeIntoLastMediaNumber = releaseToMergeIntoReleaseMedia.Max(x => x.MediaNumber);
|
||||
|
||||
// Add new ReleaseMedia
|
||||
if (addAsMedia || !releaseToMergeIntoReleaseMedia.Any())
|
||||
try
|
||||
{
|
||||
foreach (var rm in releaseToMergeReleaseMedia)
|
||||
|
||||
var mergedFilesToDelete = new List<string>();
|
||||
var mergedTracksToMove = new List<Data.Track>();
|
||||
|
||||
releaseToMergeInto.MediaCount = releaseToMergeInto.MediaCount ?? 0;
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
var releaseToMergeReleaseMedia = this.DbContext.ReleaseMedias.Where(x => x.ReleaseId == releaseToMerge.Id).ToList();
|
||||
var releaseToMergeIntoReleaseMedia = this.DbContext.ReleaseMedias.Where(x => x.ReleaseId == releaseToMergeInto.Id).ToList();
|
||||
var releaseToMergeIntoLastMediaNumber = releaseToMergeIntoReleaseMedia.Max(x => x.MediaNumber);
|
||||
|
||||
// Add new ReleaseMedia
|
||||
if (addAsMedia || !releaseToMergeIntoReleaseMedia.Any())
|
||||
{
|
||||
releaseToMergeIntoLastMediaNumber++;
|
||||
rm.ReleaseId = releaseToMergeInto.Id;
|
||||
rm.MediaNumber = releaseToMergeIntoLastMediaNumber;
|
||||
rm.LastUpdated = now;
|
||||
releaseToMergeInto.MediaCount++;
|
||||
releaseToMergeInto.TrackCount += rm.TrackCount;
|
||||
}
|
||||
}
|
||||
// Merge into existing ReleaseMedia
|
||||
else
|
||||
{
|
||||
// See if each media exists and merge details of each including tracks
|
||||
foreach (var rm in releaseToMergeReleaseMedia)
|
||||
{
|
||||
var existingReleaseMedia = releaseToMergeIntoReleaseMedia.FirstOrDefault(x => x.MediaNumber == rm.MediaNumber);
|
||||
var mergeTracks = this.DbContext.Tracks.Where(x => x.ReleaseMediaId == rm.Id).ToArray();
|
||||
if (existingReleaseMedia == null)
|
||||
foreach (var rm in releaseToMergeReleaseMedia)
|
||||
{
|
||||
releaseToMergeIntoLastMediaNumber++;
|
||||
// Doesnt exist in release being merged to add
|
||||
rm.ReleaseId = releaseToMergeInto.Id;
|
||||
rm.MediaNumber = releaseToMergeIntoLastMediaNumber;
|
||||
rm.LastUpdated = now;
|
||||
releaseToMergeInto.MediaCount++;
|
||||
releaseToMergeInto.TrackCount += rm.TrackCount;
|
||||
mergedTracksToMove.AddRange(mergeTracks);
|
||||
}
|
||||
else
|
||||
}
|
||||
// Merge into existing ReleaseMedia
|
||||
else
|
||||
{
|
||||
// See if each media exists and merge details of each including tracks
|
||||
foreach (var rm in releaseToMergeReleaseMedia)
|
||||
{
|
||||
// ReleaseMedia Does exist merge tracks and details
|
||||
|
||||
var mergeIntoTracks = this.DbContext.Tracks.Where(x => x.ReleaseMediaId == existingReleaseMedia.Id).ToArray();
|
||||
foreach (var mergeTrack in mergeTracks)
|
||||
var existingReleaseMedia = releaseToMergeIntoReleaseMedia.FirstOrDefault(x => x.MediaNumber == rm.MediaNumber);
|
||||
var mergeTracks = this.DbContext.Tracks.Where(x => x.ReleaseMediaId == rm.Id).ToArray();
|
||||
if (existingReleaseMedia == null)
|
||||
{
|
||||
var existingTrack = mergeIntoTracks.FirstOrDefault(x => x.TrackNumber == mergeTrack.TrackNumber);
|
||||
if (existingTrack == null)
|
||||
releaseToMergeIntoLastMediaNumber++;
|
||||
// Doesnt exist in release being merged to add
|
||||
rm.ReleaseId = releaseToMergeInto.Id;
|
||||
rm.MediaNumber = releaseToMergeIntoLastMediaNumber;
|
||||
rm.LastUpdated = now;
|
||||
releaseToMergeInto.MediaCount++;
|
||||
releaseToMergeInto.TrackCount += rm.TrackCount;
|
||||
mergedTracksToMove.AddRange(mergeTracks);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ReleaseMedia Does exist merge tracks and details
|
||||
|
||||
var mergeIntoTracks = this.DbContext.Tracks.Where(x => x.ReleaseMediaId == existingReleaseMedia.Id).ToArray();
|
||||
foreach (var mergeTrack in mergeTracks)
|
||||
{
|
||||
// Track does not exist, update to existing ReleaseMedia and update ReleaseToMergeInfo counts
|
||||
mergeTrack.LastUpdated = now;
|
||||
mergeTrack.ReleaseMediaId = existingReleaseMedia.Id;
|
||||
existingReleaseMedia.TrackCount++;
|
||||
existingReleaseMedia.LastUpdated = now;
|
||||
releaseToMergeInto.TrackCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Track does exist merge two tracks together
|
||||
existingTrack.MusicBrainzId = existingTrack.MusicBrainzId ?? mergeTrack.MusicBrainzId;
|
||||
existingTrack.SpotifyId = existingTrack.SpotifyId ?? mergeTrack.SpotifyId;
|
||||
existingTrack.AmgId = existingTrack.AmgId ?? mergeTrack.AmgId;
|
||||
existingTrack.ISRC = existingTrack.ISRC ?? mergeTrack.ISRC;
|
||||
existingTrack.AmgId = existingTrack.AmgId ?? mergeTrack.AmgId;
|
||||
existingTrack.LastFMId = existingTrack.LastFMId ?? mergeTrack.LastFMId;
|
||||
existingTrack.PartTitles = existingTrack.PartTitles ?? mergeTrack.PartTitles;
|
||||
existingTrack.PlayedCount = (existingTrack.PlayedCount ?? 0) + (mergeTrack.PlayedCount ?? 0);
|
||||
if (mergeTrack.LastPlayed.HasValue && existingTrack.LastPlayed.HasValue && mergeTrack.LastPlayed > existingTrack.LastPlayed)
|
||||
var existingTrack = mergeIntoTracks.FirstOrDefault(x => x.TrackNumber == mergeTrack.TrackNumber);
|
||||
if (existingTrack == null)
|
||||
{
|
||||
existingTrack.LastPlayed = mergeTrack.LastPlayed;
|
||||
// Track does not exist, update to existing ReleaseMedia and update ReleaseToMergeInfo counts
|
||||
mergeTrack.LastUpdated = now;
|
||||
mergeTrack.ReleaseMediaId = existingReleaseMedia.Id;
|
||||
existingReleaseMedia.TrackCount++;
|
||||
existingReleaseMedia.LastUpdated = now;
|
||||
releaseToMergeInto.TrackCount++;
|
||||
}
|
||||
existingTrack.Thumbnail = existingTrack.Thumbnail ?? mergeTrack.Thumbnail;
|
||||
existingTrack.MusicBrainzId = existingTrack.MusicBrainzId ?? mergeTrack.MusicBrainzId;
|
||||
existingTrack.Tags = existingTrack.Tags.AddToDelimitedList(mergeTrack.Tags.ToListFromDelimited());
|
||||
if (!mergeTrack.Title.Equals(existingTrack.Title, StringComparison.OrdinalIgnoreCase))
|
||||
else
|
||||
{
|
||||
existingTrack.AlternateNames = existingTrack.AlternateNames.AddToDelimitedList(new string[] { mergeTrack.Title, mergeTrack.Title.ToAlphanumericName() });
|
||||
}
|
||||
existingTrack.AlternateNames = existingTrack.AlternateNames.AddToDelimitedList(mergeTrack.AlternateNames.ToListFromDelimited());
|
||||
existingTrack.LastUpdated = now;
|
||||
var mergedTrackFileName = mergeTrack.PathToTrack(this.Configuration, this.Configuration.LibraryFolder);
|
||||
var trackFileName = existingTrack.PathToTrack(this.Configuration, this.Configuration.LibraryFolder);
|
||||
if (!trackFileName.Equals(mergedTrackFileName, StringComparison.Ordinal) && File.Exists(trackFileName))
|
||||
{
|
||||
mergedFilesToDelete.Add(mergedTrackFileName);
|
||||
// Track does exist merge two tracks together
|
||||
existingTrack.MusicBrainzId = existingTrack.MusicBrainzId ?? mergeTrack.MusicBrainzId;
|
||||
existingTrack.SpotifyId = existingTrack.SpotifyId ?? mergeTrack.SpotifyId;
|
||||
existingTrack.AmgId = existingTrack.AmgId ?? mergeTrack.AmgId;
|
||||
existingTrack.ISRC = existingTrack.ISRC ?? mergeTrack.ISRC;
|
||||
existingTrack.AmgId = existingTrack.AmgId ?? mergeTrack.AmgId;
|
||||
existingTrack.LastFMId = existingTrack.LastFMId ?? mergeTrack.LastFMId;
|
||||
existingTrack.PartTitles = existingTrack.PartTitles ?? mergeTrack.PartTitles;
|
||||
existingTrack.PlayedCount = (existingTrack.PlayedCount ?? 0) + (mergeTrack.PlayedCount ?? 0);
|
||||
if (mergeTrack.LastPlayed.HasValue && existingTrack.LastPlayed.HasValue && mergeTrack.LastPlayed > existingTrack.LastPlayed)
|
||||
{
|
||||
existingTrack.LastPlayed = mergeTrack.LastPlayed;
|
||||
}
|
||||
existingTrack.Thumbnail = existingTrack.Thumbnail ?? mergeTrack.Thumbnail;
|
||||
existingTrack.MusicBrainzId = existingTrack.MusicBrainzId ?? mergeTrack.MusicBrainzId;
|
||||
existingTrack.Tags = existingTrack.Tags.AddToDelimitedList(mergeTrack.Tags.ToListFromDelimited());
|
||||
if (!mergeTrack.Title.Equals(existingTrack.Title, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
existingTrack.AlternateNames = existingTrack.AlternateNames.AddToDelimitedList(new string[] { mergeTrack.Title, mergeTrack.Title.ToAlphanumericName() });
|
||||
}
|
||||
existingTrack.AlternateNames = existingTrack.AlternateNames.AddToDelimitedList(mergeTrack.AlternateNames.ToListFromDelimited());
|
||||
existingTrack.LastUpdated = now;
|
||||
var mergedTrackFileName = mergeTrack.PathToTrack(this.Configuration, this.Configuration.LibraryFolder);
|
||||
var trackFileName = existingTrack.PathToTrack(this.Configuration, this.Configuration.LibraryFolder);
|
||||
if (!trackFileName.Equals(mergedTrackFileName, StringComparison.Ordinal) && File.Exists(trackFileName))
|
||||
{
|
||||
mergedFilesToDelete.Add(mergedTrackFileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var destinationRoot = this.Configuration.LibraryFolder;
|
||||
var releaseToMergeFolder = releaseToMerge.ReleaseFileFolder(releaseToMerge.Artist.ArtistFileFolder(this.Configuration, destinationRoot));
|
||||
var releaseToMergeIntoArtistFolder = releaseToMergeInto.Artist.ArtistFileFolder(this.Configuration, destinationRoot);
|
||||
var releaseToMergeIntoDirectory = new DirectoryInfo(releaseToMergeInto.ReleaseFileFolder(releaseToMergeIntoArtistFolder));
|
||||
var destinationRoot = this.Configuration.LibraryFolder;
|
||||
var releaseToMergeFolder = releaseToMerge.ReleaseFileFolder(releaseToMerge.Artist.ArtistFileFolder(this.Configuration, destinationRoot));
|
||||
var releaseToMergeIntoArtistFolder = releaseToMergeInto.Artist.ArtistFileFolder(this.Configuration, destinationRoot);
|
||||
var releaseToMergeIntoDirectory = new DirectoryInfo(releaseToMergeInto.ReleaseFileFolder(releaseToMergeIntoArtistFolder));
|
||||
|
||||
// Move tracks for releaseToMergeInto into correct folders
|
||||
if (mergedTracksToMove.Any())
|
||||
{
|
||||
foreach (var track in mergedTracksToMove)
|
||||
// Move tracks for releaseToMergeInto into correct folders
|
||||
if (mergedTracksToMove.Any())
|
||||
{
|
||||
var oldTrackPath = track.PathToTrack(this.Configuration, this.Configuration.LibraryFolder);
|
||||
var newTrackPath = FolderPathHelper.TrackFullPath(this.Configuration, releaseToMerge.Artist, releaseToMerge, track);
|
||||
var trackFile = new FileInfo(oldTrackPath);
|
||||
if (!newTrackPath.ToLower().Equals(oldTrackPath.ToLower()))
|
||||
foreach (var track in mergedTracksToMove)
|
||||
{
|
||||
var audioMetaData = await this.AudioMetaDataHelper.GetInfo(trackFile, false);
|
||||
track.FilePath = FolderPathHelper.TrackPath(this.Configuration, releaseToMergeInto.Artist, releaseToMergeInto, track);
|
||||
track.Hash = HashHelper.CreateMD5(releaseToMergeInto.ArtistId.ToString() + trackFile.LastWriteTimeUtc.GetHashCode().ToString() + audioMetaData.GetHashCode().ToString());
|
||||
track.LastUpdated = now;
|
||||
File.Move(oldTrackPath, newTrackPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cleanup folders
|
||||
FolderProcessor.DeleteEmptyFolders(new DirectoryInfo(releaseToMergeIntoArtistFolder), this.Logger);
|
||||
|
||||
// Now Merge release details
|
||||
releaseToMergeInto.AlternateNames = releaseToMergeInto.AlternateNames.AddToDelimitedList(new string[] { releaseToMerge.Title, releaseToMerge.Title.ToAlphanumericName() });
|
||||
releaseToMergeInto.AlternateNames = releaseToMergeInto.AlternateNames.AddToDelimitedList(releaseToMerge.AlternateNames.ToListFromDelimited());
|
||||
releaseToMergeInto.Tags = releaseToMergeInto.Tags.AddToDelimitedList(releaseToMerge.Tags.ToListFromDelimited());
|
||||
releaseToMergeInto.URLs.AddToDelimitedList(releaseToMerge.URLs.ToListFromDelimited());
|
||||
releaseToMergeInto.MusicBrainzId = releaseToMergeInto.MusicBrainzId ?? releaseToMerge.MusicBrainzId;
|
||||
releaseToMergeInto.Profile = releaseToMergeInto.Profile ?? releaseToMerge.Profile;
|
||||
releaseToMergeInto.ReleaseDate = releaseToMergeInto.ReleaseDate ?? releaseToMerge.ReleaseDate;
|
||||
releaseToMergeInto.MusicBrainzId = releaseToMergeInto.MusicBrainzId ?? releaseToMerge.MusicBrainzId;
|
||||
releaseToMergeInto.DiscogsId = releaseToMergeInto.DiscogsId ?? releaseToMerge.DiscogsId;
|
||||
releaseToMergeInto.ITunesId = releaseToMergeInto.ITunesId ?? releaseToMerge.ITunesId;
|
||||
releaseToMergeInto.AmgId = releaseToMergeInto.AmgId ?? releaseToMerge.AmgId;
|
||||
releaseToMergeInto.LastFMId = releaseToMergeInto.LastFMId ?? releaseToMerge.LastFMId;
|
||||
releaseToMergeInto.LastFMSummary = releaseToMergeInto.LastFMSummary ?? releaseToMerge.LastFMSummary;
|
||||
releaseToMergeInto.SpotifyId = releaseToMergeInto.SpotifyId ?? releaseToMerge.SpotifyId;
|
||||
releaseToMergeInto.Thumbnail = releaseToMergeInto.Thumbnail ?? releaseToMerge.Thumbnail;
|
||||
if (releaseToMergeInto.ReleaseType == ReleaseType.Unknown && releaseToMerge.ReleaseType != ReleaseType.Unknown)
|
||||
{
|
||||
releaseToMergeInto.ReleaseType = releaseToMerge.ReleaseType;
|
||||
}
|
||||
releaseToMergeInto.LastUpdated = now;
|
||||
await this.DbContext.SaveChangesAsync();
|
||||
|
||||
// Update any collection pointers for release to be merged
|
||||
var collectionRecords = this.DbContext.CollectionReleases.Where(x => x.ReleaseId == releaseToMerge.Id);
|
||||
if (collectionRecords != null && collectionRecords.Any())
|
||||
{
|
||||
foreach (var cr in collectionRecords)
|
||||
{
|
||||
cr.ReleaseId = releaseToMergeInto.Id;
|
||||
cr.LastUpdated = now;
|
||||
}
|
||||
await this.DbContext.SaveChangesAsync();
|
||||
}
|
||||
|
||||
// Update any existing playlist for release to be merged
|
||||
var playListTrackInfos = (from pl in this.DbContext.PlaylistTracks
|
||||
join t in this.DbContext.Tracks on pl.TrackId equals t.Id
|
||||
join rm in this.DbContext.ReleaseMedias on t.ReleaseMediaId equals rm.Id
|
||||
where rm.ReleaseId == releaseToMerge.Id
|
||||
select new
|
||||
{
|
||||
track = t,
|
||||
rm = rm,
|
||||
pl = pl
|
||||
}).ToArray();
|
||||
if (playListTrackInfos != null && playListTrackInfos.Any())
|
||||
{
|
||||
foreach (var playListTrackInfo in playListTrackInfos)
|
||||
{
|
||||
var matchingTrack = (from t in this.DbContext.Tracks
|
||||
join rm in this.DbContext.ReleaseMedias on t.ReleaseMediaId equals rm.Id
|
||||
where rm.ReleaseId == releaseToMergeInto.Id
|
||||
where rm.MediaNumber == playListTrackInfo.rm.MediaNumber
|
||||
where t.TrackNumber == playListTrackInfo.track.TrackNumber
|
||||
select t).FirstOrDefault();
|
||||
if (matchingTrack != null)
|
||||
{
|
||||
playListTrackInfo.pl.TrackId = matchingTrack.Id;
|
||||
playListTrackInfo.pl.LastUpdated = now;
|
||||
}
|
||||
}
|
||||
await this.DbContext.SaveChangesAsync();
|
||||
}
|
||||
|
||||
await this.Delete(releaseToMerge);
|
||||
|
||||
// Delete any files flagged to be deleted (duplicate as track already exists on merged to release)
|
||||
if (mergedFilesToDelete.Any())
|
||||
{
|
||||
foreach (var mergedFileToDelete in mergedFilesToDelete)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (File.Exists(mergedFileToDelete))
|
||||
var oldTrackPath = track.PathToTrack(this.Configuration, this.Configuration.LibraryFolder);
|
||||
var newTrackPath = FolderPathHelper.TrackFullPath(this.Configuration, releaseToMerge.Artist, releaseToMerge, track);
|
||||
var trackFile = new FileInfo(oldTrackPath);
|
||||
if (!newTrackPath.ToLower().Equals(oldTrackPath.ToLower()))
|
||||
{
|
||||
File.Delete(mergedFileToDelete);
|
||||
this.Logger.LogWarning("x Deleted Merged File [{0}]", mergedFileToDelete);
|
||||
var audioMetaData = await this.AudioMetaDataHelper.GetInfo(trackFile, false);
|
||||
track.FilePath = FolderPathHelper.TrackPath(this.Configuration, releaseToMergeInto.Artist, releaseToMergeInto, track);
|
||||
track.Hash = HashHelper.CreateMD5(releaseToMergeInto.ArtistId.ToString() + trackFile.LastWriteTimeUtc.GetHashCode().ToString() + audioMetaData.GetHashCode().ToString());
|
||||
track.LastUpdated = now;
|
||||
File.Move(oldTrackPath, newTrackPath);
|
||||
}
|
||||
}
|
||||
catch
|
||||
}
|
||||
|
||||
// Cleanup folders
|
||||
FolderProcessor.DeleteEmptyFolders(new DirectoryInfo(releaseToMergeIntoArtistFolder), this.Logger);
|
||||
|
||||
// Now Merge release details
|
||||
releaseToMergeInto.AlternateNames = releaseToMergeInto.AlternateNames.AddToDelimitedList(new string[] { releaseToMerge.Title, releaseToMerge.Title.ToAlphanumericName() });
|
||||
releaseToMergeInto.AlternateNames = releaseToMergeInto.AlternateNames.AddToDelimitedList(releaseToMerge.AlternateNames.ToListFromDelimited());
|
||||
releaseToMergeInto.Tags = releaseToMergeInto.Tags.AddToDelimitedList(releaseToMerge.Tags.ToListFromDelimited());
|
||||
releaseToMergeInto.URLs.AddToDelimitedList(releaseToMerge.URLs.ToListFromDelimited());
|
||||
releaseToMergeInto.MusicBrainzId = releaseToMergeInto.MusicBrainzId ?? releaseToMerge.MusicBrainzId;
|
||||
releaseToMergeInto.Profile = releaseToMergeInto.Profile ?? releaseToMerge.Profile;
|
||||
releaseToMergeInto.ReleaseDate = releaseToMergeInto.ReleaseDate ?? releaseToMerge.ReleaseDate;
|
||||
releaseToMergeInto.MusicBrainzId = releaseToMergeInto.MusicBrainzId ?? releaseToMerge.MusicBrainzId;
|
||||
releaseToMergeInto.DiscogsId = releaseToMergeInto.DiscogsId ?? releaseToMerge.DiscogsId;
|
||||
releaseToMergeInto.ITunesId = releaseToMergeInto.ITunesId ?? releaseToMerge.ITunesId;
|
||||
releaseToMergeInto.AmgId = releaseToMergeInto.AmgId ?? releaseToMerge.AmgId;
|
||||
releaseToMergeInto.LastFMId = releaseToMergeInto.LastFMId ?? releaseToMerge.LastFMId;
|
||||
releaseToMergeInto.LastFMSummary = releaseToMergeInto.LastFMSummary ?? releaseToMerge.LastFMSummary;
|
||||
releaseToMergeInto.SpotifyId = releaseToMergeInto.SpotifyId ?? releaseToMerge.SpotifyId;
|
||||
releaseToMergeInto.Thumbnail = releaseToMergeInto.Thumbnail ?? releaseToMerge.Thumbnail;
|
||||
if (releaseToMergeInto.ReleaseType == ReleaseType.Unknown && releaseToMerge.ReleaseType != ReleaseType.Unknown)
|
||||
{
|
||||
releaseToMergeInto.ReleaseType = releaseToMerge.ReleaseType;
|
||||
}
|
||||
releaseToMergeInto.LastUpdated = now;
|
||||
await this.DbContext.SaveChangesAsync();
|
||||
|
||||
// Update any collection pointers for release to be merged
|
||||
var collectionRecords = this.DbContext.CollectionReleases.Where(x => x.ReleaseId == releaseToMerge.Id);
|
||||
if (collectionRecords != null && collectionRecords.Any())
|
||||
{
|
||||
foreach (var cr in collectionRecords)
|
||||
{
|
||||
cr.ReleaseId = releaseToMergeInto.Id;
|
||||
cr.LastUpdated = now;
|
||||
}
|
||||
await this.DbContext.SaveChangesAsync();
|
||||
}
|
||||
|
||||
// Update any existing playlist for release to be merged
|
||||
var playListTrackInfos = (from pl in this.DbContext.PlaylistTracks
|
||||
join t in this.DbContext.Tracks on pl.TrackId equals t.Id
|
||||
join rm in this.DbContext.ReleaseMedias on t.ReleaseMediaId equals rm.Id
|
||||
where rm.ReleaseId == releaseToMerge.Id
|
||||
select new
|
||||
{
|
||||
track = t,
|
||||
rm = rm,
|
||||
pl = pl
|
||||
}).ToArray();
|
||||
if (playListTrackInfos != null && playListTrackInfos.Any())
|
||||
{
|
||||
foreach (var playListTrackInfo in playListTrackInfos)
|
||||
{
|
||||
var matchingTrack = (from t in this.DbContext.Tracks
|
||||
join rm in this.DbContext.ReleaseMedias on t.ReleaseMediaId equals rm.Id
|
||||
where rm.ReleaseId == releaseToMergeInto.Id
|
||||
where rm.MediaNumber == playListTrackInfo.rm.MediaNumber
|
||||
where t.TrackNumber == playListTrackInfo.track.TrackNumber
|
||||
select t).FirstOrDefault();
|
||||
if (matchingTrack != null)
|
||||
{
|
||||
playListTrackInfo.pl.TrackId = matchingTrack.Id;
|
||||
playListTrackInfo.pl.LastUpdated = now;
|
||||
}
|
||||
}
|
||||
await this.DbContext.SaveChangesAsync();
|
||||
}
|
||||
|
||||
await this.Delete(releaseToMerge);
|
||||
|
||||
// Delete any files flagged to be deleted (duplicate as track already exists on merged to release)
|
||||
if (mergedFilesToDelete.Any())
|
||||
{
|
||||
foreach (var mergedFileToDelete in mergedFilesToDelete)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (File.Exists(mergedFileToDelete))
|
||||
{
|
||||
File.Delete(mergedFileToDelete);
|
||||
this.Logger.LogWarning("x Deleted Merged File [{0}]", mergedFileToDelete);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Clear cache regions for manipulated records
|
||||
this.CacheManager.ClearRegion(releaseToMergeInto.CacheRegion);
|
||||
if (releaseToMergeInto.Artist != null)
|
||||
{
|
||||
this.CacheManager.ClearRegion(releaseToMergeInto.Artist.CacheRegion);
|
||||
}
|
||||
if (releaseToMerge.Artist != null)
|
||||
{
|
||||
this.CacheManager.ClearRegion(releaseToMerge.Artist.CacheRegion);
|
||||
}
|
||||
// Clear cache regions for manipulated records
|
||||
this.CacheManager.ClearRegion(releaseToMergeInto.CacheRegion);
|
||||
if (releaseToMergeInto.Artist != null)
|
||||
{
|
||||
this.CacheManager.ClearRegion(releaseToMergeInto.Artist.CacheRegion);
|
||||
}
|
||||
if (releaseToMerge.Artist != null)
|
||||
{
|
||||
this.CacheManager.ClearRegion(releaseToMerge.Artist.CacheRegion);
|
||||
}
|
||||
|
||||
sw.Stop();
|
||||
sw.Stop();
|
||||
result = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
this.Logger.LogError(ex, $"MergeReleases ReleaseToMerge `{ releaseToMerge }`, ReleaseToMergeInto `{ releaseToMergeInto }`, addAsMedia [{ addAsMedia }]");
|
||||
resultErrors.Add(ex);
|
||||
}
|
||||
return new OperationResult<bool>
|
||||
{
|
||||
Data = result,
|
||||
IsSuccess = result,
|
||||
Errors = resultErrors,
|
||||
OperationTime = sw.ElapsedMilliseconds
|
||||
};
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@ namespace Roadie.Library.Models
|
|||
public Image Thumbnail { get; set; }
|
||||
public DateTime? LastPlayed { get; set; }
|
||||
|
||||
public IEnumerable<string> MissingReleasesForCollection { get; set; }
|
||||
|
||||
public bool IsValid
|
||||
{
|
||||
get
|
||||
|
|
|
@ -18,6 +18,7 @@ using Roadie.Library.MetaData.FileName;
|
|||
using Roadie.Library.MetaData.ID3Tags;
|
||||
using Roadie.Library.MetaData.LastFm;
|
||||
using Roadie.Library.MetaData.MusicBrainz;
|
||||
using Roadie.Library.Models;
|
||||
using Roadie.Library.Processors;
|
||||
using Roadie.Library.Utility;
|
||||
using System;
|
||||
|
@ -359,7 +360,7 @@ namespace Roadie.Api.Services
|
|||
sw.Start();
|
||||
var errors = new List<Exception>();
|
||||
|
||||
var collections = this.DbContext.Collections.Where(x => !x.IsLocked ?? false == false).ToArray();
|
||||
var collections = this.DbContext.Collections.Where(x => x.Status != Statuses.Complete).ToArray();
|
||||
foreach(var collection in collections)
|
||||
{
|
||||
try
|
||||
|
@ -387,6 +388,52 @@ namespace Roadie.Api.Services
|
|||
};
|
||||
}
|
||||
|
||||
public Task<OperationResult<Dictionary<string, List<string>>>> MissingCollectionReleases(ApplicationUser user)
|
||||
{
|
||||
var sw = Stopwatch.StartNew();
|
||||
sw.Start();
|
||||
var missingData = new Dictionary<string, List<string>>();
|
||||
|
||||
foreach (var collection in this.DbContext.Collections.Where(x => x.Status != Statuses.Complete))
|
||||
{
|
||||
var collectionReleases = (from cr in this.DbContext.CollectionReleases
|
||||
where cr.CollectionId == collection.Id
|
||||
select cr);
|
||||
PositionAristRelease[] pars = null;
|
||||
|
||||
try
|
||||
{
|
||||
pars = collection.PositionArtistReleases().ToArray();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
missingData.Add($"CSV Error [{ collection.Name }]", new List<string>{ ex.Message });
|
||||
continue;
|
||||
}
|
||||
foreach (var par in pars)
|
||||
{
|
||||
var cr = collectionReleases.FirstOrDefault(x => x.ListNumber == par.Position);
|
||||
if (cr == null)
|
||||
{
|
||||
// If artist is already in result then add missing album to artist, if not then add artist then add missing album
|
||||
if(!missingData.ContainsKey(par.Artist))
|
||||
{
|
||||
missingData.Add(par.Artist, new List<string>());
|
||||
}
|
||||
var r = $"[{ collection.Name }]:[{ par.Release }]";
|
||||
missingData[par.Artist].Add(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
sw.Stop();
|
||||
return Task.FromResult(new OperationResult<Dictionary<string, List<string>>>
|
||||
{
|
||||
Data = missingData.OrderBy(x => x.Value.Count()).ToDictionary(x => x.Key, x => x.Value),
|
||||
IsSuccess = true,
|
||||
OperationTime = sw.ElapsedMilliseconds
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
public async Task<OperationResult<bool>> ScanCollection(ApplicationUser user, Guid collectionId, bool isReadOnly = false, bool doPurgeFirst = true)
|
||||
{
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
using Roadie.Library;
|
||||
using Roadie.Library.Identity;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Roadie.Api.Services
|
||||
|
@ -29,5 +30,7 @@ namespace Roadie.Api.Services
|
|||
Task<OperationResult<bool>> ScanLibraryFolder(ApplicationUser user, bool isReadOnly = false);
|
||||
|
||||
Task<OperationResult<bool>> ScanRelease(ApplicationUser user, Guid releaseId, bool isReadOnly = false, bool wasDoneForInvalidTrackPlay = false);
|
||||
|
||||
Task<OperationResult<Dictionary<string, List<string>>>> MissingCollectionReleases(ApplicationUser user);
|
||||
}
|
||||
}
|
|
@ -341,7 +341,7 @@ namespace Roadie.Api.Services
|
|||
foreach (var par in pars)
|
||||
{
|
||||
var cr = collectionReleases.FirstOrDefault(x => x.ListNumber == par.Position);
|
||||
// Release is known for Collection CSV, find newRow and update ListNumber
|
||||
// Release is known for Collection CSV
|
||||
if (cr != null)
|
||||
{
|
||||
var parRelease = rows.FirstOrDefault(x => x.DatabaseId == cr.ReleaseId);
|
||||
|
|
|
@ -108,6 +108,19 @@ namespace Roadie.Api.Controllers
|
|||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpPost("missingcollectionreleases")]
|
||||
[ProducesResponseType(200)]
|
||||
public async Task<IActionResult> MissingCollectionReleases()
|
||||
{
|
||||
var result = await this.AdminService.MissingCollectionReleases(await this.UserManager.GetUserAsync(User));
|
||||
if (!result.IsSuccess)
|
||||
{
|
||||
return StatusCode((int)HttpStatusCode.InternalServerError);
|
||||
}
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
|
||||
[HttpPost("delete/release/{id}")]
|
||||
[ProducesResponseType(200)]
|
||||
public async Task<IActionResult> DeleteRelease(Guid id, bool? doDeleteFiles)
|
||||
|
|
Loading…
Reference in a new issue