Use TrackMBID to check for duplicated music files. fixes #306
This commit is contained in:
@@ -76,7 +76,7 @@
|
|||||||
<message id="Lms.Admin.ScannerController.last-scan-status">Scanned {1} files in {2} on {3} ({4} errors, {5} duplicates)</message>
|
<message id="Lms.Admin.ScannerController.last-scan-status">Scanned {1} files in {2} on {3} ({4} errors, {5} duplicates)</message>
|
||||||
<message id="Lms.Admin.ScannerController.no-audio-track">No audio track</message>
|
<message id="Lms.Admin.ScannerController.no-audio-track">No audio track</message>
|
||||||
<message id="Lms.Admin.ScannerController.same-hash">Duplicated file hash</message>
|
<message id="Lms.Admin.ScannerController.same-hash">Duplicated file hash</message>
|
||||||
<message id="Lms.Admin.ScannerController.same-mbid">Duplicated recording MBID</message>
|
<message id="Lms.Admin.ScannerController.same-mbid">Duplicated track MBID</message>
|
||||||
<message id="Lms.Admin.ScannerController.scan-now">Scan now</message>
|
<message id="Lms.Admin.ScannerController.scan-now">Scan now</message>
|
||||||
<message id="Lms.Admin.ScannerController.scanner">Scanner</message>
|
<message id="Lms.Admin.ScannerController.scanner">Scanner</message>
|
||||||
<message id="Lms.Admin.ScannerController.status">Status</message>
|
<message id="Lms.Admin.ScannerController.status">Status</message>
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
<message id="Lms.Admin.ScannerController.last-scan-status">{1} fichiers scannés en {2} le {3} ({4} erreurs, {5} duplicatas)</message>
|
<message id="Lms.Admin.ScannerController.last-scan-status">{1} fichiers scannés en {2} le {3} ({4} erreurs, {5} duplicatas)</message>
|
||||||
<message id="Lms.Admin.ScannerController.no-audio-track">Pas de piste audio</message>
|
<message id="Lms.Admin.ScannerController.no-audio-track">Pas de piste audio</message>
|
||||||
<message id="Lms.Admin.ScannerController.same-hash">Hash dupliqué</message>
|
<message id="Lms.Admin.ScannerController.same-hash">Hash dupliqué</message>
|
||||||
<message id="Lms.Admin.ScannerController.same-mbid">Recording MBID dupliqué</message>
|
<message id="Lms.Admin.ScannerController.same-mbid">Track MBID dupliqué</message>
|
||||||
<message id="Lms.Admin.ScannerController.scan-now">Lancer un scan</message>
|
<message id="Lms.Admin.ScannerController.scan-now">Lancer un scan</message>
|
||||||
<message id="Lms.Admin.ScannerController.scanner">Scanner</message>
|
<message id="Lms.Admin.ScannerController.scanner">Scanner</message>
|
||||||
<message id="Lms.Admin.ScannerController.status">Statut</message>
|
<message id="Lms.Admin.ScannerController.status">Statut</message>
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
<message id="Lms.Admin.ScannerController.last-scan-status">Scansionati {1} files in {2} su {3} ({4} errori, {5} duplicati)</message>
|
<message id="Lms.Admin.ScannerController.last-scan-status">Scansionati {1} files in {2} su {3} ({4} errori, {5} duplicati)</message>
|
||||||
<message id="Lms.Admin.ScannerController.no-audio-track">Nessuna traccia audio</message>
|
<message id="Lms.Admin.ScannerController.no-audio-track">Nessuna traccia audio</message>
|
||||||
<message id="Lms.Admin.ScannerController.same-hash">Hash doppio</message>
|
<message id="Lms.Admin.ScannerController.same-hash">Hash doppio</message>
|
||||||
<message id="Lms.Admin.ScannerController.same-mbid">Recording MBID doppio</message>
|
<message id="Lms.Admin.ScannerController.same-mbid">Track MBID doppio</message>
|
||||||
<message id="Lms.Admin.ScannerController.scan-now">Scansiona ora</message>
|
<message id="Lms.Admin.ScannerController.scan-now">Scansiona ora</message>
|
||||||
<message id="Lms.Admin.ScannerController.scanner">Scanner</message>
|
<message id="Lms.Admin.ScannerController.scanner">Scanner</message>
|
||||||
<message id="Lms.Admin.ScannerController.status">Stato</message>
|
<message id="Lms.Admin.ScannerController.status">Stato</message>
|
||||||
|
|||||||
@@ -247,12 +247,12 @@ Track::findPaths(Session& session, Range range)
|
|||||||
}
|
}
|
||||||
|
|
||||||
RangeResults<TrackId>
|
RangeResults<TrackId>
|
||||||
Track::findRecordingMBIDDuplicates(Session& session, Range range)
|
Track::findTrackMBIDDuplicates(Session& session, Range range)
|
||||||
{
|
{
|
||||||
session.checkSharedLocked();
|
session.checkSharedLocked();
|
||||||
|
|
||||||
auto query {session.getDboSession().query<TrackId>( "SELECT track.id FROM track WHERE recording_mbid in (SELECT recording_mbid FROM track WHERE recording_mbid <> '' GROUP BY recording_mbid HAVING COUNT (*) > 1)")
|
auto query {session.getDboSession().query<TrackId>( "SELECT track.id FROM track WHERE mbid in (SELECT mbid FROM track WHERE mbid <> '' GROUP BY mbid HAVING COUNT (*) > 1)")
|
||||||
.orderBy("track.release_id,track.disc_number,track.track_number,track.recording_mbid")};
|
.orderBy("track.release_id,track.disc_number,track.track_number,track.mbid")};
|
||||||
|
|
||||||
return Utils::execQuery(query, range);
|
return Utils::execQuery(query, range);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ class Track : public Object<Track, TrackId>
|
|||||||
|
|
||||||
static RangeResults<TrackId> find(Session& session, const FindParameters& parameters);
|
static RangeResults<TrackId> find(Session& session, const FindParameters& parameters);
|
||||||
static RangeResults<PathResult> findPaths(Session& session, Range range);
|
static RangeResults<PathResult> findPaths(Session& session, Range range);
|
||||||
static RangeResults<TrackId> findRecordingMBIDDuplicates(Session& session, Range range);
|
static RangeResults<TrackId> findTrackMBIDDuplicates(Session& session, Range range);
|
||||||
static RangeResults<TrackId> findWithRecordingMBIDAndMissingFeatures(Session& session, Range range);
|
static RangeResults<TrackId> findWithRecordingMBIDAndMissingFeatures(Session& session, Range range);
|
||||||
|
|
||||||
// Accessors
|
// Accessors
|
||||||
|
|||||||
@@ -987,14 +987,14 @@ ScannerService::checkDuplicatedAudioFiles(ScanStats& stats)
|
|||||||
|
|
||||||
auto transaction {_dbSession.createSharedTransaction()};
|
auto transaction {_dbSession.createSharedTransaction()};
|
||||||
|
|
||||||
const RangeResults<TrackId> tracks = Track::findRecordingMBIDDuplicates(_dbSession, Range {});
|
const RangeResults<TrackId> tracks = Track::findTrackMBIDDuplicates(_dbSession, Range {});
|
||||||
for (const TrackId trackId : tracks.results)
|
for (const TrackId trackId : tracks.results)
|
||||||
{
|
{
|
||||||
const Track::pointer track {Track::find(_dbSession, trackId)};
|
const Track::pointer track {Track::find(_dbSession, trackId)};
|
||||||
if (auto recordingMBID {track->getRecordingMBID()})
|
if (auto trackMBID {track->getTrackMBID()})
|
||||||
{
|
{
|
||||||
LMS_LOG(DBUPDATER, INFO) << "Found duplicated recording MBID [" << recordingMBID->getAsString() << "], file: " << track->getPath().string() << " - " << track->getName();
|
LMS_LOG(DBUPDATER, INFO) << "Found duplicated track MBID [" << trackMBID->getAsString() << "], file: " << track->getPath().string() << " - " << track->getName();
|
||||||
stats.duplicates.emplace_back(ScanDuplicate {track->getId(), DuplicateReason::SameRecordingMBID});
|
stats.duplicates.emplace_back(ScanDuplicate {track->getId(), DuplicateReason::SameTrackMBID});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ namespace Scanner
|
|||||||
enum class DuplicateReason
|
enum class DuplicateReason
|
||||||
{
|
{
|
||||||
SameHash,
|
SameHash,
|
||||||
SameRecordingMBID,
|
SameTrackMBID,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ScanError
|
struct ScanError
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ class ReportResource : public Wt::WResource
|
|||||||
|
|
||||||
response.out() << track->getPath().string();
|
response.out() << track->getPath().string();
|
||||||
if (auto mbid {track->getTrackMBID()})
|
if (auto mbid {track->getTrackMBID()})
|
||||||
response.out() << " (Recording MBID " << mbid->getAsString() << ")";
|
response.out() << " (Track MBID " << mbid->getAsString() << ")";
|
||||||
|
|
||||||
response.out() << " - " << duplicateReasonToWString(duplicate.reason).toUTF8() << '\n';
|
response.out() << " - " << duplicateReasonToWString(duplicate.reason).toUTF8() << '\n';
|
||||||
}
|
}
|
||||||
@@ -129,7 +129,7 @@ class ReportResource : public Wt::WResource
|
|||||||
switch (reason)
|
switch (reason)
|
||||||
{
|
{
|
||||||
case Scanner::DuplicateReason::SameHash: return Wt::WString::tr("Lms.Admin.ScannerController.same-hash");
|
case Scanner::DuplicateReason::SameHash: return Wt::WString::tr("Lms.Admin.ScannerController.same-hash");
|
||||||
case Scanner::DuplicateReason::SameRecordingMBID: return Wt::WString::tr("Lms.Admin.ScannerController.same-mbid");
|
case Scanner::DuplicateReason::SameTrackMBID: return Wt::WString::tr("Lms.Admin.ScannerController.same-mbid");
|
||||||
}
|
}
|
||||||
return "?";
|
return "?";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user