Try to migrate audio files in DB instead of deleting/creating entries. fixes #308
This commit is contained in:
@@ -78,7 +78,7 @@ namespace Scanner
|
|||||||
if (_abortScan)
|
if (_abortScan)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!checkFile(trackPath.path, _settings.mediaDirectory))
|
if (!checkFile(trackPath.path))
|
||||||
tracksToRemove.push_back(trackPath.trackId);
|
tracksToRemove.push_back(trackPath.trackId);
|
||||||
|
|
||||||
context.currentStepStats.processedElems++;
|
context.currentStepStats.processedElems++;
|
||||||
@@ -166,7 +166,7 @@ namespace Scanner
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ScanStepRemoveOrphanDbFiles::checkFile(const std::filesystem::path& p, const std::filesystem::path& mediaDirectory)
|
ScanStepRemoveOrphanDbFiles::checkFile(const std::filesystem::path& p)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -179,7 +179,7 @@ namespace Scanner
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PathUtils::isPathInRootPath(p, mediaDirectory, &excludeDirFileName))
|
if (!PathUtils::isPathInRootPath(p, _settings.mediaDirectory, &excludeDirFileName))
|
||||||
{
|
{
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Removing '" << p.string() << "': out of media directory";
|
LMS_LOG(DBUPDATER, INFO) << "Removing '" << p.string() << "': out of media directory";
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -39,6 +39,6 @@ namespace Scanner
|
|||||||
void removeOrphanClusters();
|
void removeOrphanClusters();
|
||||||
void removeOrphanArtists();
|
void removeOrphanArtists();
|
||||||
void removeOrphanReleases();
|
void removeOrphanReleases();
|
||||||
bool checkFile(const std::filesystem::path& p, const std::filesystem::path& mediaDirectory);
|
bool checkFile(const std::filesystem::path& p);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -283,28 +283,48 @@ namespace Scanner
|
|||||||
|
|
||||||
Track::pointer track {Track::findByPath(dbSession, file) };
|
Track::pointer track {Track::findByPath(dbSession, file) };
|
||||||
|
|
||||||
// Skip duplicate track MBID
|
if (trackInfo->trackMBID && (!track || _settings.skipDuplicateMBID))
|
||||||
if (trackInfo->trackMBID && _settings.skipDuplicateMBID)
|
|
||||||
{
|
{
|
||||||
for (Track::pointer otherTrack : Track::findByMBID(dbSession, *trackInfo->trackMBID))
|
std::vector<Track::pointer> duplicateTracks {Track::findByMBID(dbSession, *trackInfo->trackMBID)};
|
||||||
|
|
||||||
|
if (!track)
|
||||||
{
|
{
|
||||||
// Skip ourselves
|
// find for existing MBIDs as the file may have just been moved
|
||||||
if (track && track->getId() == otherTrack->getId())
|
const auto duplicateTracks {Track::findByMBID(dbSession, *trackInfo->trackMBID)};
|
||||||
continue;
|
if (duplicateTracks.size() == 1)
|
||||||
|
|
||||||
// Skip if the other track found does not exists, as it may have been moved to the current scanned file
|
|
||||||
std::error_code ec;
|
|
||||||
if (!std::filesystem::exists(otherTrack->getPath(), ec))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
LMS_LOG(DBUPDATER, DEBUG) << "Skipped '" << file.string() << "' (similar MBID in '" << otherTrack->getPath().string() << "')";
|
|
||||||
// As this MBID already exists, just remove what we just scanned
|
|
||||||
if (track)
|
|
||||||
{
|
{
|
||||||
track.remove();
|
Track::pointer otherTrack {duplicateTracks.front()};
|
||||||
stats.deletions++;
|
std::error_code ec;
|
||||||
|
if (!std::filesystem::exists(otherTrack->getPath(), ec))
|
||||||
|
{
|
||||||
|
LMS_LOG(DBUPDATER, DEBUG) << "Considering track '" << file.string() << "' moved from '" << otherTrack->getPath() << "'";
|
||||||
|
track = otherTrack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip duplicate track MBID
|
||||||
|
if (_settings.skipDuplicateMBID)
|
||||||
|
{
|
||||||
|
for (Track::pointer otherTrack : duplicateTracks)
|
||||||
|
{
|
||||||
|
// Skip ourselves
|
||||||
|
if (track && track->getId() == otherTrack->getId())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Skip if duplicate files no longer in media root: as it will be removed later, we will end up with no file
|
||||||
|
if (!PathUtils::isPathInRootPath(file, _settings.mediaDirectory, &excludeDirFileName))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
LMS_LOG(DBUPDATER, DEBUG) << "Skipped '" << file.string() << "' (similar MBID in '" << otherTrack->getPath().string() << "')";
|
||||||
|
// As this MBID already exists, just remove what we just scanned
|
||||||
|
if (track)
|
||||||
|
{
|
||||||
|
track.remove();
|
||||||
|
stats.deletions++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,7 +333,7 @@ namespace Scanner
|
|||||||
// - the duration is not null
|
// - the duration is not null
|
||||||
if (trackInfo->audioStreams.empty())
|
if (trackInfo->audioStreams.empty())
|
||||||
{
|
{
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Skipped '" << file.string() << "' (no audio stream found)";
|
LMS_LOG(DBUPDATER, DEBUG) << "Skipped '" << file.string() << "' (no audio stream found)";
|
||||||
|
|
||||||
// If Track exists here, delete it!
|
// If Track exists here, delete it!
|
||||||
if (track)
|
if (track)
|
||||||
@@ -326,7 +346,7 @@ namespace Scanner
|
|||||||
}
|
}
|
||||||
if (trackInfo->duration == std::chrono::milliseconds::zero())
|
if (trackInfo->duration == std::chrono::milliseconds::zero())
|
||||||
{
|
{
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Skipped '" << file.string() << "' (duration is 0)";
|
LMS_LOG(DBUPDATER, DEBUG) << "Skipped '" << file.string() << "' (duration is 0)";
|
||||||
|
|
||||||
// If Track exists here, delete it!
|
// If Track exists here, delete it!
|
||||||
if (track)
|
if (track)
|
||||||
@@ -354,12 +374,12 @@ namespace Scanner
|
|||||||
if (!track)
|
if (!track)
|
||||||
{
|
{
|
||||||
track = dbSession.create<Track>(file);
|
track = dbSession.create<Track>(file);
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Adding '" << file.string() << "'";
|
LMS_LOG(DBUPDATER, DEBUG) << "Adding '" << file.string() << "'";
|
||||||
stats.additions++;
|
stats.additions++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Updating '" << file.string() << "'";
|
LMS_LOG(DBUPDATER, DEBUG) << "Updating '" << file.string() << "'";
|
||||||
|
|
||||||
stats.updates++;
|
stats.updates++;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user