mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-22 22:14:44 -04:00
New: Update DB to store all releases for an album (#517)
* New: Store all releases for an album and track artists * Add Overview, links and release date by release * Tidy up * Fix metadata refresh errors following musicbrainz edits
This commit is contained in:
@@ -11,7 +11,7 @@ namespace NzbDrone.Core.Music
|
||||
{
|
||||
public interface IRefreshTrackService
|
||||
{
|
||||
void RefreshTrackInfo(Album album, IEnumerable<Track> remoteTracks);
|
||||
void RefreshTrackInfo(Album rg);
|
||||
}
|
||||
|
||||
public class RefreshTrackService : IRefreshTrackService
|
||||
@@ -29,67 +29,65 @@ namespace NzbDrone.Core.Music
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void RefreshTrackInfo(Album album, IEnumerable<Track> remoteTracks)
|
||||
public void RefreshTrackInfo(Album album)
|
||||
{
|
||||
_logger.Info("Starting track info refresh for: {0}", album);
|
||||
var successCount = 0;
|
||||
var failCount = 0;
|
||||
|
||||
album = _albumService.FindById(album.ForeignAlbumId);
|
||||
|
||||
var existingTracks = _trackService.GetTracksByAlbum(album.Id);
|
||||
|
||||
var updateList = new List<Track>();
|
||||
var newList = new List<Track>();
|
||||
var dupeFreeRemoteTracks = remoteTracks.DistinctBy(m => new { m.ForeignTrackId, m.TrackNumber }).ToList();
|
||||
|
||||
foreach (var track in OrderTracks(album, dupeFreeRemoteTracks))
|
||||
foreach (var release in album.AlbumReleases.Value)
|
||||
{
|
||||
try
|
||||
|
||||
var existingTracks = _trackService.GetTracksByForeignReleaseId(release.ForeignReleaseId);
|
||||
|
||||
var updateList = new List<Track>();
|
||||
var newList = new List<Track>();
|
||||
var dupeFreeRemoteTracks = release.Tracks.Value.DistinctBy(m => new { m.ForeignTrackId, m.TrackNumber }).ToList();
|
||||
|
||||
foreach (var track in OrderTracks(dupeFreeRemoteTracks))
|
||||
{
|
||||
var trackToUpdate = GetTrackToUpdate(album, track, existingTracks);
|
||||
|
||||
if (trackToUpdate != null)
|
||||
try
|
||||
{
|
||||
existingTracks.Remove(trackToUpdate);
|
||||
updateList.Add(trackToUpdate);
|
||||
var trackToUpdate = GetTrackToUpdate(track, existingTracks);
|
||||
|
||||
if (trackToUpdate != null)
|
||||
{
|
||||
existingTracks.Remove(trackToUpdate);
|
||||
updateList.Add(trackToUpdate);
|
||||
}
|
||||
else
|
||||
{
|
||||
trackToUpdate = new Track();
|
||||
trackToUpdate.Id = track.Id;
|
||||
newList.Add(trackToUpdate);
|
||||
}
|
||||
|
||||
// TODO: Use object mapper to automatically handle this
|
||||
trackToUpdate.ForeignTrackId = track.ForeignTrackId;
|
||||
trackToUpdate.ForeignRecordingId = track.ForeignRecordingId;
|
||||
trackToUpdate.AlbumReleaseId = release.Id;
|
||||
trackToUpdate.ArtistMetadataId = track.ArtistMetadata.Value.Id;
|
||||
trackToUpdate.TrackNumber = track.TrackNumber;
|
||||
trackToUpdate.AbsoluteTrackNumber = track.AbsoluteTrackNumber;
|
||||
trackToUpdate.Title = track.Title ?? "Unknown";
|
||||
trackToUpdate.Explicit = track.Explicit;
|
||||
trackToUpdate.Duration = track.Duration;
|
||||
trackToUpdate.MediumNumber = track.MediumNumber;
|
||||
|
||||
successCount++;
|
||||
}
|
||||
else
|
||||
catch (Exception e)
|
||||
{
|
||||
trackToUpdate = new Track();
|
||||
trackToUpdate.Monitored = album.Monitored;
|
||||
trackToUpdate.Id = track.Id;
|
||||
newList.Add(trackToUpdate);
|
||||
_logger.Fatal(e, "An error has occurred while updating track info for album {0}. {1}", album, track);
|
||||
failCount++;
|
||||
}
|
||||
|
||||
// TODO: Use object mapper to automatically handle this
|
||||
trackToUpdate.ForeignTrackId = track.ForeignTrackId;
|
||||
trackToUpdate.TrackNumber = track.TrackNumber;
|
||||
trackToUpdate.AbsoluteTrackNumber = track.AbsoluteTrackNumber;
|
||||
trackToUpdate.Title = track.Title ?? "Unknown";
|
||||
trackToUpdate.AlbumId = album.Id;
|
||||
trackToUpdate.ArtistId = album.ArtistId;
|
||||
trackToUpdate.Album = track.Album ?? album;
|
||||
trackToUpdate.Explicit = track.Explicit;
|
||||
trackToUpdate.ArtistId = album.ArtistId;
|
||||
trackToUpdate.Compilation = track.Compilation;
|
||||
trackToUpdate.Duration = track.Duration;
|
||||
trackToUpdate.MediumNumber = track.MediumNumber;
|
||||
|
||||
|
||||
successCount++;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Fatal(e, "An error has occurred while updating track info for album {0}. {1}", album, track);
|
||||
failCount++;
|
||||
}
|
||||
|
||||
_trackService.DeleteMany(existingTracks);
|
||||
_trackService.UpdateMany(updateList);
|
||||
_trackService.InsertMany(newList);
|
||||
}
|
||||
|
||||
_trackService.DeleteMany(existingTracks);
|
||||
_trackService.UpdateMany(updateList);
|
||||
_trackService.InsertMany(newList);
|
||||
|
||||
if (failCount != 0)
|
||||
{
|
||||
_logger.Info("Finished track refresh for album: {0}. Successful: {1} - Failed: {2} ",
|
||||
@@ -101,27 +99,15 @@ namespace NzbDrone.Core.Music
|
||||
}
|
||||
}
|
||||
|
||||
private bool GetMonitoredStatus(Track track, IEnumerable<Album> albums)
|
||||
{
|
||||
if (track.AbsoluteTrackNumber == 0 /*&& track.AlbumId != 1*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var album = albums.SingleOrDefault(c => c.Id == track.AlbumId);
|
||||
return album == null || album.Monitored;
|
||||
}
|
||||
|
||||
|
||||
private Track GetTrackToUpdate(Album album, Track track, List<Track> existingTracks)
|
||||
private Track GetTrackToUpdate(Track track, List<Track> existingTracks)
|
||||
{
|
||||
var result = existingTracks.FirstOrDefault(e => e.ForeignTrackId == track.ForeignTrackId && e.TrackNumber == track.TrackNumber);
|
||||
return result;
|
||||
}
|
||||
|
||||
private IEnumerable<Track> OrderTracks(Album album, List<Track> tracks)
|
||||
private IEnumerable<Track> OrderTracks(List<Track> tracks)
|
||||
{
|
||||
return tracks.OrderBy(e => e.AlbumId).ThenBy(e => e.TrackNumber);
|
||||
return tracks.OrderBy(e => e.AlbumReleaseId).ThenBy(e => e.TrackNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user